2016-12-30 2 views
3

Я использую тензорный поток для обработки цветных изображений со сверточной нейронной сетью. Ниже приведен фрагмент кода.Tensorflow 3-канальный порядок цветных входов

Мой код работает, поэтому я думаю, что правильно получил количество каналов. Мой вопрос: как правильно упорядочить данные rgb? Является ли он в форме rgbrgbrgb или это будет rrrgggbbb? В настоящее время я использую последнее. Благодарю. Любая помощь будет оценена по достоинству.

c_output = 2 
    c_input = 784 * 3 

    def weight_variable(shape): 
     initial = tf.truncated_normal(shape, stddev=0.1) 
     return tf.Variable(initial) 

    def bias_variable(shape): 
     initial = tf.constant(0.1, shape=shape) 
     return tf.Variable(initial) 

    def conv2d(x, W): 
     return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME') 

    def max_pool_2x2(x): 
     return tf.nn.max_pool(x, ksize=[1, 2, 2, 1], 
           strides=[1, 2, 2, 1], padding='SAME') 

    self.c_x = tf.placeholder(tf.float32, shape=[None, c_input]) 
    self.c_y_ = tf.placeholder(tf.float32, shape=[None, c_output]) 

    self.W_conv1 = weight_variable([5, 5, 3, 32]) 
    self.b_conv1 = bias_variable([32]) 
    self.x_image = tf.reshape(self.c_x, [-1, 28, 28 , 3]) 
    self.h_conv1 = tf.nn.relu(conv2d(self.x_image, self.W_conv1) + self.b_conv1) 
    self.h_pool1 = max_pool_2x2(self.h_conv1) 

    self.W_conv2 = weight_variable([5, 5, 32, 64]) 
    self.b_conv2 = bias_variable([64]) 

    self.h_conv2 = tf.nn.relu(conv2d(self.h_pool1, self.W_conv2) + self.b_conv2) 
    self.h_pool2 = max_pool_2x2(self.h_conv2) 

    self.W_fc1 = weight_variable([7 * 7 * 64, 1024]) 
    self.b_fc1 = bias_variable([1024]) 

    self.h_pool2_flat = tf.reshape(self.h_pool2, [-1, 7 * 7 * 64 ]) 
    self.h_fc1 = tf.nn.relu(tf.matmul(self.h_pool2_flat, self.W_fc1) + self.b_fc1) 

    self.keep_prob = tf.placeholder(tf.float32) 
    self.h_fc1_drop = tf.nn.dropout(self.h_fc1, self.keep_prob) 

    self.W_fc2 = weight_variable([1024, c_output]) 
    self.b_fc2 = bias_variable([c_output]) 

    self.y_conv = tf.matmul(self.h_fc1_drop, self.W_fc2) + self.b_fc2 

    self.c_cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(self.y_conv, self.c_y_)) 
    self.c_train_step = tf.train.AdamOptimizer(1e-4).minimize(self.c_cross_entropy) 
    self.c_correct_prediction = tf.equal(tf.argmax(self.y_conv, 1), tf.argmax(self.c_y_, 1)) 
    self.c_accuracy = tf.reduce_mean(tf.cast(self.c_correct_prediction, tf.float32)) 

ответ

2

TL; DR: С вашей текущей программы, расположение в памяти данных должны быть должны быть RGBRGBRGBRGB ...

Я предполагаю, что от этой линии, что вы передаете в RGB изображениях с 28x28 пикселей:

self.x_image = tf.reshape(self.c_x, [-1, 28, 28, 3]) 

Мы можем назвать размеры self.x_image являются «партии», «высота», «ширина» и «канал». Это соответствует формату данных по умолчанию для tf.nn.conv_2d() и tf.nn.max_pool().

В TensorFlow представление в виде тензора тензора row-major order (или «C», поскольку это представление массивов на языке программирования C). По существу, это означает, что крайний правый размер является самым быстрым меняется, и элементы тензора упакованы вместе в памяти в следующем порядке (где ? обозначает неизвестного размера партии, минус 1):

[0, 0, 0, 0] 
[0, 0, 0, 1] 
[0, 0, 0, 2] 
[0, 0, 1, 0] 
... 
[?, 27, 27, 1] 
[?, 27, 27, 2] 

Поэтому ваш вероятно, не правильно интерпретирует данные изображения. Есть как минимум два варианта:

  1. Переформуйте ваши данные, чтобы соответствовать его истинному порядку ("партии", "каналы", "высота", "ширина"):

    self.x_image = tf.reshape(self.c_x, [-1, 3, 28, 28]) 
    

    В самом деле, этот формат иногда более эффективен для сверток. Вы можете указать tf.nn.conv2d() и tf.nn.max_pool(), чтобы использовать его без транспонирования, передав необязательный аргумент data_format="NCHW", но вам также нужно будет изменить форму ваших переменных смещения, чтобы они соответствовали.

  2. Транспонирование данных изображения в соответствии с результатом вашей программы с помощью tf.transpose():

    self.x_image = tf.transpose(tf.reshape(self.c_x, [-1, 3, 28, 28]), [0, 2, 3, 1]) 
    
+0

Я также пытаюсь форматировать некоторые (без изображения) данные для обучения с использованием архитектуры на основе изображения , Вы указываете «пакет», «высота», «ширина», «канал», но я немного смущен тем, что содержат эти измерения. Мое предположение было бы , , , , , , , , , , , > и т. д. Это правильно? – mrwheet

+0

Почти: элемент '[i, j, k, l]' в четырехмерном тензоре в формате NHWC - это пиксель для пакетного элемента 'i', y-координата' j', x-координата 'k' и канал 'L'. – mrry

+0

О, конечно ... Просто мои координаты менялись. Благодаря! – mrwheet

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