【机器学习炼丹术】的学习笔记分享

<<小白学PyTorch>>

扩展之Tensorflow2.0 | 20 TF2的eager模式与求导

扩展之Tensorflow2.0 | 19 TF2模型的存储与载入

扩展之Tensorflow2.0 | 18 TF2构建自定义模型

扩展之Tensorflow2.0 | 17 TFrec文件的创建与读取

扩展之Tensorflow2.0 | 16 TF2读取图片的方法

扩展之Tensorflow2.0 | 15 TF2实现一个简单的服装分类任务

小白学PyTorch | 14 tensorboardX可视化教程

小白学PyTorch | 13 EfficientNet详解及PyTorch实现

小白学PyTorch | 12 SENet详解及PyTorch实现

小白学PyTorch | 11 MobileNet详解及PyTorch实现

小白学PyTorch | 10 pytorch常见运算详解

小白学PyTorch | 9 tensor数据结构与存储结构

小白学PyTorch | 8 实战之MNIST小试牛刀

小白学PyTorch | 7 最新版本torchvision.transforms常用API翻译与讲解

小白学PyTorch | 6 模型的构建访问遍历存储(附代码)

小白学PyTorch | 5 torchvision预训练模型与数据集全览

小白学PyTorch | 4 构建模型三要素与权重初始化

小白学PyTorch | 3 浅谈Dataset和Dataloader

小白学PyTorch | 2 浅谈训练集验证集和测试集

小白学PyTorch | 1 搭建一个超简单的网络

小白学PyTorch | 动态图与静态图的浅显理解

参考目录:

  • 1 Keras卷积层

    • 1.1 Conv2D

    • 1.2 SeparableConv2D

    • 1.3 Conv2DTranspose

  • 2 Keras参数初始化

    • 2.1 正态分布

    • 2.2 均匀分布

    • 2.3 截尾正态分布

    • 2.4 常数

    • 2.5 Xavier/Glorot

    • 2.6 自定义初始化

  • 3 Keras激活函数

    • 3.1 relu

    • 3.2 sigmoid

    • 3.3 softmax

    • 3.4 softplus

    • 3.5 softsign

    • 3.6 tanh

    • 3.7 selu

  • 4 Keras的L1/L2正则

    • 4.1 L1/L2正则

    • 4.2 自定义正则化

我们对Keras应该已经有了一个直观、宏观的认识了。现在,我们来系统的学习一下Keras的一些关于网络层的API,本文的主要内容是围绕卷积展开的,包含以下的内容:

  • 不同类型的卷积层;

  • 不同的参数初始化方式;

  • 不同的激活函数;

  • 增加L1/L2正则;

  • 不同的池化层;

  • 多个Normalization层;

  • 其他的常用层。

本文内容较多,对于API的学习了解即可。

1 Keras卷积层

Keras的卷积层和PyTorch的卷积层,都包括1D、2D和3D的版本,1D就是一维的,2D是图像,3D是立体图像。这里就用最常见的2D图像来做讲解,1D和3D和2D基本相同,不多赘述。

1.1 Conv2D

先看Conv2D的所有参数:

tf.keras.layers.Conv2D(filters,kernel_size,strides=(1, 1),padding="valid",data_format=None,dilation_rate=(1, 1),groups=1,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
)

先看一个简单的例子:

import tensorflow as tf
input_shape = (4, 28, 28, 3)
x = tf.random.normal(input_shape)
y = tf.keras.layers.Conv2D(filters=2,kernel_size=3,activation='relu',padding='same'
)
print(y(x).shape)
>>> (4, 28, 28, 2)

现在来看参数含义

  • filter: 一个int整数,输出特征图的通道数;

  • kernel_size:一个int整数,卷积核大小;

  • strides:一个整数或者是(a,b)这样的list,表示卷积核是否跳步;

  • padding'valid'表示没有padding,'same'表示输出和输入特征图的尺寸相同;只有这两种选择

  • data_format'channels_last'或者是'channels_first'。默认是'channels_last',表示特征图的最后一个维度是通道,(batch_size, height, width, channels) ;如果选择了'channels_first'表示每一个样本的第一个维度是通道,所以特征图的格式和PyTorch的格式相同,(batch_size, channels, height, width)。

  • dilation_rate:碰撞卷积的设置,默认是1,1就是一般的卷积。需要注意的是dilation_rate和stride目前不支持同时不为1,换句话说,如果要膨胀卷积的话,那么stride必须是1;

  • groups;分组卷积;

  • activation:这个表示,可以直接在卷积层后面设置一个激活层,比方说'relu',这个在后面的章节会详细讲解目前Keras支持的所有激活层,如果什么都不填入,则不使用激活层

  • use_bias:一个bool参数,True表示使用bias,默认是True;

  • kernel_initializer:卷积核的初始化的方法,这个会在后面的章节详细讲解;

  • bias_initializer:偏置的初始化的方法,这个会在后面的章节详细讲解;

  • kernel_regularizer:卷积核的正则化的方法,在后面的章节会详细讲解;

  • bias_regularizer:偏置的正则化的方法,在后面的章节会详细讲解;

