了解编码为一个热载体的DNA序列的一维卷积

时间:2018-10-30 14:38:16

标签: python tensorflow keras conv-neural-network

我正在尝试使用卷积神经网络对DNA序列运行分类任务。 DNA序列被转化为编码为一个热载体的输入阵列。例如,“ 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代码。我不明白1D卷积对于3维输入的工作方式。

2 个答案:

答案 0 :(得分:0)

以下是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

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

答案 1 :(得分:0)

最近,我偶然发现了一个相同的问题,我特别想知道1DConvolution如何处理n * 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     

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