首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >1100万参数不能在100个图像样本上拟合的卷积神经网络

1100万参数不能在100个图像样本上拟合的卷积神经网络
EN

Data Science用户
提问于 2018-07-31 12:38:06
回答 1查看 298关注 0票数 3

我一直在尝试在灰度图像上做一些图像增强。我同时使用了像素丢失和感知损失(感知损失使用了在同一数据集上训练的两个类之间的分类器)。

因此,输入到我的网络是一个坏的图像,输出是增强图像,在图像中的边缘更清晰。

我用keras写了代码

代码语言:javascript
复制
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函数

代码语言:javascript
复制
 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算子来获得一个掩码,然后乘以输入和目标图像之间的差值,从而使像素丢失对本应在图像中完成一条不完整行的像素进行惩罚,希望网络能够集中精力完成不完全的边缘,但没有任何改变。

EN

回答 1

Data Science用户

发布于 2018-08-01 13:10:47

在最后一层中使用sigmoid激活,将可能的输出限制在0到1之间。这通常用于二进制分类,但似乎根本没有进行分类。如果您的图像的值被限制在0-1范围内,那么这可能很好。否则,这可能是你的问题的根源。

我建议移除乙状结肠激活在最后的卷积和留下它没有激活。

票数 2
EN
页面原文内容由Data Science提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://datascience.stackexchange.com/questions/36257

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档