我使用 Pytorch 创建了卷积自动编码器,并且正在尝试改进它。
对于编码层,我使用来自
ResNet 18 model
的预训练 torchvision.models.resnet
的前 4 层。
我的中间层只有一个
Convolutional layer
,输入和输出通道大小为 512。对于解码层,我使用 Convolutional layers
,后跟 BatchNorm
和 ReLU
激活函数。
解码层减少每层的通道:
512 -> 256 -> 128 -> 64 -> 32 -> 16 -> 3
,并通过插值增加图像的分辨率,以匹配编码部分相应层的维度。对于最后一层,我使用 sigmoid
而不是 ReLu
。
所有
Convolutional layer
是:
self.up = nn.Sequential(
nn.Conv2d(input_channels, output_channels,
kernel_size=5, stride=1,
padding=2, bias=False),
nn.BatchNorm2d(output_channels),
nn.ReLU()
)
输入图像缩放至
[0, 1]
范围并具有形状 224x224x3
。样本输出是(第一个来自训练集,第二个来自测试集):
有什么想法为什么输出模糊吗?提供的模型已使用
160 epochs
优化器和 ~16000
围绕 Adam
和 lr=0.00005
图像进行训练。我正在考虑在上面给出的 Convolutional
中再添加一层 self.up
层。这会增加模型的复杂性,但我不确定这是否是改进模型的正确方法。
您可能在像素值上使用 L2 或 MSE 损失。截至 2016 年,SOTA 将使用感知损失 - 一种使用 CNN 特征提取器的奇特方式(只需删除最终分类头)并使用特征的 L2/MSE 误差。