tensorflow神经网络与单层手写字识别
1、知识点
""" 1、基础知识: 1、神经网络结构:1、输入层 2、隐含层 3、全连接层(类别个数=全连接层神经元个数)+softmax函数 4、输出层 2、逻辑回归:只能解决二分类问题 3、线性回归:只能用于预测 4、softmax:有多少类别,就会有多少个输出 5、信息熵:信息熵越大,不确定性越大,信息熵越小,则不确定小,属于的类别也更加清晰 6、softmax公式: Si = e^i / (e^1+....+e^j) ,用于计算概率值。 特点:所有类别概率值相加等于1 7、损失函数:交叉熵损失 ,一个样本就有一个交叉熵损失。公式: H(y) = -y'log y(i)对i的求和值,其中y'为真实结果,y(i)为预测结果,一 2、感知机:有n个输入数据,通过权重与各数据之间的计算和,比较激活函数结果,得出输出 应用场景:很容易解决与、或、非问题,即二分类问题 3、神经网络的种类: 1、基础神经网络:单层感知器,线性神经网络,BP神经网络,Hopfield神经网络等 2、进阶神经网络:玻尔兹曼机,受限玻尔兹曼机,递归神经网络等 3、深度神经网络:深度置信网络,卷积神经网络,循环神经网络,LSTM网络等 4、神经网络特点: 1、输入向量的维度和输入神经元的个数相同 2、每个连接都有个权值 3、同一层神经元之间没有连接 4、由输入层,隐层,输出层组成 5、第N层与第N-1层的所有神经元连接,也叫全连接 5、神经网络API模块: 1、tf.nn:提供神经网络相关操作的支持,包括卷积操作(conv)、池化操作(pooling)、归一化、loss、分类操作、embedding、RNN、Evaluation. 2、tf.layers:主要提供的高层的神经网络,主要和卷积相关的,对tf.nn进一步封装。 3、tf.contrib:tf.contrib.layers提供将计算图中的网络层、正则化、摘要操作,是构建计算图的高级操作,但是tf.contrib包不稳定以及一些实验代码 算法对比总结: 算法 策略 优化 线性回归 均方误差 梯度下降 预测 逻辑回归 对数似然损失 梯度下降 二分类 神经网络 交叉熵损失 反响传播算法(就是梯度下降算法) 单层(全连接层)实现手写数字识别: 1、定义数据占位符,针对特征值和目标值矩阵 特征值[None,784] 目标值[None,10] 2、建立模型 随机初始化权重和偏置 y_predict = tf.matmul(x,w)+b 3、计算损失 loss平均样本损失(交叉熵损失) 4、梯度下降优化(梯度下降算法) """
2、代码
# coding = utf-8 import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data FLAGS = tf.app.flags.FLAGS tf.app.flags.DEFINE_integer("IS_TRAIN",1,"指定程序是预测还是训练") def fullconnnected(): """ 全连接层 :return: """ #获取数据 minist = input_data.read_data_sets("./data/mnist/input_data/", one_hot=True) # 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、建立一个全连接层的神经网络 with tf.variable_scope("fc_model"): #随机初始化权重和偏置 weight = tf.Variable(tf.random_normal([784,10],mean=0.0,stddev=1.0),name="w") bias = tf.Variable(tf.constant(0.0,shape=[10])) #预测None个样本的输出结果 y_predict = tf.matmul(x,weight)+bias #3、计算交叉熵损失 with tf.variable_scope("cross_entropy"): #求取平均交叉熵损失 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.2).minimize(loss) #5、计算准确率 with tf.variable_scope("accuracy"): equal_list = tf.equal(tf.argmax(y_true,1),tf.argmax(y_predict,1)) #equal_list None个样本 [1,0,1,1,0,0,0......] accuracy = tf.reduce_mean(tf.cast(equal_list,tf.float32)) #6、收集变量 tf.summary.scalar("losses",loss) tf.summary.scalar("acc",accuracy) tf.summary.histogram("weights",weight) tf.summary.histogram("baises",bias) merge = tf.summary.merge_all() #7、初始化变量 init_op = tf.global_variables_initializer() #8、创建一个Saver saver = tf.train.Saver() #9、开启会话进行训练 with tf.Session() as sess: #初始化变量 sess.run(init_op) fileWriter = tf.summary.FileWriter("./event/",graph=sess.graph) if FLAGS.IS_TRAIN == 1: #迭代步数训练,更新参数预测 for i in range(2000): #取出数据的特征自和目标值 mnist_x,mnist_y =minist.train.next_batch(50) #训练 sess.run(train_op,feed_dict={x: mnist_x, y_true:mnist_y}) summary = sess.run(merge,feed_dict={x: mnist_x, y_true:mnist_y}) fileWriter.add_summary(summary,i) print("训练第%d步,准确率为:%f" %(i,sess.run(accuracy,feed_dict={x: mnist_x, y_true:mnist_y})) ) #保存模型 saver.save(sess,"./ckpt/fc_model") else: #如果是0,那么做预测 for i in range(10): saver.restore(sess,"./ckpt/fc_model") #每次测试一张图片 x_test,y_test = minist.test.next_batch(1) print("第%d张图片,手写数字是%d,,预测结果是%d" %( i, tf.argmax(y_test,1).eval(), tf.argmax(sess.run(y_predict,feed_dict={x: x_test, y_true:y_test}),1).eval() )) return None if __name__ == '__main__': "测试:python 简单神经网络介绍.py --IS_TRAIN=0" #默认训练 fullconnnected() pass
本文来自博客园,作者:小白啊小白,Fighting,转载请注明原文链接:https://www.cnblogs.com/ywjfx/p/10933747.html