Keras深度学习框架基础第四讲:层接口(layers API)“层权重约束”

1、层权重约束概述

1.1 层权重约束的定义

Keras层权重约束的定义主要涉及到在训练神经网络模型时,对层的权重参数施加一定的限制或约束,以提高模型的泛化能力和稳定性。以下是关于Keras层权重约束的详细定义:

  • 约束的目的

  • 防止过拟合:通过限制权重的大小或范围,可以减少模型对训练数据的过度依赖,从而提高模型在未见数据上的性能。

  • 提高模型稳定性:约束可以确保权重参数在合理的范围内变化,避免模型因权重过大或过小而导致的不稳定行为。

  • 约束的类型

  • Keras的keras.constraints模块提供了多种类型的约束,包括但不限于:

    • MaxNorm:强制权重向量的范数(通常是L2范数)小于或等于某个指定的最大值。例如,keras.constraints.MaxNorm(max_value=2.0)将确保权重向量的L2范数不超过2.0。
    • NonNeg:强制权重为非负数。这在某些应用场景中可能是必要的,例如当权重表示某种概率或比例时。
    • UnitNorm:强制权重向量的范数等于1.0。这可以确保权重向量在相同的尺度上进行比较。
    • MinMaxNorm:强制权重在一个指定的最小值和最大值之间。这可以进一步细化对权重范围的控制。

1.2 约束的使用

来自keras.constraints模块的类允许在训练期间对模型参数设置约束(例如非负性)。这些约束是应用于目标变量的每变量投影函数,在每次梯度更新后(使用fit()方法时)执行。

具体的API将取决于层,但DenseConv1DConv2DConv3D层具有统一的API。

这些层提供了两个关键字参数:

  • kernel_constraint:用于主要权重矩阵的约束
  • bias_constraint:用于偏置的约束
from keras.constraints import max_norm
model.add(Dense(64, kernel_constraint=max_norm(2.)))

2、层权重约束的用法

2.1 Constraint类

keras.constraints.Constraint()

权重约束的基类

一个Constraint实例就像一个无状态的函数。用户如果继承这个类,应该重写__call__()方法。这个方法接收一个单一的权重参数,并返回这个参数的一个投影版本(例如,标准化或裁剪后的版本)。约束可以通过kernel_constraint或bias_constraint参数与各种Keras层一起使用。

>>> class NonNegative(keras.constraints.Constraint):
...
...  def __call__(self, w):
...    return w * ops.cast(ops.greater_equal(w, 0.), dtype=w.dtype)
>>> weight = ops.convert_to_tensor((-1.0, 1.0))
>>> NonNegative()(weight)
[0.,  1.]

在层里面使用的方法

>>> keras.layers.Dense(4, kernel_constraint=NonNegative())

2.2 MaxNorm类

keras.constraints.MaxNorm(max_value=2, axis=0)

MaxNorm权重约束

该约束将每个隐藏单元连接的权重范数限制为小于或等于一个指定的值。

也可以通过快捷函数keras.constraints.max_norm来使用。

参数

  • max_value: 传入权重的最大范数值。
  • axis: 整数,计算权重范数的轴。例如,在一个Dense层中,权重矩阵的形状是(input_dim, output_dim),设置axis为0可以约束每个长度为(input_dim,)的权重向量。在一个Conv2D层中,如果data_format="channels_last",权重张量的形状是(rows, cols, input_depth, output_depth),设置axis为[0, 1, 2]可以约束每个大小为(rows, cols, input_depth)的滤波器张量的权重。

MaxNorm约束是一种常用的权重约束方法,用于防止神经网络中的权重过大。过大的权重可能导致模型对训练数据的过拟合,而适当的权重约束可以提高模型的泛化能力。在Keras中,你可以通过MaxNorm约束类或keras.constraints.max_norm快捷函数来应用这种约束。通过设置max_value参数,你可以指定权重的最大范数值,而axis参数则决定了在哪个维度上计算权重范数。

2.3 NonNeg类

keras.constraints.NonNeg()

约束权重为非负

2.4 UnitNorm类

keras.constraints.UnitNorm(axis=0)

UnitNorm权重约束

将每个隐藏单元连接的权重约束为单位范数。

参数

  • axis: 整数,沿着该轴计算权重范数。例如,在一个Dense层中,权重矩阵的形状是(input_dim, output_dim),设置axis为0可以约束每个长度为(input_dim,)的权重向量。在一个Conv2D层中,如果data_format="channels_last",权重张量的形状是(rows, cols, input_depth, output_depth),设置axis为[0, 1, 2]可以约束每个大小为(rows, cols, input_depth)的滤波器张量的权重。

