我正在为IR面部训练一个卷积自动编码器,这是我第一次做自动编码器。我有大约1300张训练图像,我没有使用任何调节方法。这是我在800个时代之后得到的: top: test images, bottom: output from autoencoder
这是我的训练曲线:top: training loss, bottom: validation loss。验证丢失使用与训练集分离的测试集图像。最后,训练损失约为0.006,但验证损失为0.009。
我的模型定义如下,输入图像尺寸为110X150,输出图像尺寸为88X120。我只是调整源图像的大小来制作训练标签。通过除以255将每个样品/标签标准化。 至于这个网络的架构,我使用这个类似的RGB图像面部特征布局读了一篇论文,为了我的目的,我将每一层的深度(通道)减半。
所以我的问题是,有什么不对吗?训练曲线对我来说很奇怪。我该如何改进这个自动编码器?更多时代?条例?选择另一个激活功能(我听说漏水ReLU更好)。任何反馈和建议表示赞赏,谢谢!
def create_models():
input_img = Input(shape=(150, 110, 1)) # adapt this if using `channels_first` image data format
x = Conv2D(128, (3, 3), activation='relu', padding='same')(input_img)
x = MaxPooling2D((2, 2), padding='same')(x)
x = Conv2D(128, (3, 3), activation='relu', padding='same')(x)
x = MaxPooling2D((2, 2), padding='same')(x)
x = Conv2D(256, (3, 3), activation='relu')(x)
x = MaxPooling2D((2, 2), padding='same')(x)
x = Conv2D(512, (3, 3), activation='relu')(x)
encoded = MaxPooling2D((2, 2), padding='same')(x)
# at this point the representation is (8, 6, 512) i.e. 128-dimensional
x = Conv2D(512, (3, 3), activation='relu', padding='same')(encoded)
x = UpSampling2D((2, 2))(x)
x = Conv2D(256, (3, 3), activation='relu', padding='same')(x)
x = UpSampling2D((2, 2))(x)
x = Conv2D(128, (3, 3), activation='relu')(x)
x = UpSampling2D((2, 2))(x)
x = Conv2D(128, (3, 3), activation='relu', padding='same')(x)
x = UpSampling2D((2, 2))(x)
decoded = Conv2D(1, (3, 3), activation='tanh', padding='same')(x)
autoencoder = Model(input_img, decoded)
autoencoder.compile(optimizer='adadelta', loss='mean_squared_error')
return autoencoder