当前位置: 首页 > 知识库问答 >
问题:

Keras:致密层和活化层之间的形状不匹配

严瑞
2023-03-14

一直在尝试在Keras中制作神经网络,但遇到了一个问题,即我的一个密集层和激活层之间存在形状不匹配。我错过了一些明显的东西吗?使用Tensorflow后端。

print(x_train.shape)
print(y_train.shape)
(1509, 476, 4)
(1509,)

那么我的模型如下:

###Setup Keras to create a bidirectional convolutional recurrent NN based on DanQ NN
###See https://github.com/uci-cbcl/DanQ
model = Sequential()

model.add(Conv1D(filters=320,
                 kernel_size=26,
                 padding="valid",
                 activation="relu",
                 strides=1, 
                 input_shape=(476, 4)
                ))

model.add(MaxPooling1D(pool_size=13, strides=13))

model.add(Dropout(0.2))

model.add(keras.layers.wrappers.Bidirectional(LSTM(320, return_sequences=True, input_shape=(None, 320))))

model.add(Flatten())

model.add(Dense(input_dim=34*640, units=925))
model.add(Activation('relu'))

model.add(Dense(input_dim=925, units=919))
model.add(Activation('sigmoid'))

print('compiling model')
model.compile(loss='binary_crossentropy', optimizer='rmsprop', class_mode="binary")

print('running at most 60 epochs')

model.fit(x_train, y_train.T, batch_size=100, epochs=60, shuffle=True, verbose=2, validation_split=0.1)

tresults = model.evaluate(x_test, y_test, verbose=2)

print(tresults)

print(model.output_shape)

但我得到以下错误:

ValueError: Error when checking target: expected activation_48 to have shape (None, 919) but got array with shape (1509, 1)

该错误似乎源自使用sigmoid激活输入到第二激活层。例如:

model.add(Dense(input_dim=925, units=919))
model.add(Activation('sigmoid'))

为什么会出现不匹配?

共有2个答案

楚雪松
2023-03-14

在你的代码中,

model.add(Conv1D(filters=320,
             kernel_size=26,
             padding="valid",
             activation="relu",
             strides=1, 
             input_shape=(476, 4)
            ))

尝试在input_shape=(476,4)的位置添加input_dim=4。也许它会起作用。

董和风
2023-03-14

正如@djk47463的评论中提到的,您的输出现在是每个样本有919个值,因为这是网络最后一层中的单元数。若要更正此问题,请将上一层的单位设置为1,或添加输出尺寸为1的新最终层。

 类似资料:
  • 我想知道Keras中的活化层和致密层有什么区别。 由于激活层似乎是一个完全连接的层,并且密集有一个参数来传递激活函数,那么最佳实践是什么? 让我们想象这样一个虚构的网络:输入- 谢谢大家!

  • 我正在开发一个程序,该程序用一个无方向的Conv2D层(跨距=1)替换跨距的Conv2D层(跨距=2),然后在激活层之后添加一个AveragePooling2D层(跨距=2)。换句话说,AveragePooling2D层将减少输出维度,而不是让Conv2D层减少输出维度。 我使用本文中描述的方法将Conv2D层替换为非结构化版本,并在激活后插入averagepoolig2d层。替换Conv2D层效

  • 在keras中。应用程序中,有一个VGG16模型在imagenet上预先培训过。 该模型具有以下结构。 我想用密集层(fc1、fc2和预测)之间的缺失层微调此模型,同时保持模型的所有预训练权重不变。我知道可以使用

  • 我如何有效地检测图像层和生成的形状之间的冲突? 我需要一种快速而全面的方法来检测可旋转图像层和生成的形状之间的碰撞。 到目前为止,我只是将图像分割成一系列包含大多数像素的圆圈,然后根据其他形状测试每个圆圈。为了提高性能,我在每个结构周围创建了周界圆,只测试这些较大的圆,直到两个结构足够接近可以碰撞为止。 真正的问题是,很难将一个可旋转的矩形碰撞成这些图像结构之一。用圆形填充矩形似乎也没有效率。更不

  • 我不明白为什么通道维度不包含在Keras中con2D层的输出维度中。 我有以下型号 我的问题末尾给出了模型摘要。输入层获取宽度为128、高度为128的RGB图像。第一个conv2D层告诉我输出维度是(None、61、61、24)。我使用的内核大小是(8,8),跨步是(2,2),没有填充。值61=下限((128-8 2 x 0)/2 1)和24(内核/过滤器的数量)是有意义的。但为什么维度中不包括不

  • 问题内容: 我正在尝试构建LSTM模型,以解决https://keras.io/layers/recurrent/中的文档示例 以下三行代码(加上注释)直接来自上面的文档链接: ValueError:输入0与层lstm_2不兼容:预期ndim = 3,找到的ndim = 2 在执行第二个model.add()语句之后,但在将模型暴露给我的数据甚至编译它之前,我在上面得到了该错误。 我在这里做错了什