我需要使用顺序模型进行卷积神经网络,用于https://github.com/willfleury/wind-forecasting/blob/master/Forecasting.ipynb中的风预测。我尝试使用此代码,它适用于图像数据,但当我使用相同的示例进行风预测示例时,我收到了错误消息
" ValueError:检查输入时出错:预期conv2d_1_input有4个维度,但得到的数组有形状(1,2634,5)"
我试图在谷歌搜索,我找到了几个答案,但这些答案都没有解决我的问题。而且,我试图使用重塑。
import numpy as np
import keras
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D
from keras.optimizers import SGD
#data base information that I need to use
#number of feautures 3
#number of Cols 5
#number of Rows 6143
# Generate dummy data
x_train = np.random.random((100, 100, 100, 3))
y_train = keras.utils.to_categorical(np.random.randint(10, size=(100, 1)), num_classes=10)
x_test = np.random.random((20, 100, 100, 3))
y_test = keras.utils.to_categorical(np.random.randint(10, size=(20, 1)), num_classes=10)
# x_train = np.reshape(x_train, (x_train_scaled.shape[0], 1,x_train_scaled.shape[1]))
# x_test = np.reshape(x_test_scaled, (x_test_scaled.shape[0],1, x_test_scaled.shape[1]))
#
# y_train = np.reshape(y_train_scaled, (y_train_scaled.shape[0], 3))
# y_test = np.reshape(y_test_scaled, (y_test_scaled.shape[0], 3))
model = Sequential()
# input: 100x100 images with 3 channels -> (100, 100, 3) tensors.
# this applies 32 convolution filters of size 3x3 each.
model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(100, 100, 3)))
model.add(Conv2D(32, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(256, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(10, activation='softmax'))
sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='categorical_crossentropy', optimizer=sgd)
model.fit(x_train, y_train, batch_size=32, epochs=10)
score = model.evaluate(x_test, y_test, batch_size=32)
提前致谢。
答案 0 :(得分:1)
请记住,CNN主要用于处理2D数据(在高度和宽度上至少包含2个维度)。此外,CNN仅应在列的顺序很重要且无法更改的情况下使用。例如,当您更改图像中的列顺序或随机排列列时,将更改整个图像。但是对于典型的ML分类问题(例如Titanic-Survival Prediction)而言,情况并非如此。因此,绝对要确保预测数据的列顺序很重要并且不能更改。如果没有,那么最好不要使用CNN,而要坚持使用基于RNN的标准预测方法。
已经说过,由于在这种情况下要逐行进行,因此实际上并没有第二维。尝试将其传递给一维卷积运算。将其传递给1D转换时,它实际上会增加一个额外的尺寸,并认为张量的高度为1,这类似于[1xn]形状的滤镜,跨过整行(仅在水平方向上)。
希望这会有所帮助。
答案 1 :(得分:0)
Conv2D需要4个维度:sample_size,height,width,channel。因此,如果您的输入只有1个通道(例如灰度图像而不是RGB),则需要在末尾添加另一个维度。
这可以使用内置的numpy expand_dims或reshape来完成。 https://docs.scipy.org/doc/numpy/reference/generated/numpy.expand_dims.html
答案 2 :(得分:0)
我通过使用loss='binary_crossentropy'
和padding='same'
解决了这个问题。而且,我只使用了4列,而不是5列。