2017-02-22 44 views
0

因此,我目前正试图通过修改this repository(原始超分辨率CNN的张量流实现)来实现快速超分辨率CNN(this paper)。实施超分辨率CNN的难题

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

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

所以我想知道的是我的第一个卷积层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') 
} 

谢谢!

回答

0

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