1.2 SeparableConv2D

Keras直接提供了深度可分离卷积层,这个层其实包含两个卷积层(了解深度可分离卷积的应该都知道这个吧),一层是depthwise,一层是pointwise。

这个SeparableConv2D的参数也很多,与Conv2D有很多重复的参数,就不多加赘述了:

tf.keras.layers.SeparableConv2D(filters,kernel_size,strides=(1, 1),padding="valid",data_format=None,dilation_rate=(1, 1),depth_multiplier=1,activation=None,use_bias=True,depthwise_initializer="glorot_uniform",pointwise_initializer="glorot_uniform",bias_initializer="zeros",depthwise_regularizer=None,pointwise_regularizer=None,bias_regularizer=None,activity_regularizer=None,depthwise_constraint=None,pointwise_constraint=None,bias_constraint=None,**kwargs
)

参数详解:

  • depth_multiplier:depthwise卷积之后,一般会增多通道数。比方说输入通道是16个,那么输出通道数64个,然后再输入到pointwise卷积层。这个depth_multiplier就是depthwise卷积层的通道数的扩增系数,在上面的例子中这个扩增系数是4;

  • depthwise_initializerpointwise_initializer不用多说,就是两个卷积层的卷积核的初始化的方法。

但是这个深度可分离卷积完全可以用一般的Conv2D来构建,所以其实在用到深度可分离卷积的时候,自己会重新构建一个这样的网络层

1.3 Conv2DTranspose

对于上采样,这种方法应该并不陌生。Transposed convolution有的时候也被称为Deconvolution去卷积

tf.keras.layers.Conv2DTranspose(filters,kernel_size,strides=(1, 1),padding="valid",output_padding=None,data_format=None,dilation_rate=(1, 1),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
)

参数详解:

  • output_padding:一个整数或者list,用来给输出的特征图增加一个padding的效果,默认是None,不添加padding;

对于去卷积,可能会比较生疏,这里多讲几个例子

1.3.1 去卷积的例子1

import tensorflow as tf
from tensorflow import kerasinput_shape = (4, 28, 28, 3)
x = tf.random.normal(input_shape)
y = keras.layers.Conv2DTranspose(filters=10,kernel_size=3,strides=1,padding='same')
print(y(x).shape)
>>> (4, 28, 28, 10)

但是假如我们去掉了padding=‘same’

input_shape = (4, 28, 28, 3)
x = tf.random.normal(input_shape)
y = keras.layers.Conv2DTranspose(filters=10,kernel_size=3,strides=1)
print(y(x).shape)
>>> (4, 30, 30, 10)

这是因为去卷积的卷积核的中心是从原特征图的边界之外开始计算的。一个3乘3的卷积核,那么当卷积核的右下角与原特征图的左上角重合的时候,去卷积的就已经进行了一次运算,而一般的卷积是只有当卷积核的全部都与原特征图重合的时候,才进行计算的。(这里的讲解不太细致,因为之前在其他的文章中已经讲过去卷积的详细过程了)。

1.3.2 去卷积的例子2

现在把stride改成2

input_shape = (4, 28, 28, 3)
x = tf.random.normal(input_shape)
y = keras.layers.Conv2DTranspose(filters=10,kernel_size=3,strides=2)
print(y(x).shape)
>>> (4, 57, 57, 10)

假如加上padding='same'

input_shape = (4, 28, 28, 3)
x = tf.random.normal(input_shape)
y = keras.layers.Conv2DTranspose(filters=10,kernel_size=3,strides=2,padding='same')
print(y(x).shape)
>>> (4, 56, 56, 10)

所以一般情况下,使用的参数是strides=2,padding='same',这样特征图的尺寸就刚好放大一倍。

2 Keras参数初始化

把之前提到的简单的例子,增加卷积核和偏置的初始化:

import tensorflow as tf
input_shape = (4, 28, 28, 3)
initializer = tf.keras.initializers.RandomNormal(mean=0., stddev=1.)
x = tf.random.normal(input_shape)
y = tf.keras.layers.Conv2D(filters=2,kernel_size=3,activation='relu',padding='same',kernel_initializer=initializer,bias_initializer=initializer
)
print(y(x).shape)
>>> (4, 28, 28, 2)

