【问题标题】:2D-CNN model with keras on one-hot-encoding dataset在 one-hot-encoding 数据集上使用 keras 的 2D-CNN 模型
【发布时间】:2019-12-11 11:49:22
【问题描述】:

如何设计一个带有 one-hot-encoded 基因组序列数据的 keras 2D-CNN 模型?

我有近 50,000 个固定长度的基因组序列。我正在尝试为 2 类分类问题建模 2D-CNN。首先,我使用 one-hot-encoding 转换序列。因此,每个样本(序列)变成一个4 x 200 矩阵。从这里我假设从Github 中提供的众多mnist 示例中,我可以将此矩阵视为任何其他图像矩阵。因此,我编写的代码类似于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 做错了什么,但我不确定是什么。有人可以帮忙吗? 对不起,如果这个问题太天真了。

【问题讨论】:

  • 我对这个特定的用例(即基因组数据)不是很熟悉,但在我看来这是一个一维序列。那么使用一维卷积不是更好吗?例如,请参阅this answer

标签: python-2.7 keras one-hot-encoding


【解决方案1】:

错误来自您的第二层 (conv2d_2)。 您收到此错误是因为第一层 (conv2d_1) 产生 形状为[?,2,198,32](批次、行、列、通道)的矩阵,然后您尝试 使用kernel_size=(3, 3)(行、列)padding="valid" (默认参数),发生溢出。

您可以通过将padding="valid" 的默认设置更改为padding="same" 来避免此错误 在 Conv2D 构造函数中,如文档中所示 https://keras.io/layers/convolutional/ 或通过将 kernel_size=(1, 3) (rows, cols) 更改为 conv2d_2。

通过更改填充,您可以使用零填充输入形状(如果需要)。 例如:

  • "VALID" = 没有填充:

       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])
    

在这个例子中:

  • 输入行数 = 2(作为 conv2d_1 输出的行数)
  • kernel_size = 3

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-12
    • 2018-09-11
    • 2021-11-02
    • 2019-10-03
    • 2022-01-15
    • 2019-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多