我正在为序列构建和训练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,我应该遵循一些规则吗?我似乎总是在形状上出现这些错误。 我希望在建立每种类型的模型后,我能理解我的来龙去脉-并非双关语-但这让我发疯了!
我尝试过所有的组合
答案 0 :(得分:0)
您可以阅读#define OFFSETOF(_s, _m) ((size_t)((char*)&((_s *)0)->_m - (char*)0))
和Conv1D
的文档,以了解这些层会根据MaxPooling1D
的值更改输出形状。根据您的情况,您可以通过指定填充来使strides
的输出形状保持相等。 Conv1D
根据定义更改输出形状。使用MaxPooling1D
时,输出形状实际上会小4倍。我建议您仔细阅读文档以弄清楚到底发生了什么,并了解CNN的潜在理论。