我有一个我无法解决的问题。
我想将具有完全连接的MLP的CNN模型实现到我的具有2589个蛋白质的蛋白质数据库中。每种蛋白质具有1287行和69列作为输入,以及1287行和8列作为输出。实际上有1287x1的输出,但是我对类标签使用了一种热编码,以便在模型中使用交叉熵损失。
我也想要
如果我们考虑作为图像,我有一个3d矩阵**输入X_train =(2589,1287,69)**和 y_train =(2589,1287,8)输出,我的意思是输出也是矩阵。
在我的喀拉拉邦代码下方:
model = Sequential()
model.add(Conv2D(64, kernel_size=3, activation="relu", input_shape=(X_train.shape[1],X_train.shape[2])))
model.add(Conv2D(32, kernel_size=3, activation="relu"))
model.add(Flatten())
model.add(Dense((8), activation="softmax"))
但是我遇到有关密集层的错误:
ValueError: Error when checking target: expected dense_1 to have 2 dimensions, but got array with shape (2589, 1287, 8)
好的,我知道Dense应该采用正整数单位(在Keras文档中解释)。但是如何将矩阵输出实现到模型中?
我尝试过:
model.add(Dense((1287,8), activation="softmax"))
和其他东西,但我找不到任何解决方案。
非常感谢。
答案 0 :(得分:2)
Conv2D
层需要输入形状为(batch_size, height, width, channels)
。这意味着每个样本都是一个3D阵列。
您的实际输入为(2589, 1287, 8)
,这意味着每个样本的形状均为(1289, 8)
-2D形状。因此,您应该使用Conv1D
而不是Conv2D
。
其次,您需要输出(2589, 1287, 8)
。由于每个样本都是2D形状,因此Flatten()
输入是没有意义的-Flatten()
会将每个样本的形状减小为1D,而您希望每个样本都是2D。
最后,根据Conv
层的填充,形状可能会根据kernel_size
发生变化。由于您想保留1287
的中间尺寸,因此请使用padding='same'
来保持尺寸不变。
from keras.models import Sequential
from keras.layers import Conv1D, Flatten, Dense
import numpy as np
X_train = np.random.rand(2589, 1287, 69)
y_train = np.random.rand(2589, 1287, 8)
model = Sequential()
model.add(Conv1D(64,
kernel_size=3,
activation="relu",
padding='same',
input_shape=(X_train.shape[1],X_train.shape[2])))
model.add(Conv1D(32,
kernel_size=3,
activation="relu",
padding='same'))
model.add(Dense((8), activation="softmax"))
model.summary()
model.compile(loss='categorical_crossentropy', optimizer='adam')
model.fit(X_train, y_train)