一. 感知机
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()
四. 深度神经网络
深度学习网络与更常见的单一隐藏层神经网络的区别在于深度,深度学习网络中,每一个节点层在前一层输出的基础上学习识别一组特定的特征。
随着神经网络深度增加,节点所能识别的特征也就越来越复杂。