【深度学习】常见的神经网络层(上)

🔝🔝🔝🔝🔝🔝🔝🔝🔝🔝🔝🔝
🥰 博客首页:knighthood2001
😗 欢迎点赞👍评论🗨️
❤️ 热爱python,期待与大家一同进步成长!!❤️
👀 给大家推荐一款很火爆的刷题、面试求职网站 👀

深度学习基本原理其实与人工神经网络的思想是一致的,而人工神经网络是从信号处理角度对于人的大脑神经元网络的抽象模型。简单来说,在一个系统中,输入信号通过某一层处理之后输出了另一个信号, 当输入信号和输出信号之间互相连接的处理层数更多、结构更复杂时,即可将其看作一个人工神经网络。
这样也就反映出了深度学习同样是一个处理单元串接另外一个处理单 元的结构,这种结构与人的神经元之间进行神经冲动的传播形式是一样的。 因此, 我们将深度学习中的每一个处理单元称为一个层,通过不同种类的层之间相互堆叠,形成了一个完整的、能够实现一定功能的复杂网络,这个比传统的人工神经网络更为复杂的网络便是深度学习神经网络。

因此,我们通过对每一个深度学习网络的层进行抽象,由深度学习库来实现每一个层,并提供给用户进行使用, 然后我们就可以像搭积木一样来构建属于我们自己的深度学习神经网络了。当前的绝大多数的深度学习框架也都是按照这个思路来实现的,keras也不例外。

此外,对于一个深度学习神经网络,无论简单的也好,复杂的也罢,都是通过一个个神经网络层连接起来的,笔者争对一些常用的神经网络层进行简单的介绍。

目录

1、全连接层

函数定义

参数含义

举例

2、二维卷积层

函数定义

参数含义

举例

3、池化层

函数定义

参数含义

举例

4、总结

1、全连接层

全连接层的每一个节点都与上一层所有的节点相连,从而把前边提取到的特征综合起来。

函数定义

在keras中全连接层即Dense层,其完整的定义如下:

keras.layers.Dense(units,activation=None,use_bias=True,kernel_initializer='glorot_       uniform',bias_initializer='zeros',kernel_regularizer=None,bias_regularizer=None,activity_regularizer=None,kernel_constraint=None,bias_constraint=None,**kwargs)

参数含义

units:是一个正整数,表示输出空间的维度;
activation=None:激活函数,默认不使用激活函数,即线性激活,输入与输出相同;
use_bias=True:布尔型变量,代表该层是否使用偏置向量;
kernel_initializer='glorot_uniform':kernel权值矩阵的初始化器;
bias_initializer='zeros':偏置向量的初始化器;
kernel_regularizer=None:运用到kernel权值矩阵的正则化函数;
bias_regularizer=None:运用到偏置向量的正则化函数;
activity_regularizer=None:运用到输出结果的正则化函数;
kernel_constraint=None:运用到kernel权值矩阵的约束函数;
bias_constraint=None:运用到偏置向量的约束函数。

对于序列模型的第1层的Dense层,需要指定输人数据的维度,即 input_shape参数

Dense层在Keras中实现以下操作:

output = activation(input·kernel + bias)

其中,activation 是按逐个元素计算的激活函数 ;kernel是由网络层创建的权值矩阵,其与输入该层的input矩阵进行点乘;bias是由层创建的偏置向量(仅在 use_bias 为 True 时适用)。这些都是 Dense 的属性。

Input_shape:N-D 张量,形状:(batch_size, ..., input_dim)。最常见的情况是形状为 (batch_size, input_dim) 的 2D 输入。
Output_shape:N-D 张量,形状:(batch_size, ..., units)。例如,对于形状为 (batch_size, input_dim) 的 2D 输入,输出的形状为 (batch_size, units)。

举例

import keras.layers
import tensorflow as tf

model = tf.keras.models.Sequential()
model.add(tf.keras.Input(shape=(16,)))
model.add(tf.keras.layers.Dense(32, activation='relu'))
model.add(tf.keras.layers.Dense(32))
print(model.output_shape)

创建一个”Sequential”模型并添加一个 Dense 层作为第一层。

现在模型将采用形状 (None, 16) 的输入数组和形状 (None, 32) 的输出数组。

注意,在第一层之后,你不需要再指定输入的大小了。

2、二维卷积层

在对图像数据进行处理时,用卷积进行处理具有天然代势,因此应用最多的神经网络层主要就是卷积层。 在卷积层中使用参数共享可以用来控制参数的数量,因此卷积层不像全连接层那样具有非常多的参数,可以减少过拟合现象,同时也能加快网络中计算的速度。

