无法实现超级分辨率CNN

时间:2017-02-22 02:33:30

标签: machine-learning tensorflow neural-network

所以我目前正在尝试通过修改this paper(原始超级分辨率CNN的张量流实现)来实现快速超分辨率CNN(this repository)。

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

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

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

这些是网络层:

# 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']

各自的权重和偏见:

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')
}

谢谢!

1 个答案:

答案 0 :(得分:0)

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