import matplotlib as mplimport tensorflow as tffrom tensorflow.examples.tutorials.mnist import input_data# 设置字符集,防止中文乱码mpl.rcParams['font.sans-serif'] = ['SimHei']mpl.rcParams['axes.unicode_minus'] = False# 数据加载mnist = input_data.read_data_sets('data/',one_hot=True)#print(mnist.train.num_examples)#样本数目# 构建神经网络(4层、1 input,2hidden,ioutput)n_uint_hidden_1 = 256n_uint_hidden_2 = 128n_input = 784#输入的一个样本是28*28像素的n_classes = 10#输出类别数目# 定义输入占位符x = tf.placeholder(tf.float32,shape = [None,n_input],name = 'x')y = tf.placeholder(tf.float32,shape = [None,n_classes],name = 'y')# 初始化的w和bweights = { "w1":tf.Variable(tf.random_normal(shape=[n_input,n_uint_hidden_1],stddev = 0.1)), "w2":tf.Variable(tf.random_normal(shape=[n_uint_hidden_1,n_uint_hidden_2],stddev = 0.1)), "w3":tf.Variable(tf.random_normal(shape=[n_uint_hidden_2,n_classes],stddev = 0.1))}biases = { "b1":tf.Variable(tf.random_normal(shape=[n_uint_hidden_1],stddev=0.1)), "b2":tf.Variable(tf.random_normal(shape=[n_uint_hidden_2],stddev=0.1)), "out":tf.Variable(tf.random_normal(shape=[n_classes],stddev=0.1))}# 构建网络def multiplayer_perceotron(_X,_weights,_biases):# 第一层到第二层 input --> hidden1 layer1 = tf.nn.sigmoid(tf.add(tf.matmul(_X,_weights['w1']),_biases['b1']))# 第二层到第三层 hidden1 --> hidden layer2 = tf.nn.sigmoid(tf.add(tf.matmul(layer1,_weights['w2']),_biases['b2'])) return tf.add(tf.matmul(layer2,_weights['w3']),_biases['out'])# 获取预测值act= multiplayer_perceotron(x,weights,biases)# tf.nn.softmax_cross_entropy_with_logits(logits=pred,labels=y)cost = tf.reduce_mean(tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=act,labels=y)))# 使用梯度下降法求解# 使用梯度下降最小化误差# learning_rate:要注意,不要过大,过大可能不收敛,也不要过小,过小收敛速度比较慢train = tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(cost)# 得到预测的类别是哪一个# tf.argmax:对矩阵按行或列计算最大值对应的下标,和numpy中的一样# tf.equal:是对比这两个矩阵或者向量的相等的元素,如果是相等的那就返回Truepred = tf.equal(tf.argmax(act,axis=1),tf.argmax(y,axis=1))# 正确率(True转换为1,False转换为0)acc = tf.reduce_mean(tf.cast(pred,tf.float32))#计算pred的平均值# 初始化init = tf.global_variables_initializer()# 执行模型的训练batch_size = 100 #每次处理的图片数display_step = 4 #每4次迭代打印一次with tf.Session() as sess: sess.run(init)# 模型的保存、持久化 saver = tf.train.Saver() epoch = 0 while True: avg_cost = 0 # 计算出总的批次 total_batch = int(mnist.train.num_examples/batch_size) # 迭代更新 for i in range(total_batch): batch_xs,batch_ys = mnist.train.next_batch(batch_size) feeds = {x:batch_xs,y:batch_ys}# #模型训练 sess.run(train,feed_dict=feeds) avg_cost+=sess.run(cost,feed_dict=feeds) avg_cost = avg_cost/total_batch# 显示误差率和训练集的正确率以此测试集的正确率 if (epoch+1)%display_step == 0: print("批次:%03d 损失函数值:%.9f"%(epoch,avg_cost)) feeds = {x:mnist.train.images,y:mnist.train.labels} train_acc = sess.run(acc,feed_dict=feeds) print("训练集准确率:%.3f"%train_acc) feeds = {x: mnist.test.images, y: mnist.test.labels} test_acc = sess.run(acc, feed_dict=feeds) print("测试集准确率:%.3f" % test_acc) if train_acc>0.9 and test_acc>0.9: saver.save(sess,'./mn/model') break epoch += 1# 模型可视化输出 writer = tf.summary.FileWriter('./mn/graph',tf.get_default_graph()) writer.close()
来源:https://www.cnblogs.com/sun-321/p/11905543.html