以卷积层为主的神经网络层即为 卷积神经网络(Convolutional Neural Network,CNN).通常的卷积神经网络主要由输入层、卷积层、激活函数、池化层、全连接层等组成,卷积神经网络在图像处理、语音识别等领域具有重要作用。当前主流的人脸识别深度学习神经网络基本都是卷积神经网络。

Keras为我们提供的卷积层不仅有 二维卷积层一种,还包括 一维卷积层三维卷积层,同时还有 深度方向可分离的卷积层以及 反卷积层等。由于 一维卷积主要用于时序数据处理,二维卷积用于对图像的空间卷积,三维卷积主要用于对立体空间卷积,因此笔者在这里主要介绍二维卷积。

函数定义

Keras为我们提供的二维卷积即为Conv2D层,其完整的定义如下:

keras.layers.Conv2D(filters,kernel_size,strides=(1, 1),padding='valid',
data_format=None,dilation_rate=(1, 1),groups=1,activation=None,
se_bias=True,kernel_initializer='glorot_uniform',bias_initializer='zeros',
kernel_regularizer=None,bias_regularizer=None,activity_regularizer=None,
kernel_constraint=None,bias_constraint=None,**kwargs)

参数含义

filters:卷积核的个数,即卷积操作后输出空间的维度。
kernel_size: 可以是一个整数,也可以是一个元组,表示卷积窗口的宽度和高度。
strides=(1, 1):可以是一个整数, 也可以是一个元组,表明卷积沿宽度和高度方向的步长,即卷积操作每一步移动的步长。
padding='valid':只能为"valid"或"same",设置图像在卷积过程中边界像素如何填充。
data_format=None:可以设置为"channels_last" (默认) 或"channels_frst"二者之一,表示输入中维度的顺序。
dilation_rate=(1, 1):可以是一个整数,也可以是一个元组,指定膨胀卷积的膨胀率。
groups=1:一个正整数,指定输入沿通道轴拆分的组数。每个组分别与"过滤器组"过滤器进行卷积。输出是沿通道轴的所有"组"结果的串联。输入通道和"过滤器"都必须能被"组"整除。
activation=None:卷积层要使用的激活函数。默认不激活,输入输出相同,即f(x)=x。
use_bias=True:指定该层是否使用偏置向量。
kernel_initializer='glorot_uniform':kernel权值矩阵的初始化器。
bias_initializer='zeros':偏置向量的初始化器。
kernel_regularizer=None:应用于kernel权重矩阵的正则化函数。
bias_regularizer=None:运用到偏置向量的正则化函数。
activity_regularizer=None:运用到层输出(它的激活值)的正则化函数。
kernel_constraint=None:运用到kernel权值矩阵的约束函数。
bias_constraint=None:运用到偏置向量的约束函数。
Input shape:
  4+D tensor with shape: batch_shape + (channels, rows, cols) if
    data_format='channels_first'
  or 4+D tensor with shape: batch_shape + (rows, cols, channels) if
    data_format='channels_last'.

Output shape:
  4+D tensor with shape: batch_shape + (filters, new_rows, new_cols) if
  data_format='channels_first' or 4+D tensor with shape: batch_shape +
    (new_rows, new_cols, filters) if data_format='channels_last'.  rows
    and cols values might have changed due to padding.

该层创建了filters 个卷积核,使用这些尺寸的卷积核对输入数据进行卷积计算并生成输出数据。每一个卷积核对应一个输出数据,被称为特征图( feature map)。如果使用该层作为模型的第1层,需要提供 input_shape参数。例如,输人数据为64×64像素的彩色图片,在data_fomat参数为canels_last (默认值,可不更改)时,该参数值应该设置为input_shape=(64, 64, 3)。

卷积层进行的计算就是对前一层数据做卷积运算,二维卷积层也就是对图像进行卷积运算。假设输入的图像是64 x64大小的RGB彩色图像,则其尺寸大小为(64, 64,3),那么我们就可以通过如下代码实现一个卷积层。

举例

from keras.models import Sequential
from keras.layers import Conv2D

产生一个序列模型对象
model = Sequential()
model.add(Conv2D(kernel_size=(9, 9), activation="relu", filters=48, strides=(4, 4), input_shape=(64, 64, 3)))
print(model.output_shape)

在上面的代码中我们可以看到,如果卷积层作为输入层的话,需要提前指定输人数据的维度。上述彩色图像是(64, 64, 3),如果将其转换为灰度图像的话,那么输入数据的维度就变成了(64, 64,1)。与此同时,我们给定卷积核的尺寸kermel_size为(9,9),这是卷积层中每一个filter的尺寸,由于经过卷积核得到的特征图都源自这个的卷积核与原图像中9×9的区域做卷积运算,因此该卷积层的感受野为(9×9), strides 参数是(4, 4)。

