我在理解模型行为方面遇到很多麻烦,需要一些帮助来尝试解决它。
假设此自动编码器由所有卷积层组成:
initializer = he_uniform()
#Input
input_tensor_a = Input(shape=(128,128,3))
#Encoder
conv1 = Conv2D(64, kernel_size=7, padding='same', kernel_initializer=initializer)(input_tensor_a)
bn1 = BatchNormalization()(conv1)
relu1 = Activation('relu')(bn1)
conv2 = Conv2D(128, kernel_size=3, strides=2, padding='same', kernel_initializer=initializer)(relu1)
bn2 = BatchNormalization()(conv2)
relu2 = Activation('relu')(bn2)
conv3 = Conv2D(256, kernel_size=3, strides=2, padding='same', kernel_initializer=initializer)(relu2)
bn3 = BatchNormalization()(conv3)
relu3 = Activation('relu')(bn3)
conv4 = Conv2D(512, kernel_size=3, strides=2, padding='same', kernel_initializer=initializer)(relu3)
bn4 = BatchNormalization()(conv4)
relu4 = Activation('relu')(bn4)
#Decoder
ups1 = UpSampling2D(size=(2,2))(relu4)
up_conv1 = Conv2D(256, kernel_size=3, padding='same', kernel_initializer=initializer)(ups1)
bn5 = BatchNormalization()(up_conv1)
relu5 = Activation('relu')(bn5)
ups2 = UpSampling2D(size=(2,2))(relu5)
up_conv2 = Conv2D(128, kernel_size=3, padding='same', kernel_initializer=initializer)(ups2)
bn6 = BatchNormalization()(up_conv2)
relu6 = Activation('relu')(bn6)
ups3 = UpSampling2D(size=(2,2))(relu6)
up_conv3 = Conv2D(64, kernel_size=3, padding='same', kernel_initializer=initializer)(ups3)
bn7 = BatchNormalization()(up_conv3)
relu7 = Activation('relu')(bn7)
up_conv4 = Conv2D(3, kernel_size=7, padding='same', activation='tanh', kernel_initializer=glorot_uniform())(relu7)
optimizer = Adam(0.00001)
#loss is mean_squared_error
我知道这种架构可能不是很好,但是我只想了解它的行为。
以下情况不断发生:
(我没有足够的声誉来直接发布图像)
这是输入图像:
(https://i.imgur.com/d2B9vfJ.png)
这是前5个时期后的图片:
(https://i.imgur.com/WHKjdxo.png)
现在又经过了几个时代:
(https://i.imgur.com/zxoa7zW.png)
如您所见,模型将输出图像越来越远地推向空白图像,直到最后它将成为全白的空白图像。
损失开始于25000左右,并且将非常缓慢地降低直到24000,然后停在那里(这可能是空白图像状态)
我尝试了不同的学习率,切换了bn和relu层,与'mse'相比具有不同的损失函数,无论是否带有kernel_initializer,但没有任何帮助。
所以我认为它与建筑有关,但是我不明白为什么。
如果有人能给我一个很好的解释,我将不胜感激。
答案 0 :(得分:0)
您提到您正在使用的损失是MSE。 您还提到初始损失约为25,000。 我的猜测是模型的输入不在[-1,1]范围内(否则,最大均方误差为4)。 在这种情况下,任何自动编码器都将无法正确学习有意义的表示。 如果确实如此,请尝试将输入重新缩放为与输出相同的比例。