tensorflow 实现softmax

利用tensorflow 实现多分类问题,数据为mnist

import tensorflow as tf
import numpy as np
from sklearn import datasets
from  tensorflow.examples.tutorials.mnist import input_data

def read_file():
    mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
    train_x, train_y, test_x, test_y = mnist.train.images, mnist.train.labels, mnist.test.images, mnist.test.labels
    print ("downloading")
    return train_x, train_y, test_x, test_y

def weights_biases_placeholder(n_dim, n_classes):
    X = tf.placeholder(tf.float32, [None, n_dim])
    Y = tf.placeholder(tf.float32, [None, n_classes])
    w = tf.Variable(tf.random_normal([n_dim, n_classes], stddev=0.01), name='weights')
    b = tf.Variable(tf.random_normal([n_classes]), name='biases')
    return X, Y, w, b

def forward_pass(X, w, b):
    out = tf.matmul(X, w) + b
    return out

def multiclass_cost(out, Y):
    cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=out, labels=Y))
    return cost

def init():
    return tf.global_variables_initializer()

def train_op(learning_rate, cost):
    op_train = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)
    return op_train

train_x, train_y, test_x, test_y = read_file()
X, Y, w, b = weights_biases_placeholder(train_x.shape[1], train_y.shape[1])
out = forward_pass(X, w, b)
cost = multiclass_cost(out, Y)
learning_rate, epochs = 0.01, 1000
op_train = train_op(learning_rate, cost)
init = init()
loss_trace = []
accuracy_trace = []
with tf.Session() as sess:
    for i in range(epochs):
        sess.run(op_train, feed_dict={X: train_x, Y: train_y})
        loss_ = sess.run(cost, feed_dict={X: train_x, Y: train_y})
        accuracy_ = np.mean(np.argmax(sess.run(out, feed_dict={X: train_x, Y: train_y}), axis=1) == np.argmax(train_y, axis=1))
        if (((i+1)>100) and ((i+1)%100==0)):
            print ("Epoch: ",(i+1)," loss: ", loss_, " accuracy:", accuracy_)
    print ("Final training result----- ", "loss:", loss_, " accuracy: ", accuracy_)
    loss_test = sess.run(cost,feed_dict={X: test_x, Y: test_y})
    test_pred = np.argmax(sess.run(out, feed_dict={X: test_x, Y: test_y}), axis=1)
    accuracy_test = np.mean(test_pred == np.argmax(test_y, axis=1))
    print ("Result on test data-----", "loss:", loss_test, " accuracy:", accuracy_test)