首页 > 解决方案 > 理解编码为一个热向量的 DNA 序列的一维卷积

问题描述

我正在尝试使用卷积神经网络对 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 的此代码。我无法理解一维卷积如何用于 3 维的输入。

标签: pythontensorflowkerasconv-neural-network

解决方案


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

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

针对您的问题,我制作了一个带有 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 后端时遇到密集层的问题,这需要输入的最后一个维度。因此,您可能可以决定符合此要求的最佳形状。


推荐阅读