Keras功能性api:输入与带有conv1d

时间:2019-11-16 18:07:19

标签: python keras conv-neural-network

我有一个大型的工作模型,我想将最后一个密集层更改为卷积层(带有合并和输出)。但是使用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)

我读了thisthis之类的问题,但是我的问题似乎是另一个问题,因为CNN不在网络的第一层,而是在网络的中间。

NSP密集层的输出形状为(None,768)。我试图将转换层中的形状设置为input_shape =(None, 768)input_shape =(None, 768, 1),但这并不能解决问题。有人有主意吗?

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)