我有一个大型的工作模型,我想将最后一个密集层更改为卷积层(带有合并和输出)。但是使用cnn时出现以下错误:
ValueError:conv1d_21层的输入0与该层不兼容:预期ndim = 3,找到的ndim = 2。收到完整的图形:[无,768]
这是尝试使用cnn之前最后一层的外观:
dense = model.get_layer('NSP-Dense').output
outputs = keras.layers.Dense(len(100), activation='sigmoid')(dense)
这是使用CNN时的样子以及发生错误的位置(在第二行):
dense = model.get_layer('NSP-Dense').output
conv = keras.layers.Conv1D(filters=32, kernel_size=8, activation='relu')(dense)
pooling = keras.layers.MaxPooling1D(pool_size=2)(conv)
flatten = keras.layers.Flatten()(pooling)
mid_dense = keras.layers.Dense(400, activation='relu' )(flatten)
outputs = keras.layers.Dense(len(test_y[0]), activation='sigmoid')(mid_dense)
我读了this和this之类的问题,但是我的问题似乎是另一个问题,因为CNN不在网络的第一层,而是在网络的中间。
NSP密集层的输出形状为(None,768)。我试图将转换层中的形状设置为input_shape =(None, 768)
或input_shape =(None, 768, 1)
,但这并不能解决问题。有人有主意吗?
答案 0 :(得分:1)
我根据您的代码整理了此示例,这似乎避免了该错误。这可以使您指向正确的方向。请注意,“重塑”层实际上增加了一个虚拟的尺寸为1的三维尺寸,以解决Conv1D层的问题。我希望这会有所帮助。
import tensorflow as tf
myInput = tf.keras.layers.Input(shape=(2,))
myOutput = tf.keras.layers.Dense(768,name='NSP-Dense')(myInput)
model = tf.keras.models.Model(myInput,myOutput)
model.summary()
newDense = model.get_layer('NSP-Dense').output
newReshape = tf.keras.layers.Reshape((768,1), name='newReshape')(newDense)
conv = tf.keras.layers.Conv1D(filters=32, kernel_size=8, activation='relu', name='newModelConv1D' )(newReshape)
newModel = tf.keras.models.Model(myInput, conv)
newModel.summary()
import numpy as np
x_train = np.random.random((5,2)) # 5 samples
print('prediction:')
newModel.predict(x_train)