керас: передача весов одного плотного слоя между моделями не удалась - PullRequest
0 голосов
/ 02 апреля 2020

Я обучил авто кодировщик с керасом. Чтобы получить только часть декодера в качестве отдельной модели, я определил следующую функцию:

 def get_decoder(model):

    decoder = Sequential()

    decoder.add(Dense(400,name='25'))
    decoder.add(Activation('relu',name='26'))

    num = 2
    decoder.add(Dense(num*num*480,name='27'))
    decoder.add(Activation('relu',name='28'))

    decoder.add(Reshape((num,num,480),name='29'))

    decoder.add(UpSampling2D(name='30'))
    decoder.add(Conv2D(480, (3,3), padding='same',name='31'))
    decoder.add(BatchNormalization(name='32'))
    decoder.add(Activation('relu',name='33'))

    decoder.add(UpSampling2D(name='34'))
    decoder.add(Conv2D(240, (3,3), padding='same',name='35'))
    decoder.add(BatchNormalization(name='36'))
    decoder.add(Activation('relu',name='37'))

    decoder.add(UpSampling2D(name='38'))
    decoder.add(Conv2D(120, (3,3), padding='same',name='39'))
    decoder.add(BatchNormalization(name='40'))
    decoder.add(Activation('relu',name='41'))

    decoder.add(UpSampling2D(name='42'))
    decoder.add(Conv2D(60, (3,3), padding='same',name='43'))
    decoder.add(BatchNormalization(name='44'))
    decoder.add(Activation('relu',name='45'))

    decoder.add(UpSampling2D(name='46'))
    decoder.add(Conv2D(60, (3,3), padding='same',name='47'))
    decoder.add(BatchNormalization(name='48'))
    decoder.add(Activation('relu',name='49'))

    decoder.add(Conv2D(3, (3,3), padding='same',name='50'))
    decoder.add(Activation('linear',name='51'))

    decoder.compile(optimizer='Adam',loss='mse')

    for i in range(25,52):
        decoder.get_layer(str(i)).set_weights(model.get_layer(str(i)).get_weights())

    return decoder

в этой функции, model - это переданный ей автоэнкодер, а decoder - это сеть I хочу как самостоятельный.

все имена слоев являются числовыми строками - первый слой называется «0», а последний - «51». поэтому идея функции заключается в том, чтобы создать точно такую ​​же архитектуру декодирующей части полностью автоматического кодера и просто скопировать значения.

но я получаю следующую ошибку:

You called `set_weights(weights)` on layer "25" with a weight list of length 2, but the layer was expecting 0 weights. Provided weights: [array([[ 0.00556315, -0.09336399,  0.06950409, .....

Слой '25' является первым в декодере, плотный слой (слой '24' является слоем активации сигмоида). Кто-нибудь знает, как я могу решить эту проблему?

Я бегу на бэкэнд-тензор потока (тензор потока вер: 1.14.0, Керас вер: 2.3.1)

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