2017-02-22 122 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優化。