2.5 创建自定义权重约束

权重约束可以是任何可调用对象,它接收一个张量并返回一个具有相同形状和数据类型的张量。通常,您会作为keras.constraints.Constraint的子类来实现自己的约束。

from keras import opsclass CenterAround(keras.constraints.Constraint):"""Constrains weight tensors to be centered around `ref_value`."""def __init__(self, ref_value):self.ref_value = ref_valuedef __call__(self, w):mean = ops.mean(w)return w - mean + self.ref_valuedef get_config(self):return {'ref_value': self.ref_value}

可选地,程序员还可以实现get_config方法和类方法from_config,以便支持序列化——就像任何Keras对象一样。请注意,在上面的例子中,我们不需要实现from_config,因为类的构造函数参数与get_config返回的配置字典中的键是相同的。在这种情况下,默认的from_config方法工作得很好。

在创建自定义Keras层、约束、优化器等对象时,为了使这些对象可以被保存(例如,保存到HDF5文件)并在之后重新加载,您需要支持序列化。序列化通常涉及两个主要步骤:

  1. get_config:这是一个实例方法,用于获取对象的配置字典。这个字典应该包含足够的信息来重建对象的相同实例。在自定义对象上调用get_config时,它应该返回一个字典,该字典映射了对象的属性到它们的值。

  2. from_config:这是一个类方法,用于从配置字典中重建对象。它应该接受一个配置字典,并返回该类的一个新实例,该实例的配置与原始对象相同。

不过,在上面的CenteredConstraint示例中,由于构造函数参数(在本例中为center_value)与get_config返回的字典中的键相同,因此默认的from_config实现(由Keras基类提供)已经足够。这是因为默认的from_config方法会简单地使用配置字典中的键作为关键字参数来调用构造函数。所以,在这种情况下,我们不需要自己实现from_config

如果自定义对象有更复杂的构造函数参数或需要额外的逻辑来从配置中恢复状态,那么将需要覆盖from_config方法以提供正确的实现。

3、源代码

