主要内容:

  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)
MNIST_2NN8.2 Code

相关文章:

  • 2022-01-19
  • 2021-10-14
  • 2023-01-31
  • 2022-12-23
  • 2021-12-16
  • 2022-02-06
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2022-02-09
  • 2021-05-14
  • 2022-12-23
  • 2021-05-08
  • 2021-07-31
  • 2021-12-27
相关资源
相似解决方案