Как я могу создать 3D-модель ввода / вывода Convolution с керасом? - PullRequest
0 голосов
/ 03 декабря 2018

У меня есть небольшой вопрос, который я не могу решить.

Я хочу внедрить модель CNN с полностью подключенным MLP в мою базу данных белков, которая содержит 2589 белков.Каждый белок имеет 1287 строк и 69 столбцов в качестве входных данных и 1287 строк и 8 столбцов в качестве выходных данных.На самом деле был вывод 1287x1, но я использовал одну горячую кодировку для меток классов, чтобы использовать потерю кроссентропии в моей модели.

Также я хочу

, если мы рассматриваем как изображение, у меня есть 3D-матрица **X_train = (2589, 1287, 69) для ввода ** и y_train = (2589, 1287, 8) для вывода , я имею в виду, что вывод также является матрицей.

Ниже моих кодов кератов:

model = Sequential()
model.add(Conv2D(64, kernel_size=3, activation="relu", input_shape=(X_train.shape[1],X_train.shape[2])))
model.add(Conv2D(32, kernel_size=3, activation="relu"))
model.add(Flatten())
model.add(Dense((8), activation="softmax"))

Но я столкнулся с ошибкой о плотном слое:

ValueError: Error when checking target: expected dense_1 to have 2 dimensions, but got array with shape (2589, 1287, 8)

Хорошо, я понимаю, что плотность должна принимать положительное целое число (объяснение в документации Keras.).Но как я могу реализовать матричный вывод для моей модели?

Я пробовал это:

model.add(Dense((1287,8), activation="softmax"))

и что-то еще, но я не мог найти никакого решения.

Большое спасибо.

1 Ответ

0 голосов
/ 04 декабря 2018

Для слоя Conv2D требуется форма ввода (batch_size, height, width, channels).Это означает, что каждый образец является трехмерным массивом.

Ваш фактический ввод (2589, 1287, 8) означает, что каждый образец имеет форму (1289, 8) - двухмерную форму.Из-за этого вы должны использовать Conv1D вместо Conv2D.

Во-вторых, вы хотите вывод (2589, 1287, 8).Поскольку каждый сэмпл имеет 2D-форму, нет смысла Flatten() при вводе - Flatten() будет уменьшать форму каждого сэмпла до 1D, и вы хотите, чтобы каждый сэмпл был 2D.

Наконец, в зависимости отпри заполнении ваших Conv слоев форма может изменяться в зависимости от kernel_sizeПоскольку вы хотите сохранить среднее измерение 1287, используйте padding='same', чтобы сохранить размер таким же.

from keras.models import Sequential
from keras.layers import Conv1D, Flatten, Dense
import numpy as np

X_train = np.random.rand(2589, 1287, 69)
y_train = np.random.rand(2589, 1287, 8)


model = Sequential()
model.add(Conv1D(64, 
                 kernel_size=3, 
                 activation="relu", 
                 padding='same',
                 input_shape=(X_train.shape[1],X_train.shape[2])))
model.add(Conv1D(32, 
                 kernel_size=3, 
                 activation="relu",
                 padding='same'))
model.add(Dense((8), activation="softmax"))

model.summary()
model.compile(loss='categorical_crossentropy', optimizer='adam')
model.fit(X_train, y_train)
...