Я обучил авто кодировщик с керасом. Чтобы получить только часть декодера в качестве отдельной модели, я определил следующую функцию:
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)