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()

 

四. 深度神经网络

  深度学习网络与更常见的单一隐藏层神经网络的区别在于深度,深度学习网络中,每一个节点层在前一层输出的基础上学习识别一组特定的特征。

  随着神经网络深度增加,节点所能识别的特征也就越来越复杂。

 

posted @ 2020-03-16 16:49  菜白小系瓦  阅读(235)  评论(0编辑  收藏  举报