from keras.src import backend
from keras.src import ops
from keras.src.api_export import keras_export@keras_export("keras.constraints.Constraint")
class Constraint:"""Base class for weight constraints.A `Constraint` instance works like a stateless function.Users who subclass thisclass should override the `__call__()` method, which takes a singleweight parameter and return a projected version of that parameter(e.g. normalized or clipped). Constraints can be used with various Keraslayers via the `kernel_constraint` or `bias_constraint` arguments.Here's a simple example of a non-negative weight constraint:>>> class NonNegative(keras.constraints.Constraint):......  def __call__(self, w):...    return w * ops.cast(ops.greater_equal(w, 0.), dtype=w.dtype)>>> weight = ops.convert_to_tensor((-1.0, 1.0))>>> NonNegative()(weight)[0.,  1.]Usage in a layer:>>> keras.layers.Dense(4, kernel_constraint=NonNegative())"""def __call__(self, w):"""Applies the constraint to the input weight variable.By default, the inputs weight variable is not modified.Users should override this method to implement their own projectionfunction.Args:w: Input weight variable.Returns:Projected variable (by default, returns unmodified inputs)."""return wdef get_config(self):"""Returns a Python dict of the object config.A constraint config is a Python dictionary (JSON-serializable) that canbe used to reinstantiate the same object.Returns:Python dict containing the configuration of the constraint object."""return {}@classmethoddef from_config(cls, config):"""Instantiates a weight constraint from a configuration dictionary.Example:```pythonconstraint = UnitNorm()config = constraint.get_config()constraint = UnitNorm.from_config(config)```Args:config: A Python dictionary, the output of `get_config()`.Returns:A `keras.constraints.Constraint` instance."""return cls(**config)@keras_export(["keras.constraints.MaxNorm", "keras.constraints.max_norm"])
class MaxNorm(Constraint):"""MaxNorm weight constraint.Constrains the weights incident to each hidden unitto have a norm less than or equal to a desired value.Also available via the shortcut function `keras.constraints.max_norm`.Args:max_value: the maximum norm value for the incoming weights.axis: integer, axis along which to calculate weight norms.For instance, in a `Dense` layer the weight matrixhas shape `(input_dim, output_dim)`,set `axis` to `0` to constrain each weight vectorof length `(input_dim,)`.In a `Conv2D` layer with `data_format="channels_last"`,the weight tensor has shape`(rows, cols, input_depth, output_depth)`,set `axis` to `[0, 1, 2]`to constrain the weights of each filter tensor of size`(rows, cols, input_depth)`."""def __init__(self, max_value=2, axis=0):self.max_value = max_valueself.axis = axisdef __call__(self, w):w = backend.convert_to_tensor(w)norms = ops.sqrt(ops.sum(ops.square(w), axis=self.axis, keepdims=True))desired = ops.clip(norms, 0, self.max_value)return w * (desired / (backend.epsilon() + norms))def get_config(self):return {"max_value": self.max_value, "axis": self.axis}@keras_export(["keras.constraints.NonNeg", "keras.constraints.non_neg"])
class NonNeg(Constraint):"""Constrains the weights to be non-negative."""def __call__(self, w):w = backend.convert_to_tensor(w)return w * ops.cast(ops.greater_equal(w, 0.0), dtype=w.dtype)@keras_export(["keras.constraints.UnitNorm", "keras.constraints.unit_norm"])
class UnitNorm(Constraint):"""Constrains the weights incident to each hidden unit to have unit norm.Args:axis: integer, axis along which to calculate weight norms.For instance, in a `Dense` layer the weight matrixhas shape `(input_dim, output_dim)`,set `axis` to `0` to constrain each weight vectorof length `(input_dim,)`.In a `Conv2D` layer with `data_format="channels_last"`,the weight tensor has shape`(rows, cols, input_depth, output_depth)`,set `axis` to `[0, 1, 2]`to constrain the weights of each filter tensor of size`(rows, cols, input_depth)`."""def __init__(self, axis=0):self.axis = axisdef __call__(self, w):w = backend.convert_to_tensor(w)return w / (backend.epsilon()+ ops.sqrt(ops.sum(ops.square(w), axis=self.axis, keepdims=True)))def get_config(self):return {"axis": self.axis}@keras_export(["keras.constraints.MinMaxNorm", "keras.constraints.min_max_norm"]
)
class MinMaxNorm(Constraint):"""MinMaxNorm weight constraint.Constrains the weights incident to each hidden unitto have the norm between a lower bound and an upper bound.Args:min_value: the minimum norm for the incoming weights.max_value: the maximum norm for the incoming weights.rate: rate for enforcing the constraint: weights will berescaled to yield`(1 - rate) * norm + rate * norm.clip(min_value, max_value)`.Effectively, this means that rate=1.0 stands for strictenforcement of the constraint, while rate<1.0 means thatweights will be rescaled at each step to slowly movetowards a value inside the desired interval.axis: integer, axis along which to calculate weight norms.For instance, in a `Dense` layer the weight matrixhas shape `(input_dim, output_dim)`,set `axis` to `0` to constrain each weight vectorof length `(input_dim,)`.In a `Conv2D` layer with `data_format="channels_last"`,the weight tensor has shape`(rows, cols, input_depth, output_depth)`,set `axis` to `[0, 1, 2]`to constrain the weights of each filter tensor of size`(rows, cols, input_depth)`."""def __init__(self, min_value=0.0, max_value=1.0, rate=1.0, axis=0):self.min_value = min_valueself.max_value = max_valueself.rate = rateself.axis = axisdef __call__(self, w):w = backend.convert_to_tensor(w)norms = ops.sqrt(ops.sum(ops.square(w), axis=self.axis, keepdims=True))desired = (self.rate * ops.clip(norms, self.min_value, self.max_value)+ (1 - self.rate) * norms)return w * (desired / (backend.epsilon() + norms))def get_config(self):return {"min_value": self.min_value,"max_value": self.max_value,"rate": self.rate,"axis": self.axis,}

4、总结

今天讨论的层权重约束在Keras框架中扮演着重要的角色,它们用于限制和优化神经网络层中的权重值,从而帮助改善模型的训练效果。
权重约束的概念
权重约束是一种机制,用于在训练神经网络时限制层中的权重值。这些约束可以确保权重保持在一个合理的范围内,避免权重过大或过小,从而有助于模型的稳定性和泛化能力。
内置权重约束
Keras提供了几种内置的权重约束,如MaxNormNonNegUnitNorm等。这些约束可以方便地应用于神经网络的各个层,通过限制权重的最大值、确保权重非负或强制权重具有单位范数等方式来影响模型的训练过程。
自定义权重约束
除了内置的约束外,用户还可以根据需要创建自定义的权重约束。自定义约束需要继承keras.constraints.Constraint类,并实现__call__get_config方法。__call__方法用于定义约束的逻辑,即如何根据输入的权重张量计算约束后的权重。get_config方法用于返回约束的配置字典,以便支持序列化和重新加载。
应用权重约束
在Keras中,可以将权重约束应用于神经网络的各个层。这通常通过在层的构造函数中设置kernel_constraintbias_constraint参数来完成。这些参数接受一个约束对象作为输入,并将该约束应用于层的权重或偏置项。
层权重约束的作用
权重约束在神经网络训练中起着重要的作用。它们可以帮助防止过拟合,通过限制权重的范围来防止模型过于复杂。此外,权重约束还可以提高模型的稳定性和泛化能力,使模型在未见过的数据上表现更好。

