Keras深度学习框架基础第二讲:层接口(layers API)第二部分“基本层类”

本文主要是介绍Keras深度学习框架基础第二讲:层接口(layers API)第二部分“基本层类”,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、layer 类

典型的layer类如下

keras.layers.Layer(activity_regularizer=None,trainable=True,dtype=None,autocast=True,name=None,**kwargs
)

这是一个所有层都继承的基类。

一个层是一个可调用的对象,它接受一个或多个张量作为输入,并输出一个或多个张量。它涉及计算,这些计算在call()方法中定义,并且有一个状态(权重变量)。状态可以在以下两种方式中创建:

  • __init__()方法中,例如通过self.add_weight()
  • 在可选的build()方法中,这个方法会在第一次调用该层的__call__()时被调用,并提供输入的形状,这些形状可能在初始化时未知。

层是递归可组合的:如果你将一个层实例作为另一个层的属性,外部层将开始跟踪内部层创建的权重。嵌套层应该在__init__()方法或build()方法中实例化。

用户只需实例化一个层,然后将其当作可调用的对象来使用。

参数

  • trainable: 布尔值,表示该层的变量是否应该是可训练的。
  • name: 字符串,表示层的名称。
  • dtype:层的计算和权重的数据类型。也可以是一个keras.DTypePolicy,它允许计算和权重的数据类型不同。默认为None。如果为None,则使用keras.config.dtype_policy(),这通常是一个float32策略,除非通过keras.config.set_dtype_policy()设置为不同的值。

属性

  • name: 层的名称(字符串)。
  • dtype: 层权重的数据类型。是layer.variable_dtype的别名。
  • variable_dtype: 层权重的数据类型。
  • compute_dtype:层计算的数据类型。层会自动将输入转换为这个数据类型,从而使得计算和输出也在这个数据类型下。当使用混合精度与keras.DTypePolicy时,这可能与variable_dtype不同。
  • trainable_weights: 应在反向传播中包括的变量列表。
  • non_trainable_weights:不应在反向传播中包括的变量列表。
  • weights:trainable_weightsnon_trainable_weights列表的合并(按此顺序)。
  • trainable:该层是否应该被训练(布尔值),即其潜在的可训练权重是否应作为layer.trainable_weights的一部分返回。
  • input_spec: 可选的(一组)InputSpec对象,指定层可以接受的输入的约束。

推荐Layer的子类实现以下方法

  • __init__(self): 定义自定义层属性,并使用add_weight()或其他状态创建不依赖于输入形状的层权重。
  • build(self, input_shape):
    此方法可用于创建依赖于输入形状(s)的权重,使用add_weight()或其他状态。当__call__()被调用时(如果层尚未被构建),它将自动调用build()来构建层。
  • call(self, *args, **kwargs):
    在确保build()已被调用后,在__call__()中被调用。call()方法执行将层应用于输入参数的逻辑。在call()中,你可以选择性地使用两个保留的关键字参数:1. training(布尔值,表示调用是否处于推理模式或训练模式)。2. mask(布尔张量,编码输入中屏蔽的时间步,例如在RNN层中使用)。该方法的一个典型签名是call(self, inputs),如果用户需要,还可以添加trainingmask
  • get_config(self):返回一个字典,包含用于初始化此层的配置。如果字典的键与__init__()中的参数不同,则还需要重写from_config(self)方法。此方法在保存层或包含此层的模型时使用。

示例
以下是一个基础示例,演示了一个包含两个变量w和b的层,它实现了y = w * x + b的计算。这个示例展示了如何实现build()和call()方法,以及如何将变量设置为层的属性以跟踪为层的权重(在layer.weights中)。

class SimpleDense(Layer):def __init__(self, units=32):super().__init__()self.units = units# Create the state of the layer (weights)def build(self, input_shape):self.kernel = self.add_weight(shape=(input_shape[-1], self.units),initializer="glorot_uniform",trainable=True,name="kernel",)self.bias = self.add_weight(shape=(self.units,),initializer="zeros",trainable=True,name="bias",)# Defines the computationdef call(self, inputs):return ops.matmul(inputs, self.kernel) + self.bias# Instantiates the layer.
linear_layer = SimpleDense(4)# This will also call `build(input_shape)` and create the weights.
y = linear_layer(ops.ones((2, 2)))
assert len(linear_layer.weights) == 2# These weights are trainable, so they're listed in `trainable_weights`:
assert len(linear_layer.trainable_weights) == 2

当提到除了通过反向传播在训练过程中更新的可训练权重之外,层还可以具有非可训练权重。这些权重意味着在call()方法调用期间需要手动更新。以下是一个示例层,它计算其输入的累积和(running sum):

