Модель TensorFlow получает потерю 0

import tensorflow as tf
import numpy as np
def weight(shape):
return tf.Variable(tf.truncated_normal(shape, stddev=0.1))
def bias(shape):
return tf.Variable(tf.constant(0.1, shape=shape))
def output(input,w,b):
return tf.matmul(input,w)+b
x_columns = 33
y_columns = 1
layer1_num = 7
layer2_num = 7
epoch_num = 10
train_num = 1000
batch_size = 100
display_size = 1
x = tf.placeholder(tf.float32,[None,x_columns])
y = tf.placeholder(tf.float32,[None,y_columns])

layer1 = 
tf.nn.relu(output(x,weight([x_columns,layer1_num]),bias([layer1_num])))
layer2=tf.nn.relu
(output(layer1,weight([layer1_num,layer2_num]),bias([layer2_num])))
prediction = output(layer2,weight([layer2_num,y_columns]),bias([y_columns]))

loss=tf.reduce_mean
(tf.nn.softmax_cross_entropy_with_logits(labels=y,logits=prediction))
train_step = tf.train.AdamOptimizer().minimize(loss)

sess = tf.InteractiveSession()
sess.run(tf.global_variables_initializer())
for epoch in range(epoch_num):
   avg_loss = 0.
   for i in range(train_num):
      index = np.random.choice(len(x_train),batch_size)
      x_train_batch = x_train[index]
      y_train_batch = y_train[index]
      _,c = sess.run([train_step,loss],feed_dict=
{x:x_train_batch,y:y_train_batch})
      avg_loss += c/train_num
   if epoch % display_size == 0:
      print("Epoch:{0},Loss:{1}".format(epoch+1,avg_loss))
print("Training Finished")

Моя модель получает Эпоха: 2, Потеря: 0,0 Эпоха: 3, Потеря: 0,0 Эпоха: 4, Потеря: 0,0 Эпоха: 5, Потеря: 0,0 Эпоха: 6, Потеря: 0,0 Эпоха: 7, Потеря: 0,0 Эпоха: 8, Потеря :0.0 Эпоха:9,Потери:0.0 Эпоха:10,Потери:0.0 Обучение завершено

Как я могу справиться с этой проблемой?


person yoshi    schedule 04.05.2017    source источник


Ответы (1)


softmax_cross_entropy_with_logits ожидает метки в форме one-hot, т.е. с формой [batch_size, num_classes] . Здесь у вас есть y_columns = 1, что означает только 1 класс, который обязательно всегда является как предсказанным, так и «наземной правдой» (с точки зрения вашей сети), поэтому ваш вывод всегда правильный, независимо от весов. Следовательно, loss=0.

Я предполагаю, что у вас есть разные классы, и y_train содержит идентификатор метки. Тогда predictions должен иметь вид [batch_size, num_classes], а вместо softmax_cross_entropy_with_logits следует использовать tf.nn.sparse_softmax_cross_entropy_with_logits

person gdelab    schedule 04.05.2017
comment
Большое спасибо! Ваш ответ научил меня, что я допустил ошибку в отношении классов ввода. Я смог предсказать! - person yoshi; 06.05.2017