2017-02-22 7 views
0

저는 원래 초고 해상도 CNN의 tensorflow 구현 인 this repository을 수정하여 빠른 초 고해상도 CNN (this paper)을 구현하려고합니다.초해를 구현하는 데 문제가 있음

문제는 몇 군데 에포크 후에 네트워크가 즉각적으로 높은 손실에 도달했다가 네트워크를 재설정 한 횟수에 상관없이 즉각적으로 학습을 중단한다는 것입니다. 만약 내가 이미지를 피드 포워드하려고한다면 결과는 회색 음영이됩니다.

반면에 첫 번째 컨볼 루션 레이어를 최종 디콘 볼 루션 레이어에 직접 연결하면 실제로 네트워크에서 기차가 보내지고 피드 전달은 새로운 업 스케일 이미지를 만듭니다. 물론이 네트워크는 너무 얕아 실제로 실제 기능을 배우지 못합니다.

그래서 첫 번째 회선 레이어 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에서 사용 끝난 초기화 체계.

관련 문제