我在做一个超分辨率的CNN节目。训练进行得很好,没有过度拟合,但是当我在低分辨率图像上尝试训练网络时,输出图像改变了颜色:
输入图像

输出图像

即使训练时间更长,结果也是一样的。有没有人遇到过类似的问题?
我的第一个想法是将输出激活函数改为从0到1(乙状结肠),而不是ReLu,但没有改进。
下面是我在Keras中实现的网络:
input_img = Input(shape=(None,None,3))
c1 = Convolution2D(64, (3, 3))(input_img)
a1 = Activation('relu')(c1)
c2 = Convolution2D(64, (3, 3))(a1)
a2 = Activation('relu')(c2)
b2 = BatchNormalization()(a2)
c3 = Convolution2D(64, (3, 3))(b2)
a3 = Activation('relu')(c3)
b3 = BatchNormalization()(a3)
c4 = Convolution2D(64, (3, 3), strides=(2,2), padding='same')(b3)
a4 = Activation('relu')(c4)
b4 = BatchNormalization()(a4)
c5 = Convolution2D(64, (3, 3))(b4)
a5 = Activation('relu')(c5)
b5 = BatchNormalization()(a5)
d1 = Conv2DTranspose(64, (3, 3))(b5)
a6 = Activation('relu')(d1)
b6 = BatchNormalization()(a6)
m1 = add([a4, b6])
a7 = Activation('relu')(m1)
d2 = Conv2DTranspose(64, (3, 3), strides=(2,2), padding='same')(a7)
a8 = Activation('relu')(d2)
b8 = BatchNormalization()(a8)
d3 = Conv2DTranspose(64, (3, 3))(b8)
a9 = Activation('relu')(d3)
b9 = BatchNormalization()(a9)
m2 = add([a2, b9])
a10 = Activation('relu')(m2)
d4 = Conv2DTranspose(64, (3, 3))(a10)
a11 = Activation('relu')(d4)
b10 = BatchNormalization()(a11)
d5 = Conv2DTranspose(3, (3, 3))(b10)
a12 = Activation('relu')(d5)
b11 = BatchNormalization()(a12)
m3 = add([input_img, b11])
a13 = Activation('relu')(m3)
out = Convolution2D(3, (5, 5), activation='sigmoid', padding='same') (a13)
model = Model(input_img, out)
model.compile(optimizer='adam', loss='mae')发布于 2017-09-15 07:47:04
在大多数的论文中,人们首先将图像转换成YCrCb格式,并与CNN一起处理Y频道(其中包含所有相关的图像细节)。然后将重建的Y通道与Cr和Cb通道连接起来,这些通道使用传统的双三次插值(或您选择的插值)进行上采样,然后将图像转换为RGB。试试这个,也许效果会更好。
发布于 2020-05-26 16:27:35
我也有类似的问题,所以检查一下你的像素是否在训练数据集的0到1之间,对于丢失函数,它应该是0到255。
发布于 2020-05-26 16:30:51
您可以向丢失函数中添加一个组件,以确保颜色与原始颜色匹配。添加一个丢失组件,将超分辨率图像降至输入图像,然后使用L1或L2丢失来惩罚输入和输出颜色之间的差异。
这个损失组件和您已经使用的损失组件之间的关键区别是,现有的损失将输出与地面真相进行比较,而这将比较输出与输入。
https://stackoverflow.com/questions/46039458
复制相似问题