python - tensorflow/keras 中的自定义层 - 这两个选项是否相等?
问题描述
根据https://www.tensorflow.org/guide/keras/custom_layers_and_models#layers_are_recursively_composable中的 tensorflow2 / keras 自定义层可以这样定义
class CustomLayer(layers.Layer):
def __init__(self, ntimes):
super().__init__()
self.convs = [layers.Conv2D(10, (3, 3), padding='same') for i in range(ntimes)]
def call(self, x, **kwargs):
for conv in self.convs:
x = conv(x)
return x
但是,最近我遇到了另一种表示法:
def CustomLayer(ntimes):
def layer(x):
for i in range(ntimes):
x = layers.Conv2D(10, (3, 3), padding='same')(x)
return x
return layer
显然它不是 Layer 类的实例,但结果操作似乎是相同的。还是我错过了什么?这种方法有什么缺点吗?
Ps:这样的层将在以下示例性上下文中使用:
xin = layers.Input((10,10,3))
layer = CustomLayer(5)
xout = layer(xin)
model = models.Model(xin, xout)
model.summary()
解决方案
在我看来,您正在做的是创建一个具有预定义功能的图层块,而不是创建一个新的自定义图层。为了详细说明,您可以单独访问块中的每一层,因此它不是层。创建块可以使用两者来完成,但如果您想在层内实现自己的功能或进行一些修改,例如在每个时期打印该层的结果或其他特定层的结果,那么您需要使用第一种方法.
推荐阅读
- javascript - TypeError:无法读取未定义的 Nodejs Mysql 查询结果的属性“标题”
- python - NoReverseMatch:未找到带有参数“(1,)”的“详细信息”的反向。尝试了 1 种模式:['polls\\/\\
$'] - javascript - 替换innerHTML时修复光标位置
- python - 如何获取 scrapy.http.request.Request?
- php - 在 PHP 8 中,如何通过反射检查传递对象是否有效?
- swift - 如何在 SwiftUI 中使用 MVVM 持久化数据?
- azure-devops - 如何在 azure 中的两个 yaml 管道之间传递变量值
- wix - WiX Bootstrapper 在安装 Outlook 加载项的先决条件时出现问题,错误 0x80091007
- elasticsearch - 如何仅从 Elasticsearch 总和聚合查询中获取价值?
- macos - 用于切换查找器窗口的 MacOS 键盘快捷键