值得一提的是, 卷积核除了具有高度和宽度之外,也具有通道数。例如上面的例子中,我们使用的是RGB图像,对应了3个通道,那么卷积层同样具有3个通道,在卷积计算过程中输人数据分别乘以卷积核对应的RGB图像3个通道的数值,再相加,从而得到输出张量对应位置的数值。

其中 activation参数指的是该层的激活函数ReLU 是一种常用的激活函数,被称为线性整流函数,该函数具有加快模型训练时收敛速度的优点,其函数形式(如下)很容易理解。

f(x) = max(O,x)

3、池化层

池化层也称为抽样层,是一种在图像的特定范围内聚合不同位置特征的操作。这是因为卷积运算后的图像具有局部特征,并且图像的每个像素区域通常具有很高的相似性。图像区域中的特征平均值或最大值可以用来表示该区域的整体特征,分别称为 均值池化最大池化。这样做不仅可以压缩数据,还会改善结果,使得神经网络不容易发生过拟合。

池化层一般与卷积层结合在一起使用,在卷积层的后面放置一层池化层能够有效减少数据量,起到降采样的作用。因此,这个过程也可以看作对经过卷积层运算之后的结果进行进一步的特征提取与压缩的过程。

典型的池化方式有以下3种。

①均值池化(mean-pooling):选择特定区域中所有值的均值。

②随机池化(stachastic-poling):随机选择特定区域中的任意一个值。

③最大池化(max-poling);选择特定区域中值最大的值。这也是 最常用的一种池化方式。

【深度学习】常见的神经网络层(上)

如上图展示了池化过程,池化过程的滑动窗口大小为4×4,从左到右,从上到下依次滑动,在不重叠的情况下,可获得最大池化后的输出结果,获得均值池化的输出结果如上。

通过上面的例子,我们可以看到一个4×4维度的数据,经过池化后变成了2×2的数据,数据得到了进一步的压缩。

使用池化与卷积层进行配合,使用的另一个 好处就是具有更好的平移不变性,因为图像平移前后的数据经过池化,数据后的差距可能已经很小了。

函数定义

keras提供了很多种池化层,与卷积层一样,我们在图像处理中同样可以使用二维池化层,其定义如下:

keras.layers.MaxPooling2D(pool_size=(2, 2),strides=None,padding='valid',
data_format=None,**kwargs)

参数含义

pool_size=(2, 2):池化窗口的大小,可以是一个整数或者由两个整数组成的元组。默认值为(2, 2)。例如上面,其池化窗口大小就为(2, 2)。如果只使用一个整数,那么两个维度都会使用同样的窗口长度。
strides=None:可以是整数、整数元组或是None,代表池化窗口进行滑动的步长值。池化窗口都是不重复的,默认值None即代表与pool sie 相同,如果进行重叠池化,即相邻池化窗口之间会有重叠区域,则可以自定义此值。
padding='valid':"valid" 或"same"之一。"valid"表示没有填充。"same"导致在输入的左右或上下均匀填充,以使输出具有与输入相同的高宽尺寸。代表池化窗口滑动到图像边界区域时,边界区域被池化窗口覆盖后尚有空余时的处理方式。
data_format=None:输入张量中的维度顺序,是一个字符串,可以设置为" channels_first"
或"channels_last"之一,代表图像的通道维的位置。channels_last对应于形状为 (batch, height, width, channels)的输入,而 channels_first对应于形状为 (batch, channels, height, width) 的输入。如果您从未设置它,那么它将是"channels_last"。
Input shape:
  - If data_format='channels_last':
    3D tensor with shape (batch_size, steps, features).

  - If data_format='channels_first':
    3D tensor with shape (batch_size, features, steps).

Output shape:
  - If data_format='channels_last':
    3D tensor with shape (batch_size, downsampled_steps, features).

  - If data_format='channels_first':
    3D tensor with shape (batch_size, features, downsampled_steps)

类似的,二维平均池化定义如下:

keras.layers.AveragePooling2D(pool_size=(2, 2),strides=None,padding='valid',
data_format=None,**kwargs)

举例

演示了在卷积层后面接上一个池化层

from keras.models import Sequential
from keras.layers import Conv2D
from keras.layers import MaxPooling2D

产生一个序列模型对象
model = Sequential()
model.add(Conv2D(kernel_size=(9, 9), activation="relu", filters=48, strides=(4, 4), input_shape=(64, 64, 3)))

在一个卷积层后面接上一个池化层
model.add(MaxPooling2D((3, 3), strides=(2, 2), padding='same'))
print(model.output_shape)

4、总结

以上只是讲了一部分常见的神经网络层,后续会继续更新该方面知识!!如果觉得笔者写的不错的话,记得支持一下!!

