Keras:密集层和激活层之间的形状不匹配
Keras: Shape Mismatch between Dense and Activation layers
一直在尝试在 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'))
为什么会有不匹配?
在您的代码中,
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
。
也许它会起作用。
如 @djk47463 的评论所述,您的输出现在每个样本有 919 个值,因为这是网络最后一层中的单元数。要更正此问题,请将最后一层的单位设置为 1,或者添加一个输出维度为 1 的新最终层。
一直在尝试在 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'))
为什么会有不匹配?
在您的代码中,
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
。
也许它会起作用。
如 @djk47463 的评论所述,您的输出现在每个样本有 919 个值,因为这是网络最后一层中的单元数。要更正此问题,请将最后一层的单位设置为 1,或者添加一个输出维度为 1 的新最终层。