深度学习之神经网络(一)
作者:互联网
神经网络判段多分类情况时,有几个类别就有几个输出神经元
图片中一个像素点就是一个特征
输出层输出数值,不会直接告诉你分类,通过softmax得出对应概率。 将正确结果经过one_hot编码与得出概率中最大处比较,可判断对错
算法 策略 优化
线性回归 均方误差 梯度下降
对数回归 对数似然损失 梯度下降
神经网络 交叉熵损失 梯度下降
交叉熵损失衡量softmax后结果数值与one_hot后结果数值的差异程度,
从mnist中取数据
from tensorflow .examples.tutorials.mnist import input_data
mnist=input_data.read_data_sets(FLAGS.data_dir, one_hot=True)
#输出[55000, 784] ,即展示所有样本的所有特征(像素)
mnist.train.image
#输出[550001 10], one_hot后标签值列表
mnist.train.labels
#从输出的特征值和标签值中按顺序各取50个样本
mnist.train.next_batch(50)
现在写出构建神经网络的逻辑框架
所谓特征[…,784], 目标值[…,10]
1.定义两个数据占位符,因为我们是训练过程中实传入数据
2.建立模型(随机初始化权重和偏置,每一个输出神经元都有一个偏置)
y_predict= tf.matmul(x, m)+b
3.计算损失(平均loss)
4.梯度下降
5.计算准确率(比较概率最大位置与one_hot中1的位置)
tf.argmax(y_true, 1) 这里1指的是[50, 10] 中10
现在开始写一个案列;
import tensorflow as tf
def full_connected():
#1.建立数据占位符, x[None, 784], y_true[None, 10]
with tf.variable_scope(“data”):
x=tf.placeholder(tf.float32, [None, 784])
y_true=tf.placeholder(tf.int32, [None, 10])
#2.建立一个全连接神经网络, w[784, 10], b[10]
with tf.variable_scope("fc_model"):
#随机初始化权重和偏置
weight= tf.Variable(tf.random_normal([784, 10], mean=0.0, srddev=1.0), name = "weight")
bias=tf.Variable(tf.constant(0.0, shape=[10]))
#预测None个样本的输出结果[None, 784] *[784, 10] +[10] = [784, 10]
y_predict=tf.matmul(x, weight) +bias
#3.求出平均损失
with tf.variable_scope("soft_cross"):
#求平均交叉熵损失
loss=tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels= y_true, logits= y_predict))
#4.梯度下降求出损失
with tf.variable_scope("optimizer"):
train_op= tf.train.GradientDescentOptimizer(0,1).minimize(loss)
#5计算准确率
with tf.variable_scope("..."):
equal_list=tf.equal(tf.argmax(y_true, 1), tf.argmax(y_predict, 1))
accuracy=tf.reduce_mean(tf.cast(equal_list, tf.float32))
#equal_list None个样本,[1,0,1....]
#如果想在tensorboard上看到图,在要在这里收集变量
#先收集单个数字变量
tf.summary.scalar("losses" , loss)
tf.summary.scalar("acc", accuracy)
#高维度变量的收集
tf.summary.histogram("weightes", weight)
tf.summary.histogram("biasses", bias)
#定义一个初始化变量op
init_op=tf.global_variables_initializer()
#定义一个合并变量的op
filewriter=tf.summary.FileWriter("./tmp..." , graph=sess.graph)
#创建一个保存变量的op
saver=tf.train.Saver()
#开始会话
with tf.Session() sa sess:
#初始化
sess.run(init_op)
if FLAGS.is_train ==1:
#迭代训练,更新参数
for i in range(2000):
#前面提供的占位符,就是在运行的时候传入数据
mnist_x , mnist_y =mnist.train.next_batch(50)
sess.run(train_op, feed_dict={x:mnist_x, y_true:mnist_y})
summary=sess.run(merged, feed_dict={x:mnist_x, y_true:mnist_y}) #所有要在运行时提供实时数据的op,都要提供这个参数
filewriter.add_summary(summary, i)
print("训练第:%d步, 准确率为:%f" %(i, sess.run(accuracy), feed_dict={x:mnist_x, y_true:mnist_y})
#现在训练完了,保存模型,当然也可以在训练过程中保存
saver=save(sess."./tmp/..")
else:
#如果是0就是做预测,如果是1就训练
#加载模型
saver.restore(sess, "...")
for i in range(100):
x_test, y_test=mnist.test.next_batch(1) #一共做100次预测,每次预测一张图
#测试特征值,测试目标值(one_hot编码)
print("第%d张图片,手写数字是:%d,预测结果是:%d" %(i, tf.argmax(y_test, 1).eval(), tf.argmax(sess.run(y_predict, feed_dict={x:x_test, y:y_test}), 1).eval()))
在cmd中可以运行这个模型去测试
if name ==“main”:
full_connected()
#在浏览器中,scalars内可以看到准确率和损失掉的变化范围,在Histograms中看到weight呵呵bias的数值分布
标签:784,10,sess,学习,神经网络,train,深度,tf,mnist 来源: https://blog.csdn.net/weixin_43414976/article/details/88767221