Original: https://blog.csdn.net/knighthood2001/article/details/124915809
Author: knighthood2001
Title: 【深度学习】常见的神经网络层(上)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/730261/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 期货因子分析(四)

    目录 回顾 代码 * 分析 结果 总结 期待 回顾 期货因子分析(三) 因子分析 factor analysis (六) :用因子分析法进行综合评价 因子分析在股票市场中的应用 多…

    Python 2023年8月21日
    043
  • 链表基础知识详解(非常详细简单易懂)

    概述: 链表作为 C 语言中一种基础的数据结构,在平时写程序的时候用的并不多,但在操作系统里面使用的非常多。不管是RTOS还是Linux等使用非常广泛,所以必须要搞懂链表,链表分为…

    Python 2023年9月30日
    038
  • pytest系列之参数化

    1.1 方法参数详解 @pytest.mark.parametrize(arg_name, arg_value) arg_name:参数名称,用于将参数值传递给测试用例 arg_v…

    Python 2023年9月13日
    024
  • 万物皆可秒——淘宝秒杀Python脚本,扫货618,备战双11!

    更多精彩内容, 欢迎关注公众号:数量技术宅,也可添加技术宅 个人微信号:sljsz01,与我交流。 总是抢不到想要的宝贝?试试Python脚本 对于淘宝、天猫,相信大家已经无比的熟…

    Python 2023年6月3日
    0157
  • python pytest接口自动化教程 – 01、了解

    一、pytest介绍 官网:https://docs.pytest.org/en/7.1.x/ 什么是pytest? pytest是一款非常成熟的全功能的Python测试框架~ 为…

    Python 2023年9月10日
    041
  • Python安装Graphviz 详细图文教程

    @Python 安装Graphviz 详细教程 Python安装Graphviz画图器 首先,要明确他是一个独立的软件,如果大家用pip的方法装了graphviz可以先卸载 pip…

    Python 2023年8月1日
    064
  • pytest接口自动化测试框架 | @pytest.fixture()装饰器

    视频来源:B站《冒死上传!pytest接口自动化测试框架(基础理论到项目实战及二次开发)教学视频【软件测试】》 一边学习一边整理老师的课程内容及试验笔记,并与大家分享,侵权即删,谢…

    Python 2023年9月10日
    041
  • 爬虫一些常用代码的记录

    写了一个GK2A卫星数据爬取的程序,本身不难,记录下小知识。 根据URL下载文件,有些需要cookie,大文件下载防止文件损坏 headers = { "Content-…

    Python 2023年10月31日
    030
  • 昨晚停网后,我写了一段Python代码攻破了隔壁老王家的wifi密码

    啊哦~你想找的内容离你而去了哦 内容不存在,可能为如下原因导致: ① 内容还在审核中 ② 内容以前存在,但是由于不符合新 的规定而被删除 ③ 内容地址错误 ④ 作者删除了内容。 可…

    Python 2023年9月29日
    042
  • 【愚公系列】2022年04月 Python教学课程 72-DRF框架之认证和权限

    身份验证是将传入请求与一组标识凭据(如请求来自的用户或签名时使用的令牌)关联的机制。然后,权限和限制策略可以使用这些凭据来确定是否应允许请求。 REST 框架提供了几种开箱即用的身…

    Python 2023年8月4日
    082
  • Flask介绍

    一、简介 Flask得核心在于werkzeug(路由模块),jinja2模板引擎 类比Django:路由、模板、ORM Flask要完成功能,依赖于丰富的插件(扩展模块) 常用问题…

    Python 2023年8月11日
    063
  • python拆包和封包

    """python的拆包和封包之 *号在函数形参和实参的区别1. 在函数形参定义时添加*就是封包过程,封包默认是以元组形式进行封包2. 在函数实参调用…

    Python 2023年5月24日
    079
  • 自学 TypeScript 第三天 使用webpack打包 TS 代码

    前言: 大家好啊,昨天介绍了 TS 编译器的配置,但在我们实际开发当中直接使用 TS 编译器去编译代码的情况会有,但没有很多,因为我们在开发大型项目的时候,一般我们都会用到打包工具…

    Python 2023年10月15日
    033
  • python CV2库

    1.读入一张图片 2.显示图片 3.保存图片 4.灰度图和彩色图片相互转化 5.图像缩放 6.图像翻转 安装的时候是pip install opencv_python 但是在导包的…

    Python 2023年8月3日
    067
  • pandas新建dataframe_如何迭代pandas dataframe并创建新列

    我认为您可以使用双^{},什么是更快的循环:df[‘Column3’] = np.where(df[‘Column2’]==vari…

    Python 2023年8月8日
    033
  • [Django] Django基础环境配置 | 日记

    step1 : 设置python 虚拟环境并激活,然后安装Django开发版本这里可以本人参考博客 step2 : 新建项目之前安装Django以及虚拟环境都是在C盘下处理的,在这…

    Python 2023年8月5日
    056
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球