神经网络
一、神经网络基础
1、感知机
有n个输入数据,通过权重与各数据之间的计算和,比较激活函数结果,得出输出
应用:很容易解决与、或问题
2、人工神经网络
- Rosenblatt在1957年,于Cornell航空实验室时所发明的一种人工神经网络
二、人工神经网络(ANN)
神经网络的发展
- 定义:在机器学习和认知科学领域,人工神经网络(artificial neural network,缩写ANN),简称神经网络(neural network,缩写NN)或类神经网络,是一种模仿生物神经网络的结构和功能的计算模型,用于对函数进行估计或近似
- 神经网络的种类:
基础神经网络:单层感知器,线性神经网络,BP神经网络,Hopfield神经网络等
进阶神经网络:或尔兹曼机,受限玻尔兹曼机,递归神经网络等
深度神经网络:深度置信网络,卷积神经网络,循环神经网络,LSTM网络等
杰佛里 · 埃弗里斯特 · 辛顿(英语:Geoffrey Everest Hinton)(1947年12月6日)是一位英国出生的计算机科学家和心理学家,以其在神经网络方面的贡献闻名。辛顿是反向传播算法的发明人之一,也是深度学习的积极推动者。
神经网络的特点
- 输入向量的维度和输入神经元的个数相同
- 每个连接都有个权值
- 同一层神经元之间没有连接
- 由输入层,隐层,输出层组成
- 第N层与第N-1层的所有神经元连接,也叫全连接
神经网络的组成
- 结构(Architecture)例如,神经网络中的权重,神经元等等
- 激活函数(Activity Rule)
- 学习规则(Learning Rule)学习规则指定了网络中的权重如何随着时间推进而调整。(反向传播算法)
神经网络API模块
在使用tensorflow的时候,tf.nn,tf.layers,tf.contrib模块有很多功能是重复的。
下面是对三个模块的简述:
- tf.nn:提供神经网络相关操作的支持,包括卷积操作(conv)、池化操作(pooling)、归一化、loss、分类操作、embedding、RNN、Evaluation。
- tf.layers:主要提供的高层的神经网络,主要和卷积相关的,对tf.nn的进一步封装。
- tf.contrib::tf.contrib.layers提供够将计算图中的网络层、正则化、摘要操作,是构建计算图的高级操作,但是tf.contrib包不稳定以及一些实验代码。
浅层人工神经网络模型
SoftMax回归
损失计算API
- 损失计算-交叉熵损失公式(了解)
全连接-从输入直接到输出
特征加权
- tf.matmul(a, b, name=None) + bias
- return:全连接结果,供交叉损失运算
- 不需要激活函数(因为是最后的输出)
- tf.matmul(a, b, name=None) + bias
SoftMax计算、交叉熵
tf.nn.softmax_cross_entropy_with_logits(labels=None, logits=None, name=None)
计算logits和labels之间的交叉损失熵
- labels:标签值(真实值)
- logits:样本加权之后的值
- return:返回损失值列表
损失值列表平均值计算
tf.reduce_mean(input_tensor)
计算张量的尺寸的元素平均值
aaaaa
aaaaaa
其他方法API介绍
其他方法-损失下降API
tf.train.GradientDescentOptimizer(learning_rate)
梯度下降优化
learning_rate:学习率,一般为
minimize(loss):最小化损失
return:梯度下降OP
one-hot API介绍
tf.one_hot
tf.one_hot(indices, depth, on_value=None, off_value=None, axis=None, dtype=None, name=None)
- indices 在独热编码中位值,即数据集标签
- depth 张量的深度,即类别数
三、Mnist数据集浅层神经网络分析
1、Mnist手写数字识别
Mnist数据集可以从官网下载,网址:http://yann.lecun.com/exdb/mnist/ 下载下来的数据集被分成两部分:55000行的训练数据集(mnist.train)和10000行的测试数据集(mnist.text),每一个MNIST数据单元有两部分组成:一张包含手写数字的图片和一个对应的标签,我们把这些图片设为“xs”,把这些标签设为“ys‘。训练数据集和测试数据集都包含xs和ys,比如训练数据集的图片是mnist.train.images,训练数据集的标签是mnist.train.labels。
2、Mnist数据集神经网络实现流程
准备数据
获取数据
from tensorflow.examples.tutorials.mnist import input_data mnist = input_data.read_data_sets(FLAGS.data_dir, one_hot=True)
准确性计算
equal_list = tf.equal(tf.argmax(y, 1), tf.argmax(y_label, 1)) accuracy = tf.reduce_mean(tf.cast(equal_list, tf.float32))
全连接结果计算
损失优化
模型评估(计算准确性)
Tensorboard可视化数据以及运算流程图
- 命令行输入:tensorboard –logdir=”path”
完整训练预测数据代码实现
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
# lst = list(FLAGS._flags().keys())
# for key in lst:
# FLAGS.__delattr__(key)
# print('重启完毕')
FLAGS = tf.app.flags.FLAGS
tf.app.flags.DEFINE_string('f', '', 'kernel')
tf.app.flags.DEFINE_integer('is_train', 1 , '指定程序是预测还是训练')
def full_connected():
# 获取真实的数据
mnist = input_data.read_data_sets('/home/hbsi/Downloads/MNIST', 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.建立一个全链接层的神经网络 w [784, 10] b [10]
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个样本的输出结果matrix [None, 784] * [784, 10] + [10] = [None, 10]
y_predict = tf.matmul(x, weight) + bias
# 3.求出所有的样本的损失,然后求出平均值
with tf.variable_scope('soft_cross'):
# 求平均交叉熵损失
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.1).minimize(loss)
# 5.计算准确率
with tf.variable_scope('acc'):
equal_list = tf.equal(tf.argmax(y_true, 1), tf.argmax(y_predict, 1))
# equal_list None个样本 [1,0,1,0,1,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()
# 创建一个saver
saver = tf.train.Saver()
# 6.开启会话去训练
with tf.Session() as sess:
# 初始化变量
sess.run(init_op)
# 建立events文件,然后写入
filewriter = tf.summary.FileWriter('/home/hbsi/Documents', graph=sess.graph)
if FLAGS.is_train == 1:
# 迭代步数去训练,更新预测参数
for i in range(2000):
# 取出真实存在的特征值和目标值
mnist_x, mnist_y = mnist.train.next_batch(50)
# 运行train_op训练
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})
filewriter.add_summary(summary, i)
print('训练第{}步,准确率为{}'.format(i, sess.run(accuracy,feed_dict={x:mnist_x, y_true:mnist_y})))
# 保存模型
saver.save(sess, '/home/hbsi/Documents/ckpt/fc_model')
else:
# 加载模型
saver.restore(sess, '/home/hbsi/Documents/ckpt/fc_model')
# 如果是Flase,做出预测
for i in range(100):
# 每次测试一张图片 [0,0,0,0,0,1,0,0,0,0]
x_test, y_test = mnist.test.next_batch(1)
print('第{}张图片,手写数字目标是:{},预测结果是:{}'.format(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__':
full_connected()
四、深层的神经网络——卷积神经网络(CNN)
- 深度学习网络更常见的单一隐藏层神经网络的区别在于深度,深度学习网络中,每一个节点层在前一层输出的基础上学习识别一组特定的特征。随着神经网络深度增加,节点所能识别的特征也就越来越复杂。
1、卷积神经网络与简单的单层神经网络的比较
- 全连接神经网络的缺点
- 参数太多,在cifar-10的数据集中,只有 32x32x3,就会有这么多权重,如果说更大的图片,比如 200x200x3 就需要120000多个,这完全是浪费
- 没有利用像素之间位置信息,对于图像识别任务来说,每个像素与周围的像素都是联系比较紧密的。
- 层数限制
- 卷积神经网络错误率
2、卷积神经网络的发展历史
3、卷积神经网络的结构分析
神经网络(neural networks)的基本组成包括输入层、隐藏层、输出层。而卷积神经网络的特点在于隐藏层分为卷积层和池化层(pooling layer,又叫下采样层)。
- 卷积层:通过在原始图像上平移来提取特征
- 池化层:通过特征后稀疏参数来减少学习的参数,降低网络的复杂度,(最大池化和平均池化)
卷积神经网络的结构
卷积层过滤器
个数 · 输入体积大小H1 x W1 x D1
大小(1x1,3x3,5x5) · 四个超参数:
步长
零填充 ○ Filter数量K
○ Filter大小F
卷积层输出深度、输出宽度 ○ 步长S
深度由过滤器个数决定 ○ 零填充大小P
输出宽度 —————————> · 输入体积大小H2 x W2 x D2
○ H2 = (H1 - F + 2P)/S + 1
激活函数 ○ W2 = (W1 - F + 2P)/S + 1
池化层 ○ D2 = K
全连接层
注:在大型网络当中会有一个droupout层(减少过拟合)
后续: 待更……