使用Keras构建用于2D输入的CNN模型

时间:2018-12-06 16:12:23

标签: python keras neural-network conv-neural-network

我知道这种问题已经被问过很多次了,但是我还没有找到令人满意的答案或例子来帮助我寻找所需的解决方案。

我一般来说对keras和数据科学还很陌生,所以如果其中任何一个听起来很明显或错误,请原谅。

我正在尝试创建一个可从2D表(1M +,16)中预测值的CNN模型,该表具有以下结构:

    Date  Name  [... 13 columns ... ]  Result
    1     A     ...                     0.5
    1     A     ...                     0.3
    1     A     ...                    -0.1
    ...
    1     B     ...                     0.4
    1     B     ...                    -0.8
    1     C     ...                     0.7
    ...
    2     A     ...                     0.15
    2     A     ...                     0.38
    ...

我已经尝试了几种方法,但是最接近的是:

def split_sequences(x_, y_ , n_steps):
  X, y = list(), list()
  for i in range(len(x_)):
      # find the end of this pattern
      end_ix = i + n_steps
      # check if we are beyond the dataset
      if end_ix > len(x_):
          break
      # gather input and output parts of the pattern
      seq_x, seq_y = x_[i:end_ix, :], y_[end_ix-1]
      X.append(seq_x)
      y.append(seq_y)
  return array(X), array(y)

n_steps = 5
# X and Y are the training sets, val_X and val_Y are the validation sets
X_, Y_ = split_sequences(X,Y,n_steps)
n_features = X_.shape[2]
val_X_, val_Y_ = split_sequences(val_X,val_Y,n_steps)
print(X_.shape)
print(Y_.shape)
print(val_X_.shape)
print(val_Y_.shape)


->(1804642, 5, 15)
->(1804642,)
->(601545, 5, 15)
->(601545,)


model = Sequential()
model.add(Conv1D(filters=64, kernel_size=2, activation='relu', input_shape(n_steps, n_features)))
model.add(MaxPooling1D(pool_size=2))
model.add(Flatten())
model.add(Dense(150, activation='relu'))
model.add(Dropout(0.3))
model.add(Dense(50, activation='relu'))
model.add(Dense(1))
model.compile(optimizer='adam', loss='mse')
check_point = ModelCheckpoint('model.hdf5',verbose=True, save_best_only=True)
early_stop = EarlyStopping(monitor="val_loss", min_delta=0.001, patience=5, mode="min", verbose=1)

model.fit(X_,Y_,
      validation_data=(val_X_,val_Y_),
      epochs=10,
      verbose=True,
      callbacks=[early_stop,check_point]) 

这段代码运行了,但是最后CNN总是返回一个相同值的数组,我试图更改学习率和其他元参数,但无济于事。网络总是结束返回相同的测试集值。我怀疑这是输入的尺寸错误,但我不确定。

我想要获得的是一个CNN,该CNN会获取数据集的每5行,并通过如下结构进行卷积:

Conv1D()
MaxPooling1D()
BatchNormalization() # I'm not really sure where should i put this kind of layer
Conv1D()
MaxPooling1D()
Flatten()
Dense()
Dropout()
Dense()
Dropout()
Dense(activation)

就像我说过的那样,我对Keras相当陌生(和一般的数据科学一样,就像您可能已经看到的那样),所以我为我刚才传达给您的任何误解和错误表示歉意。最后,我目前正在使用“ MSE”错误,因为这是我发现人们在网络尝试预测时间序列的下一个值的示例中使用的错误。

我也正在考虑将“名称”列用作Conv2D网络的渠道,但是我没有最简单的想法,所以这将是另一个问题。感谢您的帮助和耐心等待。

0 个答案:

没有答案