【问题标题】:How to save a part of a network?如何保存网络的一部分?
【发布时间】:2019-10-01 12:28:36
【问题描述】:

我制作了一个自动编码器,由编码器和解码器部分组成。 我已经设法将编码器从整个网络中分离出来,但我在解码器部分遇到了一些问题。

这部分有效:

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”的输入的张量不是输入张量,它是由 layer flatten 生成的。 请注意,输入张量是通过 tensor = tf.keras.Input(shape) 实例化的。 导致问题的张量是:flatten/Reshape:0

有什么想法可以尝试吗?

谢谢

/米凯尔

编辑: 对于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
> ______________________________________

【问题讨论】:

  • 你能打印出 autoencoder.layers[6].input 的内容吗?
  • Benjamin Breton:张量("flatten/Reshape:0", shape=(None, 128), dtype=float32)
  • 你能提供你完整的自动编码器模型吗?

标签: tensorflow keras


【解决方案1】:

我会以另一种方式解决问题:

# 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))

【讨论】:

  • 自编码器是一个编码器+一个解码器——所以自编码器的输入与编码器相同——编码器的输出与解码器的输入相同——而自动编码器的输出与编码器相同。解码器与自动编码器的输出相同。我的问题是 keras 不会接受层输出作为另一个模型的输入。
猜你喜欢
  • 2017-03-08
  • 2021-09-25
  • 2011-03-17
  • 1970-01-01
  • 1970-01-01
  • 2017-04-02
  • 1970-01-01
  • 2015-06-25
  • 1970-01-01
相关资源
最近更新 更多