使用自动编码器进行图像着色 - 最大压缩点
Image colorization using autoencoder - Maximum compression point
我正在为自动编码器构建模型。我有一个 LAB 颜色 space.
的图像数据集 (256x256)
但我不知道,正确的最大压缩点是多少。我找到了例子,当我有 176 x 176 x 1 (~30976) 时,点就是 22 x 22 x 512 (~247808)。
但这是如何计算的?
我的模特:
model = Sequential()
model.add(Conv2D(32, (3, 3), activation='relu', padding='same', input_shape=(256, 256, 1)))
model.add(MaxPooling2D((2,2)))
model.add(Conv2D(64, (3, 3), activation='relu', padding='same'))
model.add(MaxPooling2D((2,2)))
model.add(Conv2D(128, (3,3), activation='relu', padding='same'))
model.add(MaxPooling2D((2,2)))
model.add(Conv2D(256, (3,3), activation='relu', padding='same'))
model.add(MaxPooling2D((2,2)))
model.add(Conv2D(512, (3,3), activation='relu', padding='same'))
#Decoder
model.add(Conv2D(256, (3,3), activation='relu', padding='same'))
model.add(UpSampling2D((2, 2)))
model.add(Conv2D(128, (3,3), activation='relu', padding='same'))
model.add(UpSampling2D((2, 2)))
model.add(Conv2D(64, (3,3), activation='relu', padding='same'))
model.add(UpSampling2D((2, 2)))
model.add(Conv2D(2, (3, 3), activation='tanh', padding='same'))
model.add(UpSampling2D((2, 2)))
model.compile(optimizer='adam', loss='mse' , metrics=['accuracy'])
model.summary()
弄清楚网络的这些方面与其说是数学,不如说是一门艺术。因此,我们不能在不正确分析数据的情况下定义一个恒定的压缩点,这就是首先使用神经网络的原因。
然而,我们可以直观地考虑每一层发生了什么。例如,在图像着色问题中,最好不要使用太多池化层,因为那样会丢弃大量信息。大小为 2x2、步幅为 2 的最大池化层会丢弃 75% 的输入数据。这在分类中更有用,可以消除不可能的 类。同样,ReLU 会丢弃所有负数据,可能不是手头问题的最佳函数选择。
以下提示可能有助于解决您的具体问题:
减少池化层数。在池化之前,尝试增加可训练层的数量,以便模型(直观地)学习聚合重要信息以避免将其池化。
将激活更改为 elu
、LeakyReLU
等,这不会消除负值,特别是因为输出也需要负值。
也许尝试双线性或双三次上采样来保持结构?我还建议看一下所谓的“魔法”内核 here。就我个人而言,我已经取得了很好的效果,尽管有效地实施它需要时间。
如果您有足够的 GPU space,请增加通道数。这个特殊点没有太多需要考虑的,除了在某些情况下过度拟合。
最好使用 Conv2D
层作为最后一层,以在上采样时补偿伪影。
请记住,这些要点适用于一般用例。研究论文中的模型是不同的情况,并不像您的架构那么简单。所有这些要点可能适用于也可能不适用于特定论文。
我正在为自动编码器构建模型。我有一个 LAB 颜色 space.
的图像数据集 (256x256)但我不知道,正确的最大压缩点是多少。我找到了例子,当我有 176 x 176 x 1 (~30976) 时,点就是 22 x 22 x 512 (~247808)。
但这是如何计算的?
我的模特:
model = Sequential()
model.add(Conv2D(32, (3, 3), activation='relu', padding='same', input_shape=(256, 256, 1)))
model.add(MaxPooling2D((2,2)))
model.add(Conv2D(64, (3, 3), activation='relu', padding='same'))
model.add(MaxPooling2D((2,2)))
model.add(Conv2D(128, (3,3), activation='relu', padding='same'))
model.add(MaxPooling2D((2,2)))
model.add(Conv2D(256, (3,3), activation='relu', padding='same'))
model.add(MaxPooling2D((2,2)))
model.add(Conv2D(512, (3,3), activation='relu', padding='same'))
#Decoder
model.add(Conv2D(256, (3,3), activation='relu', padding='same'))
model.add(UpSampling2D((2, 2)))
model.add(Conv2D(128, (3,3), activation='relu', padding='same'))
model.add(UpSampling2D((2, 2)))
model.add(Conv2D(64, (3,3), activation='relu', padding='same'))
model.add(UpSampling2D((2, 2)))
model.add(Conv2D(2, (3, 3), activation='tanh', padding='same'))
model.add(UpSampling2D((2, 2)))
model.compile(optimizer='adam', loss='mse' , metrics=['accuracy'])
model.summary()
弄清楚网络的这些方面与其说是数学,不如说是一门艺术。因此,我们不能在不正确分析数据的情况下定义一个恒定的压缩点,这就是首先使用神经网络的原因。
然而,我们可以直观地考虑每一层发生了什么。例如,在图像着色问题中,最好不要使用太多池化层,因为那样会丢弃大量信息。大小为 2x2、步幅为 2 的最大池化层会丢弃 75% 的输入数据。这在分类中更有用,可以消除不可能的 类。同样,ReLU 会丢弃所有负数据,可能不是手头问题的最佳函数选择。
以下提示可能有助于解决您的具体问题:
减少池化层数。在池化之前,尝试增加可训练层的数量,以便模型(直观地)学习聚合重要信息以避免将其池化。
将激活更改为
elu
、LeakyReLU
等,这不会消除负值,特别是因为输出也需要负值。也许尝试双线性或双三次上采样来保持结构?我还建议看一下所谓的“魔法”内核 here。就我个人而言,我已经取得了很好的效果,尽管有效地实施它需要时间。
如果您有足够的 GPU space,请增加通道数。这个特殊点没有太多需要考虑的,除了在某些情况下过度拟合。
最好使用
Conv2D
层作为最后一层,以在上采样时补偿伪影。
请记住,这些要点适用于一般用例。研究论文中的模型是不同的情况,并不像您的架构那么简单。所有这些要点可能适用于也可能不适用于特定论文。