python - 理解编码为一个热向量的 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 维的输入。
解决方案
这是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 后端时遇到密集层的问题,这需要输入的最后一个维度。因此,您可能可以决定符合此要求的最佳形状。
推荐阅读
- php - 将相似的值放在php Json中的数组中
- r - 获取变量组合矩阵
- typescript - 在带有 p5js 的打字稿中使用具有正确类型的 loadTable
- python - 如何使用python提取以兄弟节点信息为条件的节点信息?
- python - 如何为 np.savetxt 正确添加头,从列表和 np..ndarray 转换为我需要的?
- windows - Windows Task Sheduler + pytesseract + 多处理有什么问题?
- ios - 如何将文本字段中的字符串转换为 Swift 中的 Int?
- javascript - Firebase 模拟器上的 Firebase 权限被拒绝错误
- flutter - Flutter,检测到其他应用程序已启动
- javascript - 如何获取具有值的对象键