Исчезающие размеры в модели с несколькими выходами Keras - PullRequest
0 голосов
/ 12 мая 2018

Когда я пытаюсь обучить автоэнкодеру, описанному ниже, я получаю ошибку, что 'Целевой массив с формой (256, 28, 28, 1) был передан для вывода формы (Нет, 0, 28, 1) при использовании в качестве потери `binary_crossentropy. Эта потеря предполагает, что цели будут иметь ту же форму, что и выходные данные. ' Размеры входа и выхода должны быть равны (28,28,1), при этом 256 - это размер пакета. Запуск .summary () подтверждает, что выходные данные модели декодера верны (28, 28, 1), но, похоже, это меняется, когда кодер и декодер скомпилированы вместе. Есть идеи, что здесь происходит? Три функции вызываются последовательно при создании сети.

def buildEncoder():
    input1 = Input(shape=(28,28,1))
    input2 = Input(shape=(28,28,1))
    merge = concatenate([input1,input2])
    convEncode1 = Conv2D(16, (3,3), activation = 'relu', padding = 'same')(merge)
    maxPoolEncode1 = MaxPooling2D(pool_size=(2, 1))(convEncode1)
    convEncode2 = Conv2D(16, (3,3), activation = 'sigmoid', padding = 'same')(maxPoolEncode1)
    convEncode3 = Conv2D(1, (3,3), activation = 'sigmoid', padding = 'same')(convEncode2)
    model = Model(inputs = [input1,input2], outputs = convEncode3)
    model.compile(loss='binary_crossentropy', optimizer=adam)
    return model

def buildDecoder():
    input1 = Input(shape=(28,28,1))
    upsample1 = UpSampling2D((2,1))(input1)
    convDecode1 = Conv2D(16, (3,3), activation = 'relu', padding = 'same')(upsample1)
    crop1 = Cropping2D(cropping = ((0,28),(0,0)))(convDecode1)
    crop2 = Cropping2D(cropping = ((28,0),(0,0)))(convDecode1)
    convDecode2_1 = Conv2D(16, (3,3), activation = 'relu', padding = 'same')(crop1)
    convDecode3_1 = Conv2D(16, (3,3), activation = 'relu', padding = 'same')(crop2)
    convDecode2_2 = Conv2D(1, (3,3), activation = 'sigmoid', padding = 'same')(convDecode2_1)
    convDecode3_2 = Conv2D(1, (3,3), activation = 'sigmoid', padding = 'same')(convDecode3_1)
    model = Model(inputs=input1, outputs=[convDecode2_2,convDecode3_2])
    model.compile(loss='binary_crossentropy', optimizer=adam)
    return model

def buildAutoencoder():   
    autoInput1 = Input(shape=(28,28,1))
    autoInput2 = Input(shape=(28,28,1))
    encode = encoder([autoInput1,autoInput2])
    decode = decoder(encode)
    model = Model(inputs=[autoInput1,autoInput2], outputs=[decode[0],decode[1]])
    model.compile(loss='binary_crossentropy', optimizer=adam)
    return model

Запуск функции model.summary () подтверждает, что окончательные выходные размеры этого

1 Ответ

0 голосов
/ 12 мая 2018

Похоже, в вашем кодере есть неправильный расчет формы.Вы предполагаете, что декодер получит (Нет, 28, 28, 1), но ваш кодер действительно выводит (Нет, 14, 28, 28, 1).

print(encoder) # Tensor("model_1/conv2d_3/Sigmoid:0", shape=(?, 14, 28, 1), dtype=float32)

Теперь в вашем декодере вы обрезаете и т.д., предполагаяу вас есть (28, 28, 1), который предположительно обрезает его до 0. Модели работают сами по себе, несовпадение происходит при их подключении.

...