2017-02-22 5 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論文ではレイヤーが少ないので、より深いネットワークではグラデーションが消えてしまったために働いていました。私が使用を終了した初期化方式はPreLUの最適化でthis paperから来ています。

関連する問題