我刚开始使用Tensorflow,正在尝试使用具有两个隐藏层和一个输出层的神经网络对MNIST数据集的图像进行分类,输出层使用softmax函数。我使用小批量梯度下降进行优化,并在每个epoch后跟踪最后一个小批量的准确性。
def fetch_batch(batch_index, batch_size, data=train_data, labels=train_labels): low_ind = batch_index*batch_size upp_ind = (batch_index+1)*batch_size if upp_ind < data.shape[0]: return data[low_ind:upp_ind], labels[low_ind:upp_ind] else: return data[low_ind:], labels[low_ind:]n_inputs = 28*28 # MNIST image sizen_hidden_1 = 300n_hidden_2 = 100n_outputs = 10 # ten different classeslearning_rate = 0.01X = tf.placeholder(tf.float32, shape=(None, n_inputs), name="X")y = tf.placeholder(tf.int64, shape=(None), name="y")with tf.name_scope("dnn"): hidden_1 = tf.layers.dense(X, n_hidden_1, name="hidden_1", activation=tf.nn.relu) hidden_2 = tf.layers.dense(hidden_1, n_hidden_2, name="hidden_2", activation=tf.nn.relu) logits = tf.layers.dense(hidden_2, n_outputs, name="outputs")with tf.name_scope("loss"): xentropy = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=y, logits=logits) loss = tf.reduce_mean(xentropy, name="loss")with tf.name_scope("train"): optimizer = tf.train.GradientDescentOptimizer(learning_rate) training_op = optimizer.minimize(loss)with tf.name_scope("eval"): correct = tf.nn.in_top_k(logits, y, 1) accuracy = tf.reduce_mean(tf.cast(correct, tf.float32))init = tf.global_variables_initializer()saver = tf.train.Saver()batch_size = 50n_epochs = 50m = train_data.shape[0]with tf.Session() as sess: init.run() for epoch in range(n_epochs): for batch_index in range(m//batch_size): X_minibatch, y_minibatch = fetch_batch(batch_index, batch_size) #X_batch, y_batch = mnist.train.next_batch(batch_size) sess.run(training_op, feed_dict={X: X_minibatch, y: y_minibatch}) acc_train = accuracy.eval(feed_dict={X: X_minibatch, y: y_minibatch}) acc_val = accuracy.eval(feed_dict={X: mnist.validation.images, y: mnist.validation.labels}) print(epoch, "Train accuracy: ", acc_train, " Val accuracy: ", acc_val)
使用MNIST帮助程序进行训练时,我得到了正确的准确性(即我用于验证准确性的那个),然而我想知道为什么我自己的实现不起作用,因为它总是输出0.0的准确性。我的数据的小批量形状和Tensorflow帮助程序的小批量形状是相同的。提前谢谢!
回答:
你需要对数据进行归一化,例如:
train_data = train_data / 255.0validation_data = validation_data / 255.0
如果你在谷歌搜索”为什么在机器学习中应该归一化数据“,你会发现为什么这很重要。