简单的说,就是先定义一个初始化器initializer,然后把这个初始化器作为参数传给Keras.Layers就行了。

2.1 正态分布

tf.keras.initializers.RandomNormal(mean=0.0, stddev=0.05, seed=None)

2.2 均匀分布

tf.keras.initializers.RandomUniform(minval=-0.05, maxval=0.05, seed=None)

2.3 截尾正态分布

tf.keras.initializers.TruncatedNormal(mean=0.0, stddev=0.05, seed=None)

基本和正态分布一样,但是如果随机的取值是在距离均值两个标准差的这个范围之外的,那么会重新取值。

换句话说,初始化的数值会被限制在均值正负两个标准差的范围内

2.4 常数

tf.keras.initializers.Zeros()
tf.keras.initializers.Ones()

2.5 Xavier/Glorot

tf.keras.initializers.GlorotNormal(seed=None)

这个本质是一个截尾正态分布,但是GlorotNormal(又称Xavier),是一个以0为均值,标准差计算公式是:

是in和out表示输入和输出神经元数目的数目。如果是之前已经学习过或者看过我写的关于Xavier初始化的论文笔记的朋友,可能会发现论文中使用的是一个均匀分布而不是正态分布。

均匀分布的初始化如下:tf.keras.initializers.GlorotUniform(seed=None)

这个均匀分布是我们讲的:

这个Xavier方法,也是Keras默认的初始化的方法

2.6 自定义初始化

当然,Keras也是支持自定义初始化的方法的。

