理解编码为一个热向量的 DNA 序列的一维卷积

Posted

技术标签:

【中文标题】理解编码为一个热向量的 DNA 序列的一维卷积【英文标题】:Understanding 1D convolution of DNA sequences encoded as a one hot vector 【发布时间】:2019-04-03 15:21:34 【问题描述】:

我正在尝试使用卷积神经网络对 DNA 序列进行分类任务。 DNA 序列被转换为编码为 one hot 向量的输入数组。例如 - “ACTG”被编码为 [[1,0,0,0], [0,1,0,0], [0,0,0,1], [0,0,1,0]] .我已经像这样对每个样本进行了编码。输入的维度是 number_of_samples * length_of_samples*4。我现在试图了解一维卷积如何在像这样的输入数组上工作,但我无法确定一维卷积的输出是什么样的。非常感谢一些帮助。作为参考,我使用的是斯坦福大学 Kundaje Lab 的this 代码。我无法理解一维卷积如何处理 3 维输入。

【问题讨论】:

【参考方案1】:

这是 Keras Conv1D 模块的文档,其中它们将模型的输入描述为固定长度的固定或可变数量的序列(如示例中给出的 (10,128) :10 个序列,每个长度 128)。

一维卷积可以被认为是遍历二维数据的单个空间或时间维度。这个stack overflow 的回答对各种类型的卷积层给出了非常清晰的解释。

针对您的问题,我制作了一个带有 2 个卷积层和随机数据的玩具程序,我认为您可能会发现它很有用。

data = np.random.random((64,4,4))
labels = np.random.random((64,2))
dataset = tf.data.Dataset.from_tensor_slices((data,labels))
dataset = dataset.batch(2).repeat()
inputs = Input(shape=(4,4))

x = Conv1D(32, 3, activation='relu')(inputs)
x = Flatten()(x)
x = Dense(32, activation='relu')(x)
predictions = Dense(2, activation='softmax')(x)

model = keras.Model(inputs=inputs, outputs=predictions)

model.compile(optimizer='adam',
          loss='categorical_crossentropy',
          metrics=['accuracy'])
model.summary()
model.fit(dataset.make_one_shot_iterator(), epochs=5, steps_per_epoch=100)

结果:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_1 (InputLayer)         (None, 4, 4)              0         
_________________________________________________________________
conv1d (Conv1D)              (None, 2, 32)             416       
_________________________________________________________________
flatten (Flatten)            (None, 64)                0         
_________________________________________________________________
dense (Dense)                (None, 32)                2080      
_________________________________________________________________
dense_1 (Dense)              (None, 2)                 66        
=================================================================
Total params: 2,562
Trainable params: 2,562
Non-trainable params: 0

Epoch 1/5
100/100 [==============================] - 1s 11ms/step - loss: 0.7027 - acc: 0.5450
Epoch 2/5
100/100 [==============================] - 1s 7ms/step - loss: 0.6874 - acc: 0.6000
Epoch 3/5
100/100 [==============================] - 1s 7ms/step - loss: 0.6838 - acc: 0.6200
Epoch 4/5
100/100 [==============================] - 1s 7ms/step - loss: 0.6753 - acc: 0.6100
Epoch 5/5
100/100 [==============================] - 1s 7ms/step - loss: 0.6656 - acc: 0.6300

现在您可以将 4 替换为形状 (no_of_sequences,4) 并以这种方式定义您自己的模型。 但是,如果你想使用类似 (None,4) 的东西,在你的序列是可变的并且没有可以选择的固定长度的情况下,你会在使用 Tensorflow 后端时遇到密集层的问题,这需要输入的最后一个维度。 因此,您可能可以决定符合此要求的最佳形状。

【讨论】:

【参考方案2】:

最近我偶然发现了同样的问题,特别是我想知道,1DConvolution 如何处理具有 n*4 维的 one-hot 编码向量。与核苷酸类型相对应的这 4 个维度会发生什么?在我的模型中,我处理 125 bp 的序列,在第一个 Conv1D 层中,我有 1500 个 kernel_size=10 和 stride=1 的过滤器。这是模型摘要,有助于理解发生了什么:

Layer (type)                 Output Shape    Param #   
=====================================================
input_1 (InputLayer)         [(None, 125,4)]      0         
________________________________________________________
conv1d (Conv1D)              (None, 116, 1500)   61500     

在输入层中,我们正确地看到了批大小维度,然后是序列和 one-hot 维度。然后在Conv1D的输出序列维度缩短(125-10+1)=116,增加了1500通道维度,而one-hot维度消失了!关于核苷酸类型的信息如何存储在卷积中?我们可以从参数的数量中得到这个。 61500=1500*(1+4*10) 从这个等式中,我们看到权重矩阵存储了卷积过滤器每个位点的每个核苷酸的单独权重,因此当我们将其应用于序列时,我们不会丢失任何信息。这就是为什么不要弄乱顺序很重要的原因:先排序,然后是 one-hot 编码。

【讨论】:

以上是关于理解编码为一个热向量的 DNA 序列的一维卷积的主要内容,如果未能解决你的问题,请参考以下文章

Python图像特征的音乐序列生成深度卷积网络,以及网络核心

全连接理解2

使用卷积网络实现计算机图像识别:卷积和max pooling操作介绍

如何重塑我的输入以将其输入一维卷积层以进行序列分类?

如何对 DNA 序列(数据集)进行十进制编码?

使用 NumPy 从 Python 中的位置向量中没有 for 循环的 One-Hot 编码?