使用序列模型对非图像数据进行卷积神经网络

时间:2018-06-18 23:25:36

标签: python-3.x tensorflow keras

我需要使用顺序模型进行卷积神经网络,用于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)

提前致谢。

3 个答案:

答案 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列。