我一直在尝试在灰度图像上做一些图像增强。我同时使用了像素丢失和感知损失(感知损失使用了在同一数据集上训练的两个类之间的分类器)。
因此,输入到我的网络是一个坏的图像,输出是增强图像,在图像中的边缘更清晰。
我用keras写了代码
inputs = Input(shape=image_shape)
x = Conv2D(filters=ngf, kernel_size=(7, 7), padding='same')(inputs)
x = BatchNormalization()(x)
x = LeakyReLU(0.2)(x)
n_downsampling = 2
for i in range(n_downsampling):
mult = 2**i
x = Conv2D(filters=ngf*mult*2, kernel_size=(3, 3), strides=2, padding='same')(x)
x = BatchNormalization()(x)
x = LeakyReLU(0.2)(x)
mult = 2**n_downsampling
for i in range(n_blocks_gen):
x = res_block(x, ngf*mult, use_dropout=False)
for i in range(n_downsampling):
mult = 2**(n_downsampling - i)
x = Conv2DTranspose(filters=int(ngf * mult / 2), kernel_size=(3, 3), strides=2, padding='same')(x)
x = BatchNormalization()(x)
x = LeakyReLU(0.2)(x)
#x = ReflectionPadding2D((3, 3))(x)
x = Conv2D(filters=output_nc, kernel_size=(5, 5), padding='same')(x)
x = Conv2D(filters=output_nc, kernel_size=(3, 3))(x)
x = Activation('sigmoid')(x)
outputs = Add()([x, inputs])
#outputs = Lambda(lambda z: K.clip(z, -1, 1))(x)
outputs = Lambda(lambda z: z/2)(outputs)
model = Model(inputs=inputs, outputs=outputs, name='Generator')res_block函数
def res_block(input, filters, kernel_size=(3, 3), strides=(1, 1),
use_dropout=False):
"""
Instanciate a Keras Resnet Block using sequential API.
:param input: Input tensor
:param filters: Number of filters to use
:param kernel_size: Shape of the kernel for the convolution
:param strides: Shape of the strides for the convolution
:param use_dropout: Boolean value to determine the use of dropout
:return: Keras Model
"""
x = Conv2D(filters=filters,
kernel_size=kernel_size,
strides=strides,
padding='same')(input)
x = BatchNormalization()(x)
x = Activation('relu')(x)
if use_dropout:
x = Dropout(0.5)(x)
x = Conv2D(filters=filters,
kernel_size=kernel_size,
strides=strides,
padding='same')(x)
x = BatchNormalization()(x)
merged = Add()([input, x])
return merged知道为什么这个不太合适吗?我一直在寻找其他的损失函数,但我找不到多少。我个人试图通过在增强图像上使用sobel算子来获得一个掩码,然后乘以输入和目标图像之间的差值,从而使像素丢失对本应在图像中完成一条不完整行的像素进行惩罚,希望网络能够集中精力完成不完全的边缘,但没有任何改变。
发布于 2018-08-01 13:10:47
在最后一层中使用sigmoid激活,将可能的输出限制在0到1之间。这通常用于二进制分类,但似乎根本没有进行分类。如果您的图像的值被限制在0-1范围内,那么这可能很好。否则,这可能是你的问题的根源。
我建议移除乙状结肠激活在最后的卷积和留下它没有激活。
https://datascience.stackexchange.com/questions/36257
复制相似问题