TensorFlow: ¿por qué esta regresión de sofmax no aprende nada?

Mi objective es hacer grandes cosas con TensorFlow, pero estoy tratando de comenzar con poco.

Tengo pequeños cuadrados en escala de grises (con un poco de ruido) y quiero clasificarlos según su color (por ejemplo, 3 categorías: negro, gris, blanco). Escribí una pequeña clase de Python para generar cuadrados y 1-vectores calientes, y modifiqué su ejemplo básico de MNIST para alimentarlos.

Pero no aprenderá nada. Por ejemplo, para 3 categorías, siempre adivina correct33% correcto.

import tensorflow as tf import generate_data.generate_greyscale data_generator = generate_data.generate_greyscale.GenerateGreyScale(28, 28, 3, 0.05) ds = data_generator.generate_data(10000) ds_validation = data_generator.generate_data(500) xs = ds[0] ys = ds[1] num_categories = data_generator.num_categories x = tf.placeholder("float", [None, 28*28]) W = tf.Variable(tf.zeros([28*28, num_categories])) b = tf.Variable(tf.zeros([num_categories])) y = tf.nn.softmax(tf.matmul(x,W) + b) y_ = tf.placeholder("float", [None,num_categories]) cross_entropy = -tf.reduce_sum(y_*tf.log(y)) train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy) init = tf.initialize_all_variables() sess = tf.Session() sess.run(init) # let batch_size = 100 --> therefore there are 100 batches of training data xs = xs.reshape(100, 100, 28*28) # reshape into 100 minibatches of size 100 ys = ys.reshape((100, 100, num_categories)) # reshape into 100 minibatches of size 100 for i in range(100): batch_xs = xs[i] batch_ys = ys[i] sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys}) correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1)) accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float")) xs_validation = ds_validation[0] ys_validation = ds_validation[1] print sess.run(accuracy, feed_dict={x: xs_validation, y_: ys_validation}) 

Mi generador de datos se ve así:

 import numpy as np import random class GenerateGreyScale(): def __init__(self, num_rows, num_cols, num_categories, noise): self.num_rows = num_rows self.num_cols = num_cols self.num_categories = num_categories # set a level of noisiness for the data self.noise = noise def generate_label(self): lab = np.zeros(self.num_categories) lab[random.randint(0, self.num_categories-1)] = 1 return lab def generate_datum(self, lab): i = np.where(lab==1)[0][0] frac = float(1)/(self.num_categories-1) * i arr = np.random.uniform(max(0, frac-self.noise), min(1, frac+self.noise), self.num_rows*self.num_cols) return arr def generate_data(self, num): data_arr = np.zeros((num, self.num_rows*self.num_cols)) label_arr = np.zeros((num, self.num_categories)) for i in range(0, num): label = self.generate_label() datum = self.generate_datum(label) data_arr[i] = datum label_arr[i] = label #data_arr = data_arr.astype(np.float32) #label_arr = label_arr.astype(np.float32) return data_arr, label_arr