首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实现超分辨率CNN的麻烦

实现超分辨率CNN的麻烦
EN

Stack Overflow用户
提问于 2017-02-22 10:33:30
回答 1查看 303关注 0票数 1

因此,我目前正在尝试通过修改this repository (最初的超分辨率CNN的tensorflow实现)来实现一个快速的超分辨率CNN (this paper)。

问题是,网络在几个时期后立即达到高损失,然后立即停止学习,无论我重置网络多少次,它总是收敛到完全相同的高损失。如果我试图前馈一幅图像,结果是一幅灰色的阴影。

另一方面,如果我将第一个卷积层直接连接到最终的解卷积层,网络实际上会训练并前馈创建一个新的放大图像。当然,这个网络太浅了,无法真正学习任何真正的功能。

所以我想知道的是,我的第一个卷积层conv1和最后一个层conv8之间到底出了什么问题?

以下是网络层:

代码语言:javascript
复制
# Feature Extraction
conv1 = prelu(tf.nn.conv2d(self.images, self.weights['w1'], strides=[1,1,1,1], padding='SAME') + self.biases['b1'], 1)
# Shrinking
conv2 = prelu(tf.nn.conv2d(conv1, self.weights['w2'], strides=[1,1,1,1], padding='SAME') + self.biases['b2'], 2)
# Mapping
conv3 = prelu(tf.nn.conv2d(conv2, self.weights['w3'], strides=[1,1,1,1], padding='SAME') + self.biases['b3'], 3)
conv4 = prelu(tf.nn.conv2d(conv3, self.weights['w4'], strides=[1,1,1,1], padding='SAME') + self.biases['b4'], 4)
conv5 = prelu(tf.nn.conv2d(conv4, self.weights['w5'], strides=[1,1,1,1], padding='SAME') + self.biases['b5'], 5)
conv6 = prelu(tf.nn.conv2d(conv5, self.weights['w6'], strides=[1,1,1,1], padding='SAME') + self.biases['b6'], 6)
# Expanding
conv7 = prelu(tf.nn.conv2d(conv6, self.weights['w7'], strides=[1,1,1,1], padding='SAME') + self.biases['b7'], 7)
# Deconvolution
deconv_output = [self.batch_size, self.label_size, self.label_size, 1]
deconv_stride = [1,  self.scale, self.scale, self.c_dim]
conv8 = tf.nn.conv2d_transpose(conv7, self.weights['w8'], output_shape=deconv_output, strides=deconv_stride, padding='SAME') + self.biases['b8']

使用它们各自的权重和偏差:

代码语言:javascript
复制
self.weights = {
  'w1': tf.Variable(tf.random_normal([5, 5, 1, 56], stddev=1e-3), name='w1'),
  'w2': tf.Variable(tf.random_normal([1, 1, 56, 12], stddev=1e-3), name='w2'),
  'w3': tf.Variable(tf.random_normal([3, 3, 12, 12], stddev=1e-3), name='w3'),
  'w4': tf.Variable(tf.random_normal([3, 3, 12, 12], stddev=1e-3), name='w4'),
  'w5': tf.Variable(tf.random_normal([3, 3, 12, 12], stddev=1e-3), name='w5'),
  'w6': tf.Variable(tf.random_normal([3, 3, 12, 12], stddev=1e-3), name='w6'),
  'w7': tf.Variable(tf.random_normal([1, 1, 12, 56], stddev=1e-3), name='w7'),
  'w8': tf.Variable(tf.random_normal([9, 9, 1, 56], stddev=1e-3), name='w8')
}
self.biases = {
  'b1': tf.Variable(tf.zeros([56]), name='b1'),
  'b2': tf.Variable(tf.zeros([12]), name='b2'),
  'b3': tf.Variable(tf.zeros([12]), name='b3'),
  'b4': tf.Variable(tf.zeros([12]), name='b4'),
  'b5': tf.Variable(tf.zeros([12]), name='b5'),
  'b6': tf.Variable(tf.zeros([12]), name='b6'),
  'b7': tf.Variable(tf.zeros([56]), name='b7'),
  'b8': tf.Variable(tf.zeros([1]), name='b8')
}

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2017-02-22 13:26:40

发现问题后,我根据标准差为0.001的高斯分布初始化权重。这对最初的SRCNN论文有效,因为它的层数较少,但在我更深的网络中,它导致梯度消失。我最终使用的初始化方案来自this paper on PreLU优化。

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

https://stackoverflow.com/questions/42381661

复制
相关文章

相似问题

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