import tensorflow as tfclass ExampleRandomNormal(tf.keras.initializers.Initializer):def __init__(self, mean, stddev):self.mean = meanself.stddev = stddevdef __call__(self, shape, dtype=None)`:return tf.random.normal(shape, mean=self.mean, stddev=self.stddev, dtype=dtype)def get_config(self):  # To support serializationreturn {'mean': self.mean, 'stddev': self.stddev}

关键就是在__call__中返回一个和输入参数shape大小相同的一个tf张量就行了。

3 Keras激活函数

基本支持了所有的常见激活函数。在卷积层的参数activation中,可以输入relu,sigmoid,softmax等下面的字符串的形式,全部小写。

3.1 relu

tf.keras.activations.relu(x, alpha=0.0, max_value=None, threshold=0)

  • alpha就是斜率,如果是0.1,则变成leakyReLU;

  • max_value是ReLU的上界,如果是None则没有上界;

  • threshold是ReLU的下界,小于下界的都会被置0,一般默认是0.

3.2 sigmoid

tf.keras.activations.sigmoid(x)

函数方程:

3.3 softmax

tf.keras.activations.softmax(x, axis=-1)

3.4 softplus

tf.keras.activations.softplus(x)

计算公式:

3.5 softsign

tf.keras.activations.softsign(x)

计算公式:

3.6 tanh

tf.keras.activations.tanh(x)

计算公式:

3.7 selu

tf.keras.activations.selu(x)

  • 如果,返回;

  • 如果,返回;

  • scale和是事先设置的数值,alpha=1.67216214,scale=1.05070098

  • 与elu激活函数类似,但是多了有个scale系数,

  • 2017年的一篇论文提出selu,elu是2016年提出的

4 Keras的L1/L2正则

正则化就比较简单,不是L1就是L2,再或者两者都有。

4.1 L1/L2正则

from tensorflow.keras import layers
from tensorflow.keras import regularizerslayer = layers.Dense(units=64,kernel_regularizer=regularizers.l1_l2(l1=1e-5, l2=1e-4),
)

这里的正则化,可以使用:

  • tf.keras.regularizers.l1_l2(l1=1e-5, l2=1e-4)

  • tf.keras.regularizers.l2(1e-4)

  • tf.keras.regularizers.l1(1e-5)

关于L1和L2的计算细节:

  • L1:L1正则就是

  • L2:L1正则就是

4.2 自定义正则化

class MyRegularizer(tf.keras.regularizers.Regularizer):def __init__(self, strength):self.strength = strengthdef __call__(self, x):return self.strength * tf.reduce_sum(tf.square(x))def get_config(self):return {'strength': self.strength}

这个实现的是L2正则的。其中的get_config是用来保存模型数据的,不要的话也没事,只是不能序列化的保存模型(不用使用config或者json来存储模型)。

- END -

往期精彩回顾适合初学者入门人工智能的路线及资料下载机器学习及深度学习笔记等资料打印机器学习在线手册深度学习笔记专辑《统计学习方法》的代码复现专辑
AI基础下载机器学习的数学基础专辑

【小白学PyTorch】扩展之Tensorflow2.0 | 21 Keras的API详解(上)卷积、激活、初始化、正则...相关推荐

  1. 【小白学PyTorch】扩展之Tensorflow2.0 | 21 Keras的API详解(下)池化、Normalization

    <<小白学PyTorch>> 扩展之Tensorflow2.0 | 21 Keras的API详解(上)卷积.激活.初始化.正则 扩展之Tensorflow2.0 | 20 TF ...

  2. mysql安装教程8.0.21安装_mysql8.0.21安装教程图文详解

    1.下载 下载链接 点击download,这里可能需要登录甲骨文的账号,登录一下即可 2.解压 下载好会得到一个安装包 把它解压到一个能找到的目录下即可,我的是这样(my.ini文件你们应该没有) 3 ...

  3. MySQL Installer 8.0.21安装教程图文详解 转载

    MySQL Installer 8.0.21安装教程图文详解 原地址 1. 缘由 刚好需要在新系统上重新安装MySQL,便写了一份的下载安装教程,供查阅,以防日后细节有所遗忘. 2. 版本说明 MyS ...

  4. TensorFlow2.0教程-keras 函数api

    TensorFlow2.0教程-keras 函数api Tensorflow 2.0 教程持续更新: https://blog.csdn.net/qq_31456593/article/details ...

  5. mysql installer安装_MySQL Installer 8.0.21安装教程图文详解

    1. 缘由 刚好需要在新系统上重新安装MySQL,便写了一份的下载安装教程,供查阅,以防日后细节有所遗忘. 2. 版本说明 MySQL Installer 8.0.21 3. 下载安装包 方式一:官网 ...

  6. 【小白学PyTorch】7.最新版本torchvision.transforms常用API翻译与讲解

    机器学习炼丹术]的学习笔记分享 <<小白学PyTorch>> 小白学PyTorch | 6 模型的构建访问遍历存储(附代码) 小白学PyTorch | 5 torchvisio ...

  7. 【深度学习】(6) tensorflow2.0使用keras高层API

    各位同学好,今天和大家分享一下TensorFlow2.0深度学习中借助keras的接口减少神经网络代码量.主要内容有: 1. metrics指标:2. compile 模型配置:3. fit 模型训练 ...

  8. mysql安装教程8.0.21安装,Windows系统下MySQL8.0.21安装教程(图文详解)

    安装建议:尽量不要用.exe进行安装,用压缩包安装,对日后的卸载/版本升级更为方便 下载地址:https://dev.mysql.com/downloads/mysql/ 1.点击上面的下载地址得到z ...

  9. Tensorflow2.0:Faster RCNN 代码详解(一)

    第一部分给出Fater RCNN文件的代码解析,主要是模型主体的执行过程,在此文件 引入下述几个文件的函数引用,对于backbones,necks和test_mixins文件来说,主要是用来构建模型结 ...

最新文章

  1. 2020《图像分割》从入坑到出坑指南
  2. ios/android代码生成FLASH可用的actionscript代码(*.ane)
  3. 事务的隔离级别 mysql
  4. 计算机教室要配备空调吗,教室里不安装空调吗?如何正确安装空调?
  5. 保险的现金价值是什么意思?
  6. 五个案例“熄灭”Nginx漏洞隐患
  7. 华为提出 New IP,欲打破长达半世纪的IP协议重塑互联网
  8. Day1_HTML_表单标记
  9. java adt eclipse_Eclipse安装ADT插件
  10. r语言如何计算t分布临界值_如何利用R语言进行meta分析—详细教程(2)
  11. 力扣36.有效的数独
  12. SpringBoot碰到的常见问题
  13. vue-webpack.config使用七牛云cdn镜像加速
  14. 如何优雅地下载和使用Apache Commons_io
  15. Linux部署war包项目
  16. HTML5期末大作业:海绵宝宝相关人物介绍
  17. 《大腕》中经典台词的多个版本
  18. 软件构造课程心得——软件构造实验二(Lab2)
  19. 单链表实现一元多项式相加
  20. 2021广西灵山中学高考成绩查询,2021年广西高考县中实力榜 玉林中学超群

热门文章

  1. PHP06 PHP操作MySQL
  2. lua--面向对象使用middleclass
  3. Web 设计中的苹果风
  4. Oracle添加定时任务
  5. 前端切图:手机端自适应布局demo
  6. [导入]通过简易的前台代码实现无限二级域名转向(来自无忧 biyuan老矣)
  7. mano安全_爱立信:O-RAN存在的安全风险
  8. 修改某个用户名和密码
  9. 软件工程导论个人项目 -- 中小学数学卷子自动生成程序
  10. 姿态检测 树莓派_3.使用树莓派控制摄像头采集视频及运动检测