Понимание одномерной свертки последовательностей ДНК, закодированных как один горячий вектор - PullRequest
0 голосов
/ 30 октября 2018

Я пытаюсь выполнить задачу классификации с помощью нейронной сети свертки для последовательностей ДНК. Последовательности ДНК преобразуются во входной массив, закодированный как один горячий вектор. Например - «ACTG» кодируется как [[1,0,0,0], [0,1,0,0], [0,0,0,1], [0,0,1,0]] , Я закодировал каждый из образцов таким образом. Размер входных данных будет следующим: number_of_samples * length_of_samples * 4. Сейчас я пытаюсь понять, как 1D Convolution будет работать на входном массиве, подобном этому, но я не могу понять, как будет выглядеть результат 1d Convolution. Был бы очень признателен за помощь. Для справки я использую этот код от Kundaje Lab, Standord University. Я не могу понять, как 1D свертка будет работать для входа 3 измерения.

1 Ответ

0 голосов
/ 30 октября 2018

Вот документация для модуля Keras Conv1D , где они описывают входные данные для модели как фиксированное или переменное число последовательностей фиксированной длины (как указано в примере (10,128): 10 последовательности, каждая длиной 128).

1D свертка может рассматриваться как проходящая через одно пространственное или временное измерение двумерных данных. Этот ответ переполнение стека дает довольно четкое объяснение различных типов Conv Layers.

В связи с вашей проблемой я создал игрушечную программу с двумя слоями конвивов и случайными данными, которые, я думаю, вам могут пригодиться.

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_sequence, 4) и определить свою собственную модель таким образом. Однако, если вы хотите использовать что-то вроде (None, 4), в случае, когда ваши последовательности являются переменными и нет фиксированной длины, которую вы можете выбрать, вы столкнетесь с проблемами со слоем Dense при использовании серверной части Tensorflow, которая требует последнее измерение ввода. Так что вы могли бы выбрать лучшую форму, соответствующую этому требованию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...