如何使用keras创建3d输入/ 3d输出卷积模型?

时间:2018-12-03 20:44:26

标签: 3d keras conv-neural-network keras-layer

我有一个我无法解决的问题。

我想将具有完全连接的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"))

和其他东西,但我找不到任何解决方案。

非常感谢。

1 个答案:

答案 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)