如何使用一键编码的基因组序列数据设计Keras 2D-CNN模型?
我有将近50,000个固定长度的基因组序列。我正在尝试为2类分类问题建模2D-CNN。首先,我使用单热编码转换了序列。因此,每个样本(序列)成为4 x 200
矩阵。从这里开始,我从mnist
中可用的众多Github
例子中假设,我可以将此矩阵视为任何其他图像矩阵。因此,我编写了类似于mnist
示例中给出的代码。这是我的代码
X_train = sample_matrices[0:N1]
X_valid = sample_matrices[N1:N2]
X_test = sample_matrices[N2:num_sample]
X_train = X_train.reshape(X_train.shape[0], row, col, 1)
X_test = X_test.reshape(X_test.shape[0], row, col, 1)
X_valid = X_valid.reshape(X_valid.shape[0], row, col, 1)
input_shape = (row, col, 1)
model = Sequential()
model.add(Conv2D(32, kernel_size = (3, 3),
activation = 'relu',
input_shape = input_shape))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(num_classes, activation='softmax'))
此处row = 4, col = 200
我收到一条错误消息
ValueError: Negative dimension size caused by subtracting 3 from 2 for 'conv2d_2/convolution' (op: 'Conv2D') with input shapes: [?,2,198,32], [3,3,32,64].
我几乎可以肯定我在input_shape
上做错了什么,但是我不确定是什么。谁能帮忙吗?
很抱歉,这个问题太天真了。
答案 0 :(得分:1)
错误来自您的第二层(conv2d_2)。
您收到此错误的原因是第一层(conv2d_1)产生了
形状为[?,2,198,32]
(批次,行,列,通道)的矩阵,您可以尝试
使用kernel_size=(3, 3)
(行,列)padding="valid"
(默认参数),则会发生溢出。
您可以通过将padding="valid"
的默认设置更改为padding="same"
来避免此错误
在https://keras.io/layers/convolutional/文档中所示的Conv2D构造函数中
或更改conv2d_2的kernel_size=(1, 3)
(行,列)。
通过更改填充,您可以将输入形状填充为零(如有必要)。 例如:
“有效” =不填充:
Inputs: 1 2 ? <-- Overflow
|_______|
Output rows shape: ceil((rows_in - kernel_size[0] + 1) / strides[0]) = 0
Output cols shape: ceil((cols_in - kernel_size[1] + 1) / strides[1])
“ SAME” =填充为零:
| pad
Inputs: 1 2| 0 0
|_______|
|_______|
Output rows shape: ceil(rows_in / strides[0]) = 2
Output cols shape: ceil(cols_in / strides[1])
在此示例中: