Керас, неправильно определяющий форму цели - PullRequest
1 голос
/ 11 апреля 2020

У меня есть модель Keras, предназначенная для преобразования изображения (600, 600, 3) в 5 копий изображения (199,199,3).

X имеет форму (сэмплы, 1, 600, 600, 3) и Y имеет форму (образцы, 5, 199, 199, 3).

Моя модель:

inputs = Input(shape=(1, 600, 600, 3))

output1 = Conv3D(20, kernel_size=(1, 2, 2), activation='relu')(inputs)


output2 = Conv3D(40, kernel_size=(1, 3, 3), activation='relu')(output1)
output3 = MaxPooling3D(pool_size=(1, 3, 3))(output2)
output4 = Conv3D(120, kernel_size=(1, 4, 4), activation='relu')(output3)

output5 = Conv3DTranspose(3, kernel_size=(1, 4,4), activation='relu')(output4)
listOutput = concatenate(axis=0, inputs=[output5]*5)

model = Model(inputs=inputs, outputs=listOutput)
model.compile(loss='mse',
              optimizer='adam',
              metrics=['mae'])

Когда я компилирую свою модель, я получаю:

ValueError: Error when checking target: expected concatenate_1 to have shape (1, 199, 199, 3) but got array with shape (5, 199, 199, 3)

Похоже, что Керас неправильно читает форму моей цели, основываясь на форме X. Например, если я изменю X, чтобы ввести форму (2, 600, 600, 3), я get:

ValueError: Error when checking target: expected concatenate_1 to have shape (2, 199, 199, 3) but got array with shape (5, 199, 199, 3).

Keras интерпретирует мою целевую форму на основе X, и она равна (X.shape [1], 199, 199, 3), когда я просто хочу получить выходную форму (5, 199, 199, 3), и я определил Y как массив с формой (образцы, 5, 199, 199, 3). Я понятия не имею, как на самом деле Keras читает мои целевые данные.

Есть ли способ переопределить это вручную или вручную определить форму вывода в Keras? Спасибо.

1 Ответ

2 голосов
/ 11 апреля 2020

Краткий ответ: использование axis=1 в слое конкатенации.

Длинный ответ: Вывод слоя Conv3DTranspose (т. Е. output5 тензор) имеет форма (None, 1, 199, 199, 3). Теперь вы хотите объединить 5 копий этого тензора (что звучит немного странно для меня, поскольку я не знаю приложения, но вы наверняка знаете, что вы делаете!) По второй оси . Поэтому вам нужно использовать axis=1 (а не 0, который будет осью партии / выборки) в качестве оси конкатенации, чтобы получить выходные данные формы (None, 5, 199, 199, 3), то есть 5 копий, соединенных вместе.

...