我如何使用 keras 创建 3d 输入/3d 输出卷积模型?
how i can create 3d input / 3d output Convolution model with keras?
我有一个小问题我无法解决。
我想将具有完全连接的 MLP 的 CNN 模型实施到我的蛋白质数据库中,该数据库包含 2589 种蛋白质。每个蛋白质有 1287 行和 69 列作为输入,1287 行和 8 列作为输出。实际上有 1287x1 输出,但我对 class 标签使用了一种热编码,以在我的模型中使用交叉熵损失。
我也想要
如果我们考虑图像,我有一个 3d 矩阵 ** X_train = (2589, 1287, 69) 用于输入** 和 y_train =(2589, 1287 , 8) output,我的意思是output也是matrix.
下面是我的keras代码:
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"))
还有其他问题,但我找不到任何解决方案。
非常感谢。
Conv2D
层需要 (batch_size, height, width, channels)
的输入形状。这意味着每个样本都是一个 3D 数组。
您的实际输入是 (2589, 1287, 8)
,这意味着每个样本的形状都是 (1289, 8)
- 二维形状。因此,您应该使用 Conv1D
而不是 Conv2D
.
其次你想要(2589, 1287, 8)
的输出。由于每个样本都是二维形状,Flatten()
输入没有意义 - Flatten()
会将每个样本的形状减少到一维,而您希望每个样本都是二维的。
最后,根据 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)
我有一个小问题我无法解决。
我想将具有完全连接的 MLP 的 CNN 模型实施到我的蛋白质数据库中,该数据库包含 2589 种蛋白质。每个蛋白质有 1287 行和 69 列作为输入,1287 行和 8 列作为输出。实际上有 1287x1 输出,但我对 class 标签使用了一种热编码,以在我的模型中使用交叉熵损失。
我也想要
如果我们考虑图像,我有一个 3d 矩阵 ** X_train = (2589, 1287, 69) 用于输入** 和 y_train =(2589, 1287 , 8) output,我的意思是output也是matrix.
下面是我的keras代码:
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"))
还有其他问题,但我找不到任何解决方案。
非常感谢。
Conv2D
层需要 (batch_size, height, width, channels)
的输入形状。这意味着每个样本都是一个 3D 数组。
您的实际输入是 (2589, 1287, 8)
,这意味着每个样本的形状都是 (1289, 8)
- 二维形状。因此,您应该使用 Conv1D
而不是 Conv2D
.
其次你想要(2589, 1287, 8)
的输出。由于每个样本都是二维形状,Flatten()
输入没有意义 - Flatten()
会将每个样本的形状减少到一维,而您希望每个样本都是二维的。
最后,根据 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)