03简单神经网络
一. 感知机
1. 概念
有n个输入数据,通过权重与各数据之间的计算和,比较激活函数结果,得出输出
应用:很容易解决与、或、非问题
2. 演示
http://playground.tensorflow.org/
二. 神经网络
1. 定义
在机器学习和认知科学领域,人工神经网络(artificial neural network,缩写ANN),简称神经网络(neural network,缩写NN)或类神经网络,是一种模仿生物神经网络的结构和功能的计算模型,用于对函数进行估计或近似。
杰弗里·埃弗里斯特·辛顿 (英语:Geoffrey Everest Hinton)是反向传播算法的发明人之一,也是深度学习的积极推动者。
2. 分类
1) 基础神经网络:单层感知器,线性神经网络,BP神经网络,Hopfield神经网络等
2) 进阶神经网络:玻尔兹曼机,受限玻尔兹曼机,递归神经网络等
3) 深度神经网络:深度置信网络,卷积神经网络,循环神经网络,LSTM网络等
3. 神经网络的特点
1) 输入向量的维度和输入神经元的个数相同
2) 每个连接都有个权值
3) 同一层神经元之间没有连接
4) 由输入层,隐层,输出层组成
5) 第N层与第N-1层的所有神经元连接,也叫全连接
4. 组成
1) 结构(Architecture)例如,神经网络中的变量可以是神经元连接的权重
2) 激励函数(Activity Rule)大部分神经网络模型具有一个短时间尺度的动力学规则,来定义神经元如何根据其他神经元的活动来改变自己的激励值。
3) 学习规则(Learning Rule)学习规则指定了网络中的权重如何随着时间推进而调整。(反向传播算法)
5. 对比
三. 相关API
1. one-hot
tf.one_hot(indices,depth,on_value=None,off_value=None,axis=None,dtype=None,name=None)
l indices 在独热编码中位置,即数据集标签
l depth张量的深度,即类别数
2. 获取mnist测试数据集
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets(FLAGS.data_dir, one_hot=True)
3. SoftMax回归
公式:
4. 损失计算:交叉熵
yi’为神经网络结果,𝑦𝑖为真实结果。每个类别都有一个损失结果最后需要求平均损失
5. SoftMax计算、交叉熵
tf.nn.softmax_cross_entropy_with_logits(labels=None, logits=None,name=None)
计算logits和labels之间的交叉损失熵
- labels:标签值(真实值)
- logits:样本加权之后的值
- return:返回损失值列表
6. 损失值列表平均值计算
tf.reduce_mean(input_tensor) 计算张量的尺寸的元素平均值
7. 梯度下降优化
tf.train.GradientDescentOptimizer(learning_rate)
l learning_rate:学习率
l minimize(loss):最小化损失
l return:梯度下降op
8.示例代码
1 # -*- coding:utf-8 -*- 2 import tensorflow as tf 3 import os 4 from tensorflow.examples.tutorials.mnist import input_data 5 6 os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' 7 FLAGS = tf.app.flags.FLAGS 8 tf.app.flags.DEFINE_integer("mode",1,"运行/测试") 9 10 11 def full_connected(): 12 mnist = input_data.read_data_sets("./tmp/input_data", one_hot=True) 13 14 # 1.建立占位符 15 with tf.variable_scope("data"): 16 x = tf.placeholder(tf.float32, [None, 784]) 17 18 y_true = tf.placeholder(tf.int64, [None, 10]) 19 20 # 2.建立一个全连接层的神经网络 w[784,10] b[10] 21 with tf.variable_scope("fc_model"): 22 weight = tf.Variable(tf.random_normal([784, 10], mean=0.0, stddev=1.0), name="w") 23 bias = tf.Variable(tf.constant(0.0, shape=[10])) 24 25 y_predict = tf.matmul(x, weight) + bias 26 27 # 3.求损失平均值 28 with tf.variable_scope("soft_cross"): 29 # 求平均交叉熵损失 30 loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_true, logits=y_predict)) 31 32 # 4.梯度下降求出损失 33 with tf.variable_scope("optimizer"): 34 train_op = tf.train.GradientDescentOptimizer(0.1).minimize(loss) 35 36 # 5.计算准确率 37 with tf.variable_scope("acc"): 38 equal_list = tf.equal(tf.argmax(y_true, 1), tf.argmax(y_predict, 1)) 39 # 计算张量平均值 40 accuracy = tf.reduce_mean(tf.cast(equal_list, tf.float32)) 41 42 # 收集变量 单个数据变量收集 43 tf.summary.scalar("losses", loss) 44 tf.summary.scalar("acc", accuracy) 45 # 收集高维变量 46 tf.summary.histogram("weights", weight) 47 tf.summary.histogram("bias", bias) 48 49 merge = tf.summary.merge_all() 50 # 初始化变量 51 # 含有tf.Variable的环境下,因为tf中建立的变量是没有初始化的,也就是在debug时还不是一个tensor量,而是一个Variable变量类型 52 init_op = tf.global_variables_initializer() 53 54 savar = tf.train.Saver() 55 56 # 开启会话训练 57 with tf.Session() as sess: 58 sess.run(init_op) 59 60 # 建立events文件写入 61 filewriter = tf.summary.FileWriter("./tmp/test/", graph=sess.graph) 62 63 if FLAGS.mode == 1: 64 for i in range(2000): 65 # 取出目标值,特征值 66 m_x, m_y = mnist.train.next_batch(50) 67 68 sess.run(train_op, feed_dict={x: m_x, y_true: m_y}) 69 summary = sess.run(merge, feed_dict={x: m_x, y_true: m_y}) 70 filewriter.add_summary(summary, i) 71 print("第%d步,准确率:%f" % (i, sess.run(accuracy, feed_dict={x: m_x, y_true: m_y}))) 72 73 # 保存模型 74 savar.save(sess,"./tmp/test/fc_model") 75 else: 76 if(os.path.exists("./tmp/test/checkpoint")): 77 savar.restore(sess, "./tmp/test/fc_model") 78 79 for i in range(100): 80 x_test,y_test = mnist.test.next_batch(1) 81 print("第%d个,真实值为%d,预测值为%d" % ( 82 i, 83 tf.arg_max(y_test,1).eval(), 84 tf.argmax(sess.run(y_predict,feed_dict={x:x_test,y_true:y_test}),1).eval() 85 )) 86 87 88 if __name__ == '__main__': 89 full_connected()
四. 深度神经网络
深度学习网络与更常见的单一隐藏层神经网络的区别在于深度,深度学习网络中,每一个节点层在前一层输出的基础上学习识别一组特定的特征。
随着神经网络深度增加,节点所能识别的特征也就越来越复杂。