目录
- 感知机
- 神经网络
- 神经网络的特点
- 神经网络的组成
- 浅层人工神经网络模型
- SoftMax回归
- 损失计算-交叉熵损失
- SoftMax计算、交叉熵
- 准确性计算
- Mnist数据集神经网络案例
神经网络方面的研究很早就已出现,今天“神经网络”已是一个相当大的、多学科交叉的学科领域。神经网络中最基本的成分是神经元模型。
上图中每个圆圈都是一个神经元,每条线表示神经元之间的连接。我们可以看到,上面的神经元被分成了多层,层与层之间的神经元有连接,而层内之间的神经元没有连接。
感知机
感知机Rosenblatt在1957年,于Cornell航空实验室时所发明的一种人工神经网络。
有n个输入数据,通过权重与各数据之间的计算和,比较激活函数结果,得出输出。很容易解决与、或、非问题。
可以看到,一个感知器有如下组成部分:
- 输入权值,一个感知器可以有多个输入x1,x2,x3...xn,每个输入上有一个权值wi
- 激活函数,感知器的激活函数有许多选择,以前用的是阶跃函数,,其中zz为权重数据积之和
- 输出,
神经网络
定义:在机器学习和认知科学领域,人工神经网络(artificial neural network,缩写ANN),简称神经网络(:neural network,缩写NN)或类神经网络,是一种模仿生物神经网络的结构和功能的计算模型,用于对函数进行估计或近似。
神经网络的种类:
基础神经网络:单层感知器,线性神经网络,BP神经网络,Hopfield神经网络等
进阶神经网络:玻尔兹曼机,受限玻尔兹曼机,递归神经网络等
深度神经网络:深度置信网络,卷积神经网络,循环神经网络,LSTM网络等
神经网络的特点
- 输入向量的维度和输入神经元的个数相同
- 每个连接都有个权值
- 同一层神经元之间没有连接
- 由输入层,隐层,输出层组成
- 第N层与第N-1层的所有神经元连接,也叫全连接
神经网络的组成
- 结构(Architecture)例如,神经网络中的变量可以是神经元连接的权重
- 激励函数(Activity Rule)大部分神经网络模型具有一个短时间尺度的动力学规则,来定义神经元如何根据其他神经元的活动来改变自己的激励值。
- 学习规则(Learning Rule)学习规则指定了网络中的权重如何随着时间推进而调整。(反向传播算法)
浅层人工神经网络模型
SoftMax回归
MNIST中的每个图像都是零到九之间的手写数字。所以给定的图像只能有十个可能的东西。我们希望能够看到一个图像,并给出它是每个数字的概率。例如,我们的模型可能会看到一个九分之一的图片,80%的人肯定它是一个九,但是给它一个5%的几率是八分之一(因为顶级循环),并有一点概率所有其他,因为它不是100%确定。这是一个经典的情况,其中softmax回归是一种自然简单的模型。如果要将概率分配给几个不同的东西之一的对象,softmax是要做的事情,因为softmax给出了一个[0,1]之间的概率值加起来为1的列表。稍后,当我们训练更复杂型号,最后一步将是一层softmax。
那么我们通常说的激活函数有很多,我们这个使用softmax函数.softmax模型可以用来给不同的对象分配概率。即使在之后,我们训练更加精细的模型时,最后一步也需要用softmax来分配概率。这里的softmax可以看成是一个激励(activation)函数,把我们定义的线性函数的输出转换成我们想要的格式,也就是关于10个数字类的概率分布。因此,给定一张图片,它对于每一个数字的吻合度可以被softmax函数转换成为一个概率值。
softmax回归有两个步骤:首先我们将我们的输入的证据加在某些类中,然后将该证据转换成概率。每个输出的概率,对应着独热编码中具体的类别。
下面是softmax的公式
在神经网络中,整个过程如下:
也就是最后的softmax模型,用数学式子表示:
损失计算-交叉熵损失
我们前面学习过了一种计算误差损失,预测值与标准值差的平方和。不过在这里我们不能再使用这个方式,我们的输出值是概率并且还有标签。那么就需要一种更好的方法形容这个分类过程的好坏。这里就要用到交叉熵损失。
确定模型损失的一个非常常见的非常好的功能称为“交叉熵”。交叉熵来源于对信息理论中的信息压缩代码的思考,但是从赌博到机器学习在很多领域都是一个重要的思想。它定义为
SoftMax计算、交叉熵
tf.nn.softmax_cross_entropy_with_logits(labels=None, logits=None,name=None)
- 计算logits和labels之间的交叉损失熵
- labels:标签值(真实值)
- logits:样本加权之后的值
- return:返回损失值列表
准确性计算
equal_list = tf.equal(tf.argmax(y, 1), tf.argmax(y_label, 1))
accuracy = tf.reduce_mean(tf.cast(equal_list, tf.float32))
Mnist数据集神经网络案例
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
def full_connected():
# 准备数据
mnist = input_data.read_data_sets("./data/mnist/", one_hot=True)
# 建立数据的占位符
with tf.variable_scope("data"):
x = tf.placeholder(tf.float32, [None, 28 * 28])
y_true = tf.placeholder(tf.float32, [None, 10])
# 建立全连接层的神经网络
with tf.variable_scope("fc_model"):
# 随机初始化权重和偏重
weight = tf.Variable(tf.random_normal([28 * 28, 10], mean=0.0, stddev=1.0), name="w")
bias = tf.Variable(tf.constant(0.0, shape=[10]))
# 预测结果
y_predict = tf.matmul(x, weight) + bias
# 所有样本损失值的平均值
with tf.variable_scope("soft_loss"):
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_true, logits=y_predict))
# 梯度下降
with tf.variable_scope("optimizer"):
train_op = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
# 计算准确率
with tf.variable_scope("acc"):
equal_list = tf.equal(tf.argmax(y_true, 1), tf.argmax(y_predict, 1))
accuracy = tf.reduce_mean(tf.cast(equal_list, tf.float32))
# 收集变量
# 单个数字值收集
tf.summary.scalar("losses", loss)
tf.summary.scalar("acc", accuracy)
# 高纬度变量收集
tf.summary.histogram("weights", weight)
tf.summary.histogram("biases", bias)
# 初始化变量op
init_op = tf.global_variables_initializer()
# 变量合并op
merged = tf.summary.merge_all()
with tf.Session() as sess:
# 变量初始化
sess.run(init_op)
# 建立events文件
fw = tf.summary.FileWriter("./temp/tf/summary/fc", graph=sess.graph)
for i in range(3000):
mnist_x, mnist_y = mnist.train.next_batch(100)
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})
fw.add_summary(summary, i)
print("训练第%d步, 准确率为%f" % (i, sess.run(accuracy, feed_dict={x: mnist_x, y_true: mnist_y})))
if __name__ == '__main__':
full_connected()
准确值变化:
损失变化:
流程:
- 准备数据
- 全连接计算结果
- 损失优化
- 模型评估(计算准确值)