class ComputeSum(Layer):def __init__(self, input_dim):super(ComputeSum, self).__init__()# Create a non-trainable weight.self.total = self.add_weight(shape=(),initializer="zeros",trainable=False,name="total",)def call(self, inputs):self.total.assign(self.total + ops.sum(inputs))return self.totalmy_sum = ComputeSum(2)
x = ops.ones((2, 2))
y = my_sum(x)assert my_sum.weights == [my_sum.total]
assert my_sum.non_trainable_weights == [my_sum.total]
assert my_sum.trainable_weights == []

weights属性

keras.layers.Layer.weights

层的所有权重变量的列表。

与 layer.variables 不同,这排除了度量状态和随机种子。

在 TensorFlow 的 Keras API 中,layer.weights 是一个常用的属性,它返回构成层权重的所有变量的列表。这些权重变量是在训练过程中通过反向传播进行更新的。而 layer.variables 属性则包括了层中的所有变量,不仅限于权重,还包括度量状态(例如用于计算损失或准确率的变量)和可能用于初始化层的随机种子等。

因此,当您想要获取并操作层的权重时,通常使用 layer.weights 而不是 layer.variables

trainable_weights属性

keras.layers.Layer.trainable_weights

层的所有可训练权重变量的列表。

这些是在训练过程中由优化器更新的权重。

在TensorFlow的Keras框架中,当你创建一个神经网络层时,该层可能包含多个权重变量。这些权重变量中的一部分是可训练的,意味着在训练模型(即通过反向传播更新权重以最小化损失函数)时,它们会被优化器(如Adam、SGD等)更新。layer.trainable_weights属性返回的就是这些可训练权重变量的列表。
non_trainable_weights属性

keras.layers.Layer.non_trainable_weights

层的所有非可训练权重变量的列表。

这些是在训练过程中不应由优化器更新的权重。与 layer.non_trainable_variables 不同,这排除了度量状态和随机种子。

在TensorFlow的Keras框架中,一个层可能包含一些权重变量,这些变量在训练过程中不应被优化器更新。这些权重变量通常用于存储一些固定的参数或状态,如批量归一化层中的运行均值和方差。layer.non_trainable_weights属性返回的就是这些非可训练权重变量的列表。注意,与layer.non_trainable_variables不同,这个列表仅包含权重变量,而不包括度量状态或随机种子等其他非权重变量。

2、add_weight方法

Layer.add_weight(shape=None,initializer=None,dtype=None,trainable=True,autocast=True,regularizer=None,constraint=None,aggregation="mean",name=None,
)

参数说明

shape:变量的形状元组。必须完全定义(没有None条目)。如果未指定,则默认为()(即标量)。

initializer:用于填充初始变量值的初始化器对象,或者是内置初始化器的字符串名称(例如"random_normal")。如果未指定,对于浮点变量默认为"glorot_uniform",对于其他所有类型(例如int, bool)则默认为"zeros"。

dtype:要创建的变量的数据类型,例如"float32"。如果未指定,则默认为层的变量数据类型(如果层也未指定,则默认为"float32")。

trainable:布尔值,指示该变量是否应通过反向传播进行训练,或者其更新是否由人工管理。默认为True。

autocast:布尔值,指示在访问变量时是否自动进行类型转换。默认为True。

regularizer:正则化器对象,用于在权重上应用惩罚项。这些惩罚项在优化过程中被添加到损失函数中。默认为None。

constraint:约束对象,在优化器更新后应用于变量,或者是内置约束的字符串名称。默认为None。

aggregation:字符串,可选值为’mean’、‘sum’、‘only_first_replica’。为变量添加注解,表示在编写自定义数据并行训练循环时,应使用哪种多副本聚合类型。

name:变量的字符串名称。对于调试很有用。

trainable属性

keras.layers.Layer.trainable

可设置的布尔值,表示此层是否应该可训练。

3、get_weights方法

Layer.get_weights()

返回层的权重值存入NumPy数组的列表。

4 、set_weights方法

Layer.set_weights(weights)

通过NumPy数组的列表设置层的权重值。

5、get_config方法

Model.get_config()

返回对象的配置。

对象的配置是一个Python字典(可序列化),包含了重新实例化该对象所需的信息。

6、add_loss方法

Layer.add_loss(loss)

可以在call()方法内部调用以添加一个标量损失。

在Keras的自定义层或模型中,有时我们可能需要在前向传播(即call()方法)中直接计算某些损失。例如,在正则化层中,我们可能想要根据层的权重或输出计算一个损失项。为了在训练过程中包含这个损失,我们通常会使用add_loss()方法。

add_loss()方法允许你在call()方法内部添加一个标量损失,这个损失将在反向传播时被考虑进去。这通常用于实现自定义的正则化、约束或其他需要在前向传播中计算的损失项。

class MyLayer(Layer):...def call(self, x):self.add_loss(ops.sum(x))return x

losses属性

keras.layers.Layer.losses

add_loss、正则化器和子层中获取的标量损失列表。