今天讨论了Keras中的层权重约束,包括内置约束和自定义约束。权重约束在神经网络训练中扮演着重要的角色,它们可以限制权重的范围,帮助改善模型的稳定性和泛化能力。通过合理地应用权重约束,我们可以构建更有效、更健壮的神经网络模型。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/19978.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

APM编程环境:深度探索与未来展望

APM编程环境&#xff1a;深度探索与未来展望 APM编程环境&#xff0c;一个充满神秘与挑战的领域&#xff0c;吸引了无数开发者与研究者的目光。这个环境不仅提供了强大的编程工具与平台&#xff0c;更在编程逻辑、代码优化等方面展现了前所未有的可能性。接下来&#xff0c;我…

「前端+鸿蒙」核心技术HTML5+CSS3(六)

1、CSS默认宽度详解 在CSS中,默认情况下,块级元素(如<div>、<p>等)的宽度是auto,这意味着它们会根据内容自动调整宽度。内联元素(如<span>、<a>等)的宽度同样会根据其内部内容的宽度来决定。 为了控制元素的宽度,可以使用width属性来手动设置…

Python3位运算符

前言 本文介绍的是位运算符&#xff0c;位运算可以理解成对二进制数字上的每一个位进行操作的运算&#xff0c;位运算分为 布尔位运算符 和 移位位运算符。 文章目录 前言一、位运算概览1、布尔位运算符1&#xff09;按位与运算符 ( & )2&#xff09;按位或运算符 ( | )3…

一款C#开源、简单、免费的屏幕录制和GIF动画制作神器

前言 今天要给大家推荐一款由C#语言开发且开源的操作简单、免费的屏幕录制和GIF动画制作神器&#xff1a;ScreenToGif 。 工具介绍 ScreenToGif 是一款免费的开源屏幕录制和GIF 制作工具。它可以帮助用户捕捉计算机屏幕上的实时动画&#xff0c;并将其保存为高质量的 GIF 图像…

开发者工具-sources(源代码选项)

一、概要说明 源代码面板从视觉效果上分为三个区域&#xff1a;菜单区、内容区、监听区。 菜单区里面有5个子分类&#xff1a; 网页(Page)&#xff1a;指页面源&#xff0c;包含了该页面中所有的文件&#xff0c;即使多个域名下的文件也都会展示出来&#xff0c;包括iframe…

手机耳机哪个品牌音质好

在寻找音质出色的手机耳机时&#xff0c;品牌选择显得尤为重要。市场上众多知名品牌提供了各式各样的耳机产品&#xff0c;它们在音质、降噪功能、设计等方面各有千秋。以下是一些在音质上表现优异的手机耳机品牌的分析&#xff1a; 索尼&#xff1a;索尼的耳机以其卓越的降噪技…

开利网络参加广州数据交易所学习活动

开利网络做为南沙广州数据交易所的会员参加了由“广东三会”组织的“数据资产”相关学习活动。&#xff08;下图为开利董事长付立军先生在签到&#xff09; 学习内容提现了数字时代企业数字化转型的核之心“发掘数据价值&#xff0c;驱动高速发展”&#xff0c;交易中心组织大家…

如何解决mac系统mkdir命令不可用?

Mac系统mkdir命令不可用有两种 第一种&#xff1a; 提示&#xff1a;mkdir:11:command not found 解决方案&#xff1a; 选择shell->新建命令&#xff0c;输入disabled_shell_files命令运行&#xff0c;他会在你的主目录下创建一个disabled_shell_files文件夹&#xff0…

5G NR TAE TEST

环境配置&#xff1a; 测试TAE时&#xff0c;需要比对不同的Antenna Port之间的差异来测试 配置DL 2 layer MU的case layer1&#xff1a;通过设置weight&#xff0c;只有一个物理天线上有weight&#xff0c;其他天线上的weight为0&#xff0c;该天线的DMRS DMRS Port设置为1…

