神经网络介绍
- 神经网络
- 在机器学习和认知科学领域,人工神经网络(artificial neural network,缩写ANN),简称神经网络(neural network,缩写NN)或类神经网络,是一种模仿生物神经网络的结构和功能的计算模型,用于对函数进行估计或近似。
- 神经网络的分类(人工神经网络)
- 神经网络前身: 单层感知机
- 基础神经网络:线性神经网络,BP神经网络,Hopfield神经网络等
- 进阶神经网络:玻尔兹曼机,受限玻尔兹曼机,递归神经网络等
- 深度神经网络:深度置信网络,卷积神经网络(CNN),循环神经网络,LSTM网络等
- 神经网络的特点
- 输入向量的特征数量和输入神经元的个数相同
- 输出层的神经元数量和种类数量相同
- 每个连接都有个权重值
- 同一层神经元之间没有连接
- 由输入层,隐层,输出层组成
- 第N层与第N-1层的所有神经元连接,也叫全连接
- 简单的神经网络模型
- 神经网络模型示例
- 输入层、隐层、输出层 (隐层和输出层统称为全连接层)
- 神经元模型示例
- 输入向量的特征数量和输入神经元的个数相同
- 中间层三个神经元的示例
- 神经网络的组成
- 结构: 组成神经网络的神经元
- 激励函数:隐层和输出层节点的输入和输出之间具有函数关系,这个函数称为激励函数
- 学习规则:学习规则制定了网络中的权重如何随着时间的推进而调整(反向传播算法)
- TensowFlow提供神经网络功能的主要模块
- tf.nn:
- 神经网络相关操作的支持,包括卷积操作(conv)、池化操作(pooling)、归一化、loss、分类操作、embedding、RNN、Evaluation
- tf.layers:
- 主要提供的高层的神经网络,主要和卷积相关的,对tf.nn的进一步封装
- tf.contrib:
- tf.contrib.layers提供够将计算图中的 网络层、正则化、摘要操作、是构建计算图的高级操作
神经网络前身--感知机
- 什么是感知机
- 有n个输入数据,通过权重与各数据之间进行加权求和,求和后的结果经过激活函数结果(0/1),得出输出
- 很容易解决与、或问题
- 通过多个感知机,可以将结果分类的区域划分的越来越准确
- 用模型表示
- 感知机与逻辑回归的联系和区别
- 联系: 都可以用来做分类的学习
- 区别:激活函数不一样,感知机使用的额是sign函数,输出值是0/1,只能判断简单的分类问题, 逻辑回归使用的是sigmid函数, 结果为0-1, 可以预测为某一个分类的准确概率, 更为广泛使用
浅层(单一隐层)神经网络
- 概念
- 只有一层隐藏层的神经网络
- 目标值处理
- one-hot编码
- one-hot api介绍
- 作用: 将一组目标集转化为one-hot编码
- tf.one_hot(indices, depth, on_value=None, off_value=None, axis=None, dtype=None, name=None)
- indices: 数据集标签, 目标值集合
- depth: 张量的深度, 即类别数
- SoftMax回归函数
- 作用:
- 将一组结果数据转化为[0, 1] 两个之间的数, 为1的数代表预测结果为该分类
- 公式
- 使用位置
- 在特征值经过加权和偏置计算后,经过softmax函数, 得到最终预测的概率结果
- 图示
- 特征的加权计算
- tensorflow加权计算api
- tf.matmul(a, b,name=None)
- a: 特征值矩阵
- b: 加权矩阵
- 损失计算
- 损失计算-交叉熵损失公式
- 损失计算api
- s = tf.nn.softmax_cross_entropy_with_logits(labels=None, logits=None,name=None) 计算交叉熵损失
- labels:标签值(真实值)
- logits:样本加权之后的值
- return:返回损失值列表
- 损失均值计算api
- tf.reduce_mean(s) 获取损失的平均值
- 损失的优化--梯度下降
- tf.train.GradientDescentOptimizer(learning_rate).minimize(loss)
- learning_rate: 学习率,一般为
- minimize(loss): 最小化损失
- return: 梯度下降op
- 模型准确性计算
- equal_list = tf.equal(tf.argmax(y, 1), tf.argmax(y_label, 1)) 返回每一行的最大值的索引
- equal_list = tf.equal(tf.argmax(y, 0), tf.argmax(y_label, 0)) 返回每一列的最大值的索引
- equal_list = tf.equal(tf.argmax(y, 2), tf.argmax(y_label, 2)) 返回每行每列的最大值
- accuracy = tf.reduce_mean(tf.cast(equal_list, tf.float32))
- y: 预测结果的集合
- x: 目标集合
- 神经网络实现流程
- 1、准备数据
- 2、全连接结果计算
- 3、损失优化
- 4、模型评估(计算准确性)
深层神经网络(卷积神经网络介绍)
- 概念
- 深度学习网络与更常见的单一隐藏层神经网络的区别在于深度,深度学习网络中,每一个节点层在前一层输出的基础上学习识别一组特定的特征。随着神经网络深度增加,节点所能识别的特征也就越来越复杂
- 为什么引入深层神经网络
- 全连接神经网络具有一定的局限性
- 当数据的特征特别多的时候, 每一个特征值都会有一个权重, 这时每一个神经元都需要很多个权重值
- 这样就会很影响资源, 造成资源的浪费, 影响训练
- 增加隐藏层数, 可以每层逐渐的减少所需权重的数量
- 什么是卷积神经网络
- 卷积神经网络,是一种前馈神经网络,人工神经元可以响应周围单元,可以进行大型图像处理。卷积神经网络包括卷积层和池化层。
- 卷积神经网络的发展历史
- 卷积神经网络的特点
- 神经网络(neural networks)的基本组成包括输入层、隐藏层、输出层。
- 而卷积神经网络的特点在于隐藏层分为卷积层和池化层(pooling layer,又叫下采样层)
- 卷积神经网络的结构分析
- 训练结构图
- 卷积层(CONV):
- 卷积层介绍
- 通过Filter(过滤器)在原始图像上平移来提取并转化特征, 使转化后的特征可以提供给池化层进行数据的池化
- 卷积层过滤器参数介绍
- 个数
- 大小(1*1,3*3,5*5)
- 步长
- 零填充
- 卷积层输出的参数介绍
- 深度由过滤器个数决定
- 输出长度和宽度:由filter尺寸和步长决定
- RELU激活函数
- 使用Relu函数的优点
- 第一,采用sigmoid等函数,反向传播求误差梯度时,计算量相对大,而采用Relu激活函数,整个过程的计算量节省很多
- 第二,对于深层网络,sigmoid函数反向传播时,很容易就会出现梯度消失的情况(求不出权重和偏置)
- 函数图形
- 激活函数使用api
- tf.nn.relu(features, name=None)
- features:卷积后加上偏置的结果
- return:结果
- 池化层(POOL):
- 池化层介绍
- 通过特征后稀疏参数来减少学习的参数,降低网络的复杂度,(最大池化和平均池化)
- Pooling层主要的作用是特征提取,通过去掉Feature Map中不重要的样本,进一步减少参数数量。
- Pooling的方法很多,最常用的是Max Pooling。2*2 2步长
- 数据的池化过程图例
- 池化使用api
- tf.nn.max_pool(value, ksize=, strides=, padding=,name=None) 输入上执行最大池数
- value:4-D Tensor形状[batch, height, width, channels]
- ksize:池化窗口大小,[1, ksize, ksize, 1]
- strides:步长大小,[1,strides,strides,1]
- padding:“SAME”, “VALID”,使用的填充算法的类型,使用“SAME”
- 全连接层(FC):
- 全连接层在卷积神经网络中介绍
- 前面的卷积和池化相当于做特征工程,后面的全连接相当于做特征加权。最后的全连接层在整个卷积神经网络中起到“分类器”的作用。
- 卷积神经网络相关参数计算
- 输入值的体积
- H1 * W1 * D1
- 卷积层过滤器四个超参数
- Filter数量K
- Filter大小K
- 步长S
- 零填充大小P
- 卷积层过滤器输出体积大小
- H2 = (H1-F+2P)/S + 1
- W2 = (W1-F+2P)/S +1
- D2 = K
- 数据特征的变化过程
- 数据在经过多个卷积层后的变化
- 宽度和高度在缩小, 深度不断的增加(深度和卷积层的过滤器数量相关)
- 单个卷积层(2个Filter)的过程示例
- 卷积层的零填充
- 定义
- 卷积核在提取特征映射时的动作称之为padding(零填充)
- 由于移动步长不一定能整出整张图的像素宽度。其中有两种方式,SAME和VALID
- 两种零填充的方式
- 1. SAME:越过边缘取样,取样的面积和输入图像的像素宽度一致。
- 2. VALID:不越过边缘取样,取样的面积小于输入人的图像的像素宽度
- 卷积网络卷积操作零填充api介绍
- tf.nn.conv2d(input, filter, strides=, padding=, name=None) 卷计划操作
- input:给定的输入张量,具有[batch,heigth,width, channel],类型为float32,64
- filter:指定过滤器的大小,[filter_height, filter_width,in_channels, out_channels]
- strides:strides = [1, stride, stride, 1],步长
- padding:“SAME”, “VALID”,使用的填充算法的类型,使用“SAME”。其中”VALID”表示滑动超出部分舍弃,SAME”表示填充,使得变化后height,width一样大
神经网络总结
- 输入层的矩阵的特征数量和特征的数量(样本的列数)相等
- 输出层的矩阵的列数与分类数量相等
- 经过矩阵变换的矩阵: 行数=左矩阵的行, 列数= 右矩阵的列
- 每个矩阵代表全连接层的一层隐层
- 矩阵中的每一列代表一个神经元
- 一个全连接层和一有多个隐层,即多个矩阵
- 偏置的列数应该等于矩阵的行数