在Keras中,当您使用add_loss方法在层或模型中添加损失时,这些损失会被收集起来并在训练过程中被考虑。同样,如果层或模型有正则化器(如权重衰减),那么这些正则化器产生的损失也会被添加到损失列表中。此外,如果层有子层(即嵌套在其他层中的层),那么这些子层的损失也会被包含在内。

这些标量损失在训练过程中会被累加,并用于计算总损失,然后用于反向传播以更新模型的权重。

注意:这些损失通常是在call方法或其他层/模型的方法中通过add_loss方法添加的,并且是在模型编译后、训练开始前计算的。在模型编译之前,losses列表可能为空或只包含由正则化器产生的损失。

这篇关于Keras深度学习框架基础第二讲:层接口(layers API)第二部分“基本层类”的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1002209

相关文章

PHP应用中处理限流和API节流的最佳实践

《PHP应用中处理限流和API节流的最佳实践》限流和API节流对于确保Web应用程序的可靠性、安全性和可扩展性至关重要,本文将详细介绍PHP应用中处理限流和API节流的最佳实践,下面就来和小编一起学习... 目录限流的重要性在 php 中实施限流的最佳实践使用集中式存储进行状态管理(如 Redis)采用滑动

SpringBoot实现不同接口指定上传文件大小的具体步骤

《SpringBoot实现不同接口指定上传文件大小的具体步骤》:本文主要介绍在SpringBoot中通过自定义注解、AOP拦截和配置文件实现不同接口上传文件大小限制的方法,强调需设置全局阈值远大于... 目录一  springboot实现不同接口指定文件大小1.1 思路说明1.2 工程启动说明二 具体实施2

深度解析Python中递归下降解析器的原理与实现

《深度解析Python中递归下降解析器的原理与实现》在编译器设计、配置文件处理和数据转换领域,递归下降解析器是最常用且最直观的解析技术,本文将详细介绍递归下降解析器的原理与实现,感兴趣的小伙伴可以跟随... 目录引言:解析器的核心价值一、递归下降解析器基础1.1 核心概念解析1.2 基本架构二、简单算术表达

深度解析Java @Serial 注解及常见错误案例

《深度解析Java@Serial注解及常见错误案例》Java14引入@Serial注解,用于编译时校验序列化成员,替代传统方式解决运行时错误,适用于Serializable类的方法/字段,需注意签... 目录Java @Serial 注解深度解析1. 注解本质2. 核心作用(1) 主要用途(2) 适用位置3

Java MCP 的鉴权深度解析

《JavaMCP的鉴权深度解析》文章介绍JavaMCP鉴权的实现方式,指出客户端可通过queryString、header或env传递鉴权信息,服务器端支持工具单独鉴权、过滤器集中鉴权及启动时鉴权... 目录一、MCP Client 侧(负责传递,比较简单)(1)常见的 mcpServers json 配置

GSON框架下将百度天气JSON数据转JavaBean

《GSON框架下将百度天气JSON数据转JavaBean》这篇文章主要为大家详细介绍了如何在GSON框架下实现将百度天气JSON数据转JavaBean,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录前言一、百度天气jsON1、请求参数2、返回参数3、属性映射二、GSON属性映射实战1、类对象映

从基础到高级详解Python数值格式化输出的完全指南

《从基础到高级详解Python数值格式化输出的完全指南》在数据分析、金融计算和科学报告领域,数值格式化是提升可读性和专业性的关键技术,本文将深入解析Python中数值格式化输出的相关方法,感兴趣的小伙... 目录引言:数值格式化的核心价值一、基础格式化方法1.1 三种核心格式化方式对比1.2 基础格式化示例

redis-sentinel基础概念及部署流程

《redis-sentinel基础概念及部署流程》RedisSentinel是Redis的高可用解决方案,通过监控主从节点、自动故障转移、通知机制及配置提供,实现集群故障恢复与服务持续可用,核心组件包... 目录一. 引言二. 核心功能三. 核心组件四. 故障转移流程五. 服务部署六. sentinel部署

Python ORM神器之SQLAlchemy基本使用完全指南

《PythonORM神器之SQLAlchemy基本使用完全指南》SQLAlchemy是Python主流ORM框架,通过对象化方式简化数据库操作,支持多数据库,提供引擎、会话、模型等核心组件,实现事务... 目录一、什么是SQLAlchemy?二、安装SQLAlchemy三、核心概念1. Engine(引擎)

Maven中生命周期深度解析与实战指南

《Maven中生命周期深度解析与实战指南》这篇文章主要为大家详细介绍了Maven生命周期实战指南,包含核心概念、阶段详解、SpringBoot特化场景及企业级实践建议,希望对大家有一定的帮助... 目录一、Maven 生命周期哲学二、default生命周期核心阶段详解(高频使用)三、clean生命周期核心阶