2016-03-05 5 views
0

Я пытался подготовить очень простую модель на TensorFlow. Модель принимает один поплавок в качестве входных данных и возвращает вероятность ввода более 0. Я использовал 1 скрытый слой с 10 скрытыми единицами. Полный код показан ниже:Простая сеть на TensorFlow

import tensorflow as tf 
import random 

# Graph construction 

x = tf.placeholder(tf.float32, shape = [None,1]) 
y_ = tf.placeholder(tf.float32, shape = [None,1]) 

W = tf.Variable(tf.random_uniform([1,10],0.,0.1)) 
b = tf.Variable(tf.random_uniform([10],0.,0.1)) 

layer1 = tf.nn.sigmoid(tf.add(tf.matmul(x,W), b)) 

W1 = tf.Variable(tf.random_uniform([10,1],0.,0.1)) 
b1 = tf.Variable(tf.random_uniform([1],0.,0.1)) 

y = tf.nn.sigmoid(tf.add(tf.matmul(layer1,W1),b1)) 

loss = tf.square(y - y_) 

train_step = tf.train.GradientDescentOptimizer(0.01).minimize(loss) 

# Training 

with tf.Session() as sess: 
    sess.run(tf.initialize_all_variables()) 
    N = 1000 
    while N != 0: 
     batch = ([],[]) 
     u = random.uniform(-10.0,+10.0) 
     if u >= 0.: 
      batch[0].append([u]) 
      batch[1].append([1.0]) 
     if u < 0.: 
      batch[0].append([u]) 
      batch[1].append([0.0]) 

     sess.run(train_step, feed_dict = {x : batch[0] , y_ : batch[1]}) 
     N -= 1 

    while(True): 
     u = raw_input("Give an x\n") 
     print sess.run(y, feed_dict = {x : [[u]]}) 

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

ответ

2

Вы вычисляя только одна вероятность, что вы хотите иметь два класса:

  • больше/равно нуля.
  • меньше нуля.

Таким образом, выход сети будет тензором формы два, который будет содержать вероятности каждого класса. Я переименовал y_ в вашем примере, чтобы labels:

labels = tf.placeholder(tf.float32, shape = [None,2]) 

Далее вычислит перекрестную энтропию между результатом сети и ожидаемой классификацией. Классы для положительных чисел будут [1.0, 0], а для отрицательных чисел - [0.0, 1.0]. Функция потерь становится:

cross_entropy = tf.nn.softmax_cross_entropy_with_logits(logits, labels) 
loss = tf.reduce_mean(cross_entropy) 

я переименовал y к logits, как это более описательное имя.

физкультура эта сеть на 10000 шагов дает:

Give an x 
3.0 
[[ 0.96353203 0.03686807]] 
Give an x 
200 
[[ 0.97816485 0.02264325]] 
Give an x 
-20 
[[ 0.12095013 0.87537241]] 

Полный код:

import tensorflow as tf 
import random 

# Graph construction 

x = tf.placeholder(tf.float32, shape = [None,1]) 
labels = tf.placeholder(tf.float32, shape = [None,2]) 

W = tf.Variable(tf.random_uniform([1,10],0.,0.1)) 
b = tf.Variable(tf.random_uniform([10],0.,0.1)) 

layer1 = tf.nn.sigmoid(tf.add(tf.matmul(x,W), b)) 

W1 = tf.Variable(tf.random_uniform([10, 2],0.,0.1)) 
b1 = tf.Variable(tf.random_uniform([1],0.,0.1)) 

logits = tf.nn.sigmoid(tf.add(tf.matmul(layer1,W1),b1)) 

cross_entropy = tf.nn.softmax_cross_entropy_with_logits(logits, labels) 

loss = tf.reduce_mean(cross_entropy) 

train_step = tf.train.GradientDescentOptimizer(0.01).minimize(loss) 

# Training 

with tf.Session() as sess: 
    sess.run(tf.initialize_all_variables()) 
    N = 1000 
    while N != 0: 
     batch = ([],[]) 
     u = random.uniform(-10.0,+10.0) 
     if u >= 0.: 
      batch[0].append([u]) 
      batch[1].append([1.0, 0.0]) 
     if u < 0.: 
      batch[0].append([u]) 
      batch[1].append([0.0, 1.0]) 

     sess.run(train_step, feed_dict = {x : batch[0] , labels : batch[1]}) 

     N -= 1 

    while(True): 
     u = raw_input("Give an x\n") 
     print sess.run(logits, feed_dict = {x : [[u]]}) 
Смежные вопросы