【写在前面】:大家好,我是【猪葛】
一个很看好AI前景的算法工程师
在接下来的系列博客里面我会持续更新Keras的教学内容(文末有大纲)
内容主要分为两部分
第一部分是Keras的基础知识
第二部分是使用Keras搭建FasterCNN、YOLO目标检测神经网络
代码复用性高
如果你也感兴趣,欢迎关注我的动态一起学习
学习建议:
有些内容一开始学起来有点蒙,对照着“学习目标”去学习即可
一步一个脚印,走到山顶再往下看一切风景就全明了了



本篇博客学习目标:1、掌握初始化器的用法









一、初始化器的概念及其用法

概念

初始化定义了设置 Keras 各层权重随机初始值的方法。

用法

用来将初始化器传入 Keras 层(包括不限于Dense层、Conv2D层、等等)的参数名取决于具体的层。通常关键字为 kernel_initializerbias_initializer:

  • 你可以给它们传递初始化器的名字字符串,例如:
model.add(Dense(64,
                kernel_initializer='random_uniform',
                bias_initializer='zeros'))
  • 也可以给它们传递初始化器的实例,这种方式可以让你更改初始化器的参数,比较自由,例如:
model.add(Dense(64,
                kernel_initializer=keras.initializers.Constant(value=3.0),
                bias_initializer=keras.initializers.RandomNormal(mean=0.0, stddev=0.05, seed=None))

提示

  • 一般来说,kernel_initializer默认值为'glorot_uniform',对应的实例是keras.initializers.glorot_uniform(seed=None)
  • 一般来说,bias_initializer默认值为'zeros',对应的实例是keras.initializers.Zeros()

二、可用的初始化器

可用初始化器汇总

import tensorflow.keras as keras

#  ######################可用初始化器汇总########################
keras.initializers.Initializer()  # 初始化器基类:所有初始化器继承这个类。
keras.initializers.Zeros()  # 将张量初始值设为 0 的初始化器。
keras.initializers.Ones()  # 将张量初始值设为 1 的初始化器。将张量初始值设为 1 的初始化器。将张量初始值设为 1 的初始化器。
keras.initializers.Constant(value=0)  # 将张量初始值设为一个常数的初始化器。value: 浮点数,生成的张量的值。
keras.initializers.RandomNormal(mean=0.0, stddev=0.05, seed=None)  # 按照正态分布生成随机张量的初始化器。
keras.initializers.RandomUniform(minval=-0.05, maxval=0.05, seed=None)  # 按照均匀分布生成随机张量的初始化器。
keras.initializers.TruncatedNormal(mean=0.0, stddev=0.05, seed=None)  # 按照截尾正态分布生成随机张量的初始化器。
keras.initializers.VarianceScaling(scale=1.0, mode='fan_in', distribution='normal', seed=None)  # 初始化器能够根据权值的尺寸调整其规模。
keras.initializers.Orthogonal(gain=1.0, seed=None)  # 生成一个随机正交矩阵的初始化器。
keras.initializers.Identity(gain=1.0)  # 生成单位矩阵的初始化器。
keras.initializers.lecun_uniform(seed=None)  # LeCun 均匀初始化器。
keras.initializers.glorot_normal(seed=None)  # keras.initializers.glorot_normal(seed=None)
keras.initializers.glorot_uniform(seed=None)  # Glorot 均匀分布初始化器,也称为 Xavier 均匀分布初始化器。
keras.initializers.he_normal(seed=None)  # He 正态分布初始化器。
keras.initializers.lecun_normal(seed=None)  # LeCun 正态分布初始化器。
keras.initializers.he_uniform(seed=None)  # He 均匀方差缩放初始化器。

提示

初始化器对应的名字字符串为类名的小写,例如初始化器keras.initializers.RandomNormal(mean=0.0, stddev=0.05, seed=None)的名字字符串就是'randomnormal'

三、更改初始化器小例子

问题

更改一个Dense层初始化器为keras.initializers.Zeros()

代码

from tensorflow.keras.layers import Dense, Input, Conv2D, MaxPooling2D
from tensorflow.keras import Sequential
import tensorflow.keras as keras
import numpy as np

# #建立一个测试模型
model = Sequential([
    Dense(4, input_shape=(5,), name='dense_xiaoming',
          kernel_initializer=keras.initializers.Zeros(),  # 全部初始化为0
          bias_initializer=keras.initializers.Ones()),  # 全部初始化为1
])
x = np.ones(shape=(8, 5))  # 创建测试数据
y = model(x)
layer = model.get_layer('dense_xiaoming')  # 通过层的名字得到层
(k, b) = layer.get_weights()  # 查看层的初始化权重值和偏置项
print(k)
print(b)

你也可以这么写:(因为初始化器对应的名字字符串为类名的小写

from tensorflow.keras.layers import Dense, Input, Conv2D, MaxPooling2D
from tensorflow.keras import Sequential
import tensorflow.keras as keras
import numpy as np

# #建立一个测试模型
model = Sequential([
    Dense(4, input_shape=(5,), name='dense_xiaoming',
          kernel_initializer='zeros',  # 全部初始化为0
          bias_initializer='ones'),  # 全部初始化为1
])
x = np.ones(shape=(8, 5))  # 创建测试数据
y = model(x)
layer = model.get_layer('dense_xiaoming')  # 通过层的名字得到层
(k, b) = layer.get_weights()  # 查看层的初始化权重值和偏置项
print(k)
print(b)

输出结果都是

[[0. 0. 0. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]
 [0. 0. 0. 0.]]
[1. 1. 1. 1.]

四、使用自定义初始化器

如果传递一个自定义的可调用函数,那么它必须使用参数 shape(需要初始化的变量的尺寸)和 dtype(数据类型):

from tensorflow.keras import backend as K

def my_init(shape, dtype=None):
    return K.random_normal(shape, dtype=dtype)

model.add(Dense(64, kernel_initializer=my_init))

到这里这次学习就结束啦,本系列课程会持续更新,欢迎关注我的动态一起学习,附上系列内容大纲
在这里插入图片描述

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