2016-07-16 5 views
0

Я пытаюсь обучить простую нейронную сеть , которая состоит из:нейронные сети слепой угадывание

  1. Свертка слоя фильтра (5х5) х 8, шаг 2.
  2. Макс пулы 25x25 (изображение имеет своего рода низкое количество деталей)
  3. матирующего выхода в (2x2x8) вектор
  4. классификатор с логистической регрессией

Altogethe r имеет < 1000 весов.

Файл: nn.py

#!/bin/python 
import tensorflow as tf 
import create_batch 

# Prepare data 
batch = create_batch.batch 

x = tf.reshape(batch[0], [-1,100,100,3]) 
y_ = batch[1] 


# CONVOLUTION NETWORK 

# For initialization 
def weight_variable(shape): 
    initial = tf.truncated_normal(shape, stddev=0.3) 
    return tf.Variable(initial) 

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

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

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

# First layer 
W_conv1 = weight_variable([5, 5, 3, 8]) 
b_conv1 = bias_variable([8]) 

x_image = tf.reshape(x, [-1,100,100,3]) 

# First conv1 
h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1) 
h_pool1 = max_pool_25x25(h_conv1) 


# Dense connection layer 
# make data flat 
W_fc1 = weight_variable([2 * 2 * 8, 2]) 
b_fc1 = bias_variable([2]) 

h_pool1_flat = tf.reshape(h_pool1, [-1, 2*2*8]) 
y_conv = tf.nn.softmax(tf.matmul(h_pool1_flat, W_fc1) + b_fc1) 

#Learning 
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y_conv), reduction_indices=[1])) 
train_step = tf.train.GradientDescentOptimizer(0.001).minimize(cross_entropy) 
correct_prediction = tf.equal(tf.argmax(y_conv, 1), tf.argmax(y_, 1)) 
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) 

# Session 
sess = tf.Session() 
sess.run(tf.initialize_all_variables()) 

# Start input enqueue threads. 
coord = tf.train.Coordinator() 
threads = tf.train.start_queue_runners(sess=sess, coord=coord) 

for i in range(200): 
    if i%10 == 0: 
    train_accuracy = accuracy.eval(session=sess) 
    print("step %d, training accuracy %g"%(i, train_accuracy)) 

    train_step.run(session=sess) 

Файл: create_batch.py ​​

#!/bin/python 
import tensorflow as tf 

PATH1 = "../dane/trening/NK/" 
PATH2 = "../dane/trening/K/" 


def create_labeled_image_list(): 

    filenames = [(PATH1 + "nk_%d.png" % i) for i in range(300)] 
    labels = [[1,0] for i in range(300)] 

    filenames += [(PATH2 + "kulki_%d.png" % i) for i in range(300)] 
    labels += [[0,1] for i in range(300)] 

    return filenames, labels 

def read_images_from_disk(input_queue): 
    label = input_queue[1] 
    file_contents = tf.read_file(input_queue[0]) 
    example = tf.image.decode_png(file_contents, channels=3) 
    example.set_shape([100, 100, 3]) 
    example = tf.to_float(example) 
    print ("READ, label:") 
    print(label) 
    return example, label 

# Start 
image_list, label_list = create_labeled_image_list() 

# Create appropriate tensors for naming 
images = tf.convert_to_tensor(image_list, dtype=tf.string) 
labels = tf.convert_to_tensor(label_list, dtype=tf.float32) 

input_queue = tf.train.slice_input_producer([images, labels], 
             shuffle=True) 

image, label = read_images_from_disk(input_queue) 
batch = tf.train.batch([image, label], batch_size=600) 

Я кормлю 100x100 изображения У меня есть два classess 300 изображений каждый. В принципе, случайно запущенная сеть на этапе 0 имеет лучшую точность, чем обученная. Сеть перестает учиться после достижения 0,5 точности (в основном, с переводом монет). Изображения содержат вещь голубого цвета (класс 1) или траву (класс 2).

Я транслирую сеть с использованием всего набора изображений сразу (600 изображений), функция потерь - это кросс-энтропия.

Что я делаю неправильно?

+0

Не могли бы вы разместить весь код? С кодом о том, как вы на самом деле выполняете тренировочный сеанс и т. Д. Также переменные веса инициализируются нечетным образом (они не являются tf.Variable). Честно говоря, я предлагаю вам проверить мой код здесь, я создаю там коннеки и тренирую их: https://github.com/MaxKHK/Udacity_DeepLearningAssignments/blob/master/Assignment4/4_convolutions.ipynb –

+0

@MaximHaytovich целые кодовые сообщения никогда не поощряются стек и фактически viloates условия публикации. – rogue39nin

+0

@david Я имел в виду «сообщение на pastebin и добавление ссылки здесь» или smth, как это - оригинальный вопрос имел слишком мало информации для работы с –

ответ

1

ОК, я нашел исправление, было две ошибки, теперь сеть учится.

  1. Изображения были RGBA, несмотря на то, я объявил их как RGB в ТФ
  2. я не выполнил нормализации изображений для [-1,1] float32.

В tensorflow это должно быть сделано с чем-то вроде этого:

# i use "im" for image 
tf.image.convert_image_dtype(im, dtype=float32) 
im = tf.sub(im, -0.5) 
im = tf.mul(im, 2.0) 

Для всех новичков в ML - подготовить данные с осторожностью!

Спасибо.

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