为序列无效参数构建/训练一维CNN

时间:2019-05-11 17:03:58

标签: python tensorflow keras

我正在为序列构建和训练CNN,并且已经成功使用RNN,但是遇到了CNN问题。 这是代码,cnn1是第一个(更复杂的模型),试图让一个更简单的代码适合并在两个代码上都出现错误:

形状如下:

xtrain (5206, 19, 4)
ytrain (5206, 4)
xvalid (651, 19, 4)
yvalid (651, 4)
xtest (651, 19, 4)
ytest (651, 4)

我几乎尝试了所有可以想到的内核大小和节点的组合,并尝试了两种不同的模型构建。

    model_cnn1.add(keras.layers.Conv1D(32, (4), activation='relu'))
    model_cnn1.add(keras.layers.MaxPooling1D((4)))
    model_cnn1.add(keras.layers.Conv1D(32, (4), activation='relu'))
    model_cnn1.add(keras.layers.MaxPooling1D((4)))
    model_cnn1.add(keras.layers.Conv1D(32, (4), activation='relu'))
    model_cnn1.add(keras.layers.Dense(4))


    model_cnn2 = keras.models.Sequential([
    keras.layers.Conv1D(100,(4),input_shape=(19,4),activation='relu'),
    keras.layers.MaxPooling1D(4),
    keras.layers.Dense(4)
])


    model_cnn2.compile(loss='mse',optimizer='adam',metrics= ['mse','accuracy'])

    model_cnn2.fit(X_train_tf,y_train_tf,epochs=25)

输出为1/25个纪元,未完全运行,然后在cnn1上我收到了(最后一行)的一些变化:

  

ValueError:负尺寸大小是由1减去4引起的   输入形状为'max_pooling1d_26 / MaxPool'(op:'MaxPool'):   [?,1,1,32]

在cnn2上(简单),我得到了错误(最后一行):

  

InvalidArgumentError:不兼容的形状:[32,4,4]与[32,4]
  [[{{nodemetrics_6 / mse / SquaredDifference}}]]   [Op:__ inference_keras_scratch_graph_6917]

通常,对于内核/节点/ etc,我应该遵循一些规则吗?我似乎总是在形状上出现这些错误。 我希望在建立每种类型的模型后,我能理解我的来龙去脉-并非双关语-但这让我发疯了!

我尝试过所有的组合

1 个答案:

答案 0 :(得分:0)

您可以阅读#define OFFSETOF(_s, _m) ((size_t)((char*)&((_s *)0)->_m - (char*)0)) Conv1D的文档,以了解这些层会根据MaxPooling1D的值更改输出形状。根据您的情况,您可以通过指定填充来使strides的输出形状保持相等。 Conv1D根据定义更改输出形状。使用MaxPooling1D时,输出形状实际上会小4倍。我建议您仔细阅读文档以弄清楚到底发生了什么,并了解CNN的潜在理论。