深度学习之神经网络(一)

神经网络判段多分类情况时,有几个类别就有几个输出神经元
图片中一个像素点就是一个特征
输出层输出数值,不会直接告诉你分类,通过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的数值分布

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43414976/article/details/88767221