2017-02-22 6 views
0

Так что я сейчас пытаюсь реализовать быстрый супер-разрешающий CNN (this paper), изменяя this repository (реализация тензорного потока оригинального супер-разрешения CNN).Устранение неполадок CNN

Проблема в том, что сеть мгновенно достигает высоких потерь после нескольких эпох, а затем немедленно прекращает обучение, независимо от того, сколько раз я возвращаю сеть, она всегда сходится к тем же самым высоким потерям. Если я попытаюсь отправить изображение вперед, результат станет оттенком серого.

С другой стороны, хотя, если я подключу первый слой свертки непосредственно к окончательному уровню деконволюции, сеть фактически тренируется, а пересылка вперед создает новое увеличенное изображение. Конечно, эта сеть слишком мелкая, чтобы на самом деле изучить любые реальные возможности.

Так что же мне интересно, что происходит с моим первым слоем convolution 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.

Смежные вопросы