主要内容:
2.1 两层神经网络的构建
2.2三层神经网络的构建
2.3重构建模过程
2.4训练模型的保存
2.5训练模型的还原与应用
2.1 两层神经网络的构建
H1_NN=256 #第1隐藏层神经元为256个 H2_NN=64 #第2隐藏层神经元为64个 #输入层 -第1隐藏层参数和偏置项 W1 = tf.Variable(tf.truncated_normal([784,H1_NN], stddev=0.1)) #设置标准差0.1 多层神经网络生成权值时不要用完全随机的方法 b1 = tf.Variable(tf.zeros([H1_NN])) #第1隐藏层 - 第2隐藏层参数和偏置项 W2 = tf.Variable(tf.truncated_normal([H1_NN,H2_NN], stddev=0.1)) b2 = tf.Variable(tf.zeros([H2_NN])) #第2隐藏层 - 输出层参数和偏置项 W3 = tf.Variable(tf.truncated_normal([H2_NN,10], stddev=0.1)) b3 = tf.Variable(tf.zeros([10])) Y1 = tf.nn.relu(tf.matmul(x,W1)+b1) #计算第1隐藏层结果 Y2 = tf.nn.relu(tf.matmul(Y1,W2)+b2) #计算第2隐藏层结果 forward = tf.matmul(Y2, W3) + b3 #计算输出结果 pred = tf.nn.softmax(forward)
这里生成随机数的方式做了改变,用了tf.truncated_normal()函数,从截断的正态分布中输出随机数。stddev是标准差,如果随机数的标准差大于两倍的0.1就会重新生成,使得W1的值相对比较均匀。在多层神经网络中最好还是采用这种随机的方式。
其余代码和单层神经网络一致。完整代码如下:
#Created by:Huang #Time:2019/10/15 0015. import tensorflow as tf import tensorflow.examples.tutorials.mnist.input_data as input_data import matplotlib.pyplot as plt import numpy as np from time import time mnist = input_data.read_data_sets("MNIST_data/",one_hot=True) #定义标签数据占位符 x= tf.placeholder(tf.float32, [None, 784], name='X') #图片大小28*28 y= tf.placeholder(tf.float32, [None, 10], name='Y') H1_NN=256 #第1隐藏层神经元为256个 H2_NN=64 #第2隐藏层神经元为64个 #输入层 -第1隐藏层参数和偏置项 W1 = tf.Variable(tf.truncated_normal([784,H1_NN], stddev=0.1)) #设置标准差0.1 多层神经网络生成权值时不要用完全随机的方法 b1 = tf.Variable(tf.zeros([H1_NN])) #第1隐藏层 - 第2隐藏层参数和偏置项 W2 = tf.Variable(tf.truncated_normal([H1_NN,H2_NN], stddev=0.1)) b2 = tf.Variable(tf.zeros([H2_NN])) #第2隐藏层 - 输出层参数和偏置项 W3 = tf.Variable(tf.truncated_normal([H2_NN,10], stddev=0.1)) b3 = tf.Variable(tf.zeros([10])) Y1 = tf.nn.relu(tf.matmul(x,W1)+b1) #计算第1隐藏层结果 Y2 = tf.nn.relu(tf.matmul(Y1,W2)+b2) #计算第2隐藏层结果 forward = tf.matmul(Y2, W3) + b3 #计算输出结果 pred = tf.nn.softmax(forward) loss_function = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=forward,labels=y)) #注意第一个参数是不做Softmax的前向计算结果 #设置训练参数 train_epochs = 40 #训练轮数 batch_size=50 #单次训练样本数(批次大小) total_batch= int(mnist.train.num_examples/batch_size)#一轮训练有多少批次 display_step=1 #显示粒度 learning_rate=0.01 #学习率 #选择优化器 optimizer = tf.train.AdamOptimizer(learning_rate).minimize(loss_function) #定义准确率 correct_prediction = tf.equal(tf.argmax(y,1),tf.argmax(pred,1)) accuracy = tf.reduce_mean(tf.cast(correct_prediction,tf.float32))#准确率,将布尔值转化为浮点数,并计算平均值 #记录训练开始时间 startTime = time() sess = tf.Session() sess.run(tf.global_variables_initializer()) for epoch in range(train_epochs): for batch in range(total_batch): xs, ys = mnist.train.next_batch(batch_size) # 读取批次数据 sess.run(optimizer,feed_dict={x:xs,y:ys}) # 执行批次训练 #total_batch个批次训练完成后,使用验证数据计算课差与准确率;验证集没有分批 loss,acc = sess.run([loss_function,accuracy],feed_dict={x:mnist.validation.images,y:mnist.validation.labels}) #打印训练过程中的详细信息 if (epoch+1) % display_step == 0: print("Train Epoch:",'%02d' %(epoch+1),"Loss=","{:.9f}".format(loss),"Accuracy=","{:.4f}".format(acc)) duration = time()-startTime #显示运行总时间 print("Train Finished takes:","{:.2f}".format(duration)) #使用测试集评估模型 accu_test = sess.run(accuracy,feed_dict={x:mnist.test.images,y:mnist.test.labels}) print("Test Accuracy:",accu_test)