Keras函数式API与自定义层

本文探讨了函数式API在Keras中的应用,详细解释了如何通过__call__方法实现类实例的直接调用,以及自定义Keras层时需要重写的build、call和compute_output_shape方法的原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

函数式API从一个例子开始
from keras.layers import *
x = Input(shape=(10, ))
y = Dense(10)(x)
正常情况下怎么使用类实例

可能你对上面的例子感到习以为常,但是看看正常情况下是怎样使用类的

class A(object):
	def __init__(self, var):
		self.var = var
	def printf(self):
		print(self.var)
a = A(0)
a.printf()
>> 0
什么不一样

函数式API的调用中Dense(10)(x)是不是没有指定方法就调用方法了

发生了什么
  • 首先Dense(10)会产生一个Dense类的实例,其实这一步也是没有通过调用方法的情况下调用了一个方法
  • Dense(10)(x)是函数实例在不通过方法调用的情况下调用了一个方法,即没有像上面这个实例a那样显式的调用printf方法

是不是相到了Python里面一个叫做魔法方法的东西

怎么做到的

通过__call__

class A(object):
	def __init__(self, var):
		self.var = var
	def __call__(self, x):
		print(x)
a = A(1)
a(3)
>>> 3
keras的__call__

keras的__call__实现

自定义keras层

官方文档对于自定义层的描述
有3个需要重写的方法

  • build
  • call
  • compute_output_shape

为什么需要重写这三个方法?因为计算逻辑都写在了Layer这个基类的__call__中了

可以不重写这三个方法吗

请继承Layer,并重写__call__,就像keras的Bidirectional做的那样

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值