es6中箭头的用法

在ES6&#xff08;ECMAScript 2015&#xff09;中&#xff0c;箭头函数&#xff08;Arrow Functions&#xff09;提供了一种更简洁的函数表达式语法&#xff0c;并且它们不绑定自己的this、arguments、super或new.target。这些值由外围的正常函数值&#xff08;即包含箭头函数的…

java中BigDecimal的比较

BigDecimal是Java中的一个类&#xff0c;位于java.math包中&#xff0c;它提供了任意精度的有符号十进制数字的表示&#xff0c;以及对这些数字进行算术运算的方法 BigDecimal的主要用途包括&#xff1a; 1.金融计算&#xff1a;金融领域对数值的精度要求非常高&#xff0c;使…

学习Java的日子 Day51 数据库,DDL

Day51 MySQL 1.数据库 数据库&#xff08;database&#xff09;就是一个存储数据的仓库。为了方便数据的存储和管理&#xff0c;它将数据按照特定的规律存储在磁盘上。通过数据库管理系统&#xff0c;可以有效地组织和管理存储在数据库中的数据 MySQL就是数据库管理系统&#…

PLC无线通讯模块

在工业自动化日益深入的今天&#xff0c;PLC&#xff08;可编程逻辑控制器&#xff09;作为工业控制的核心大脑&#xff0c;其功能的扩展和智能化水平直接影响着整个生产线的效率和安全性。而PLC无线通讯模块&#xff0c;作为连接PLC与外界信息世界的桥梁&#xff0c;其重要性不…

Centos给普通用户添加sudo命令权限

打开sudoers文件 sudo visudo 修改sudoers文件 找到root ALL(ALL) ALL这一行&#xff0c;即如下图标出红线的一行 在此行下新增如下内容: lbs为用给予sudo执行权限的用户名 # 执行sudo命令&#xff0c;需要输入命令 lbs ALL(ALL) ALL 或 # 执行sudo命令&#xff0c;…

Lua调用其他脚本

Lua是一种轻量级的脚本语言&#xff0c;它通常用于嵌入式系统和游戏开发中。Lua本身并没有直接访问其他脚本文件的功能&#xff0c;但是你可以编写一个Lua脚本来加载和执行其他Lua脚本文件。 以下是一些基本的方法来在Lua中访问和执行其他脚本&#xff1a; require: 这是最常用…

HQChart使用教程100-uniapp如何在vue3运行微信小程序

HQChart使用教程100-uniapp如何在vue3运行微信小程序 症状原因分析解决思路解决步骤1. 修改vender.js2. 修改HQChartControl.js 完整实例HQChart代码地址 症状 HQChart插件在uniappvue3的项目编译成小程序以后&#xff0c; 运行会报错&#xff0c;见下图。 原因分析 查了下…

【Mac】 Infuse for Mac(多媒体播放器) v7.7.6软件介绍和安装

软件介绍 Infuse Pro是一款非常强大的视频播放器&#xff0c;它被誉为 Apple TV上最强的播放器。它支持广泛的视频格式和解码器&#xff0c;包括DTS、DTS-HD、AC3、E-AC3等高清视频的音频播放任务。此外&#xff0c;Infuse Pro还支持所有常见的高清格式。 Infuse Pro的特点之…

软件行业人均工资多少?20万已完胜大多数

本篇文章继续讨论中国软件行业的人效比。&#xff08;金融科技公司的人效比链接在这里。&#xff09; 这次选择了7家公司&#xff1a;软通动力、用友网络、中科软、东软集团、航天信息、东华软件、中国软件&#xff0c;均是中国软件行业排名比较靠前、业务相对纯粹的软件公司。…

如何仿一个抖音极速版领现金的进度条动画?

效果演示 不仅仅是实现效果&#xff0c;要封装&#xff0c;就封装好 看完了演示的效果&#xff0c;你是否在思考&#xff0c;代码应该怎么实现&#xff1f;先不着急写代码&#xff0c;先想想哪些地方是要可以动态配置的。首先第一个&#xff0c;进度条的形状是不是要可以换&am…

力扣257. 二叉树的所有路径

思路&#xff1a;题目需要记录从根节点开始走的路径&#xff0c;无疑选用前序遍历&#xff0c;用一个数组paths 记录走过的节点信息&#xff0c;遇到叶子节点就用另一个list记录下路径&#xff0c;回溯时删掉paths尾节点即可 class Solution {public List<String> binar…