目录
测试结果:根据测试集和验证集的验证,训练好的模型识别率可以达到96%
代码块
# -*- coding:utf-8 -*-
#!/usr/bin/env python
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
import numpy as np
def Bp():
#加载数据
mnist_data = input_data.read_data_sets("./MNIST_data/",one_hot=True)
#获取训练数据
train_data = mnist_data.train
#获取验证数据
validation_data = mnist_data.validation
#获取测试数据
test_data = mnist_data.test
#神经网络结构及参数:784-30-10
# 各层节点个数
input_n=784
output_n=10
hidden_n=30
#输入,输出占位
x=tf.placeholder(tf.float32,shape=[None,input_n])
y_=tf.placeholder(tf.float32,shape=[None,output_n])
# 权值矩阵,阈值
w1=tf.Variable(tf.random_normal([input_n,hidden_n], stddev = 0.1))
b1=tf.Variable(tf.random_normal([1,hidden_n], stddev = 0.1))
w2=tf.Variable(tf.random_normal([hidden_n,output_n], stddev = 0.1))
b2=tf.Variable(tf.random_normal([1,output_n], stddev = 0.1))
# w1 = tf.Variable(tf.random_normal ([input_n,hidden_n], stddev = 0.1))
# b1 = tf.Variable(tf.constant (0.1), [hidden_n])
# w2 = tf.Variable(tf.random_normal ([hidden_n, output_n], stddev = 0.1))
# b2 = tf.Variable(tf.constant (0.1), [output_n])
# 构建图:前向传播
hidden_op=tf.nn.relu(tf.matmul(x,w1)+b1)
final_opt=tf.nn.relu(tf.matmul(hidden_op,w2)+b2)
# 对输出层计算交叉熵损失
loss_fun = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(labels=y_, logits=final_opt))
opt = tf.train.GradientDescentOptimizer(0.3).minimize(loss_fun)
#计算准确率
correct_pred = tf.equal(tf.argmax(final_opt,1),tf.argmax(y_,1))
accuracy = tf.reduce_mean(tf.cast(correct_pred,tf.float32))
# 初始化变量
init = tf.global_variables_initializer()
#初始化TensorFlow持久化类
saver = tf.train.Saver(max_to_keep=1)
train_is_no=False
with tf.Session() as sess:
sess.run(init)
if train_is_no :
for i in range(5000):
#每次随机选择100个样本进行训练
batch_xs,batch_ys = train_data.next_batch(100)
opt.run({x:batch_xs,y_:batch_ys})
if i % 100 == 0 :
train_accuracy = accuracy.eval (session = sess, feed_dict = {x: batch_xs,y_: batch_ys})
print ("step : %d, training accuracy = %g " % (i, train_accuracy))
saver.save(sess,'bp_model/save_net.ckpt',global_step=None)
#计算模型在训练集上的准确率
print("train accray:%.4f" % accuracy.eval({x:train_data.images,y_:train_data.labels}))
#计算模型在测试集上的准确率
print("test accuracy:%.4f" % accuracy.eval({x:test_data.images,y_:test_data.labels}))
'''
train accray:0.9766
test accuracy:0.9634 '''
else:
#验证
saver.restore(sess,tf.train.latest_checkpoint('bp_model'))
print("test accuracy:%.4f" % accuracy.eval({x:test_data.images,y_:test_data.labels}))
print("validation accuracy:%.4f" % accuracy.eval({x:validation_data.images,y_:validation_data.labels}))
'''
test accuracy:0.9634
validation accuracy:0.9664 '''
# #初始化TensorFlow持久化类
# # saver = tf.train.Saver()
# saver = tf.train.Saver()
# with tf.Session() as sess:
# step=0
# sess.run(init)
# while False:
# batch_xs,batch_ys = train_data.next_batch(100)
# opt.run({x:batch_xs,y_:batch_ys})
# train_accuracy = accuracy.eval (session = sess, feed_dict = {x: batch_xs,y_: batch_ys})
# step+=1
# if train_accuracy >= 1:
# print(step,train_accuracy)
# save_path = saver.save(sess, "model/save_net.ckpt",global_step=step)
# break
# if step % 1000 == 0 :
# print ("step : %d, training accuracy = %g " % (step, train_accuracy))
def main():
Bp()
if __name__ == '__main__':
main()
代码分块解析
#加载数据
mnist_data = input_data.read_data_sets("./MNIST_data/",one_hot=True)
#获取训练数据
train_data = mnist_data.train
#获取验证数据
validation_data = mnist_data.validation
#获取测试数据
test_data = mnist_data.test
先从MNIST数据集中获取:训练集,测试集,验证集
#神经网络结构及参数:784-30-10
# 各层节点个数
input_n=784
output_n=10
hidden_n=30
#输入,输出占位
x=tf.placeholder(tf.float32,shape=[None,input_n])
y_=tf.placeholder(tf.float32,shape=[None,output_n])
# 权值矩阵,阈值
w1=tf.Variable(tf.random_normal([input_n,hidden_n], stddev = 0.1))
b1=tf.Variable(tf.random_normal([1,hidden_n], stddev = 0.1))
w2=tf.Variable(tf.random_normal([hidden_n,output_n], stddev = 0.1))
b2=tf.Variable(tf.random_normal([1,output_n], stddev = 0.1))
设计BP神经网络的各层节点数以及各层之间的权值矩阵w和偏置(阈值)矩阵b
random_normal():从正态分布中输出随机值.stddev:设置方差为0.1,默认值为1
# 构建图:前向传播
hidden_op=tf.nn.relu(tf.matmul(x,w1)+b1)
final_opt=tf.nn.relu(tf.matmul(hidden_op,w2)+b2)
定义输入层与隐藏层,隐藏层与输出层之间的数据传输关系;
隐藏层和输出层的激活函数采用ReLU函数,tf.nn.relu()函数是将大于0的数保持不变,小于0的数置为0
# 对输出层计算交叉熵损失
loss_fun = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(labels=y_, logits=final_opt))
opt = tf.train.GradientDescentOptimizer(0.3).minimize(loss_fun)
tf.nn.softmax_cross_entropy_with_logits_v2(_sentinel, labels, logits, dim, name)
计算 softmax(logits) 和 labels 之间的交叉熵。
labels:真实数据的类别标签;logits:神经网络最后一层的类别预测输出值
保存训练好的神经网络并调用
#初始化TensorFlow持久化类
saver = tf.train.Saver(max_to_keep=1)
# 判断是训练还是测试
train_is_no=False
with tf.Session() as sess:
sess.run(init)
if train_is_no :
#********
#训练代码
#*******
# 通过Saver类的save方法保存模型
saver.save(sess,'bp_model/save_net.ckpt',global_step=None)
else:
#使用saver的restore方法导入模型参数
saver.restore(sess,tf.train.latest_checkpoint('bp_model'))
#******
# 测试代码
#******
小测试:将MNIST数据集中的图片显示出来
import numpy as np
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
import matplotlib.pyplot as plt
i=54999 #第几张图,随便写
mnist=input_data.read_data_sets("./MNIST_data/",one_hot=True)
# 获取训练集的数据图片,并将其转换为[28,28]的原始形状
image=np.reshape(mnist.train.images[i],[28,28])
# 读取对应训练集的标签从而判断其正确值是多少
# 由于读取的标签值类型为numpy.ndarray,与list存在差别,其无法读取内部元素的位置
# 所以需要调用其tolist()方法将其转化为list
label=mnist.train.labels[i].tolist()
print(type(label)) #<class 'list'>
#找到label中元素为1的下标
print(label.index(1)) #显示label
# 通过设置cmap可以改变绘图颜色,
#gray_rgray_r:翻转 gray 的显示,如果 gray 将图像显示为黑底白字,gray_r 会将其显示为白底黑字
plt.imshow(image, cmap=plt.get_cmap('gray_r')) #画图
plt.title("%dth Training Data:%d" % (i,label.index(1)))
plt.show()
显示结果
参考链接
‘numpy.ndarray’ object has no attribute 'index’
matplotlib 可视化 —— cmap(colormap)
matplotlib.pyplot.colormaps色彩图cmap
传送门
温度数据训练
语音信号分类
MINIST手写数字识别(可视化输出结果)
BP神经网络基于Tensorflow的实现(代码注释详细)
机器学习之BP神经网络 以及 tensorflow 实现
激活函数相关
tensorflow的tf.nn.relu()函数
常用激活函数(激励函数)理解与总结
机器学习-激活函数的使用
softmax相关
tf.nn.softmax_cross_entropy_with_logits_v2()的用法
TensorFlow 中 softmax_cross_entropy_with_logits 及其···v2 和sparse_softmax_cross_entropy_with_logits的异同
tf.nn.softmax_cross_entropy_with_logits的用法
random随机数相关
W3Cschool-TensorFlow随机值:tf.random_normal函数
tensorflow 生成随机数 tf.random_normal 和 tf.random_uniform 和 tf.truncated_normal 和 tf.random_shuffle
tf.random_normal方法中seed的作用
Saver相关
如何保存训练好的神经网络直接进行测试-TensorFlow模型持久化
在TensorFlow中保存已经训练好的神经网络模型
tensorflow 1.0 学习:模型的保存与恢复(Saver)