Как сохранить часть сети? - PullRequest
0 голосов
/ 14 мая 2019

Я сделал авто-кодер, состоящий из кодера и части декодера.Мне удалось отделить кодировщик от всей сети, но у меня есть некоторые проблемы с частью декодера.

Эта часть работает:

encoder = tf.keras.Model(inputs=autoencoder.input, outputs=autoencoder.layers[5].output)

Эта часть, однако, не:

decoder = tf.keras.Model(inputs=autoencoder.layers[6].input, outputs=autoencoder.output)

ошибка:

W0514 14:57: 48.965506 78976 network.py:1619] Входные данные модели должны поступать из tf.keras.Input (таким образом, удерживая метаданные прошлого слоя), они не могут быть выходом предыдущего не входного слоя.Здесь тензор, указанный в качестве входных данных для "model_15", не был входным тензором, он был создан сглаживанием слоя.Обратите внимание, что входные тензоры создаются через tensor = tf.keras.Input(shape).Тензор, вызвавший проблему, был: flatten / Reshape: 0

есть идеи, что попробовать?

спасибо

/ mikael

EDIT: для kruxx

autoencoder = tf.keras.models.Sequential()

# Encoder Layers
autoencoder.add(tf.keras.layers.Conv2D(16, (3, 3), activation='relu',     padding='same', input_shape=x_train_tensor.shape[1:]))
autoencoder.add(tf.keras.layers.MaxPooling2D((2, 2), padding='same'))
autoencoder.add(tf.keras.layers.Conv2D(8, (3, 3), activation='relu',     padding='same'))
autoencoder.add(tf.keras.layers.MaxPooling2D((2, 2), padding='same'))
autoencoder.add(tf.keras.layers.Conv2D(8, (3, 3), strides=(2,2),     activation='relu', padding='same'))

# Flatten encoding for visualization
autoencoder.add(tf.keras.layers.Flatten())
autoencoder.add(tf.keras.layers.Reshape((4, 4, 8)))

# Decoder Layers
autoencoder.add(tf.keras.layers.Conv2D(8, (3, 3), activation='relu', padding='same'))
autoencoder.add(tf.keras.layers.UpSampling2D((2, 2)))
autoencoder.add(tf.keras.layers.Conv2D(8, (3, 3), activation='relu', padding='same'))
autoencoder.add(tf.keras.layers.UpSampling2D((2, 2)))
autoencoder.add(tf.keras.layers.Conv2D(16, (3, 3), activation='relu'))
autoencoder.add(tf.keras.layers.UpSampling2D((2, 2)))
autoencoder.add(tf.keras.layers.Conv2D(1, (3, 3), activation='sigmoid', padding='same'))
> Model: "sequential"
> _________________________________________________________________ 
> Layer (type).................Output Shape..............Param #   
> ================================================================= 
> conv2d (Conv2D)..............(None, 28, 28, 16)........160       
> _________________________________________________________________
> max_pooling2d (MaxPooling2D).(None, 14, 14, 16)........0         
> _________________________________________________________________ 
> conv2d_1 (Conv2D)............(None, 14, 14, 8).........1160      
> _________________________________________________________________
> max_pooling2d_1 (MaxPooling2.(None, 7, 7, 8)...........0         
> _________________________________________________________________ 
> conv2d_2 (Conv2D)............(None, 4, 4, 8)...........584       
> _________________________________________________________________ 
> flatten (Flatten)............(None, 128)...............0         
> _________________________________________________________________ 
> reshape (Reshape)............(None, 4, 4, 8)...........0         
> _________________________________________________________________ 
> conv2d_3 (Conv2D)............(None, 4, 4, 8)...........584       
> _________________________________________________________________ 
> up_sampling2d (UpSampling2D).(None, 8, 8, 8)...........0         
> _________________________________________________________________ 
> conv2d_4 (Conv2D)............(None, 8, 8, 8)...........584       
> _________________________________________________________________ 
> up_sampling2d_1 (UpSampling2 (None, 16, 16, 8).........0         
> _________________________________________________________________ 
> conv2d_5 (Conv2D)............(None, 14, 14, 16)........1168      
> _________________________________________________________________ 
> up_sampling2d_2 (UpSampling2.(None, 28, 28, 16)........0         
> _________________________________________________________________ 
> conv2d_6 (Conv2D)............(None, 28, 28, 1).........145       
> ================================================================= 
> Total params: 4,385 
> Trainable params: 4,385 
> Non-trainable params: 0
> ______________________________________

1 Ответ

0 голосов
/ 14 мая 2019

Я бы подошел к проблеме по-другому:

# Encoder model:
encoder_input = Input(...)

# Encoder Hidden Layers
encoded = Dense()(...)

encoder_model = Model(inputs=[encoder_input], outputs=encoded)

# Decoder model:
decoder_input = Input(...)

# Decoder Hidden Layers

decoded = Dense()(...)

decoder_model = Model(inputs=[decoder_input], outputs=decoded)

И тогда автокодер мог бы быть определен как:

autoencoder = Model(inputs=[encoder_input], output=decoder_model(encoder_model))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...