当前位置: 首页 > wzjs >正文

mac系统使用wordpress百度有专做优化的没

mac系统使用wordpress,百度有专做优化的没,深圳做网站要多少钱,装修广告做哪个网站最好看抽象方法和实例调用方法 对比表格: 特性抽象方法 (forward)实例调用方法 (call)定义方式abc.abstractmethod 装饰器特殊方法名 __call__调用方式不能直接调用,必须通过子类实现可以直接调用对象:controller(attn, ...)实现要求必须由子类实…

抽象方法和实例调用方法

对比表格:

特性抽象方法 (forward)实例调用方法 (call)
定义方式@abc.abstractmethod 装饰器特殊方法名 __call__
调用方式不能直接调用,必须通过子类实现可以直接调用对象:controller(attn, ...)
实现要求必须由子类实现,否则无法实例化可以在基类中实现,子类可以覆盖
主要功能定义具体业务逻辑(如存储注意力)处理通用流程(如计数、步骤控制)
代码位置在子类中实现(如 AttentionStore在基类中实现(AttentionControl
使用场景需要子类提供不同实现时需要统一接口时
错误处理在类定义时检查在运行时检查
代码复用每个子类都需要实现所有子类共享基类实现

以下面代码片段为例

class AttentionControl(abc.ABC):def step_callback(self, x_t):return x_tdef between_steps(self):return@propertydef num_uncond_att_layers(self):return 0@abc.abstractmethoddef forward(self, attn, is_cross: bool, place_in_unet: str):raise NotImplementedErrordef __call__(self, attn, is_cross: bool, place_in_unet: str):if self.cur_att_layer >= self.num_uncond_att_layers:h = attn.shape[0]attn[h // 2 :] = self.forward(attn[h // 2 :], is_cross, place_in_unet)self.cur_att_layer += 1if self.cur_att_layer == self.num_att_layers + self.num_uncond_att_layers:self.cur_att_layer = 0self.cur_step += 1self.between_steps()return attndef reset(self):self.cur_step = 0self.cur_att_layer = 0def __init__(self):self.cur_step = 0self.num_att_layers = -1self.cur_att_layer = 0
  1. 抽象方法:

    • 是接口定义
    • 强制子类实现
    • 提供具体功能
  2. 实例调用方法:

    • 是统一接口
    • 处理通用逻辑
    • 调用抽象方法

具体的调用差异

forward__call__ 的区别和调用时机:

  1. 基本区别:
# forward 是抽象方法,需要子类实现
@abc.abstractmethod
def forward(self, attn, is_cross: bool, place_in_unet: str):raise NotImplementedError# __call__ 是实例调用方法,可以直接调用对象
def __call__(self, attn, is_cross: bool, place_in_unet: str):# 调用 forward 并处理其他逻辑if self.cur_att_layer >= self.num_uncond_att_layers:h = attn.shape[0]attn[h // 2 :] = self.forward(attn[h // 2 :], is_cross, place_in_unet)# ... 其他逻辑
  1. 调用时机:

__call__ 的调用:

controller = AttentionStore()
# 直接调用对象时会触发 __call__
result = controller(attn, is_cross=True, place_in_unet="down")

forward 的调用:

# forward 是在 __call__ 内部被调用的
# 不会直接调用 forward
  1. 工作流程:
# 1. 当调用 controller(attn, ...) 时,会触发 __call__
# 2. __call__ 方法会:
#    - 检查条件
#    - 调用 forward
#    - 更新计数器
#    - 处理步骤间逻辑
# 3. forward 方法(由子类实现)处理具体的注意力计算
  1. 实际应用示例:
# 在 AttentionStore 中
def forward(self, attn, is_cross: bool, place_in_unet: str):# 存储注意力值key = f"{place_in_unet}_{'cross' if is_cross else 'self'}"if attn.shape[1] <= 32**2:self.step_store[key].append(attn)return attn# 在 AttentionReplace 中
def forward(self, attn, is_cross: bool, place_in_unet: str):# 替换注意力值return torch.einsum("hpw,bwn->bhpn", attn_base, self.mapper)
  1. 为什么这样设计:

a) 分离关注点:

  • __call__ 处理通用逻辑(计数、步骤等)
  • forward 处理具体实现(存储、替换等)

b) 提供统一接口:

  • 所有控制器都可以像函数一样调用
  • 内部实现可以不同

c) 代码复用:

  • 通用逻辑在 __call__ 中实现一次
  • 子类只需要实现 forward
  1. 调用顺序:
# 1. 外部调用
controller(attn, is_cross=True, place_in_unet="down")# 2. 触发 __call__
def __call__(self, attn, is_cross: bool, place_in_unet: str):# 3. 条件检查if self.cur_att_layer >= self.num_uncond_att_layers:# 4. 调用 forwardattn[h // 2 :] = self.forward(attn[h // 2 :], is_cross, place_in_unet)# 5. 处理其他逻辑

这种设计的好处是:

  1. 提供了清晰的接口
  2. 分离了通用逻辑和具体实现
  3. 方便代码复用和维护
  4. 使代码结构更加清晰

所以,在这个例子中 forward__call__ 的区别在于:

  • __call__ 是外部接口,处理通用逻辑
  • forward 是内部实现,处理具体功能
  • 它们共同工作,提供了灵活且统一的接口
http://www.dtcms.com/wzjs/457343.html

相关文章:

  • 企拓客app靠谱吗龙岗seo网络推广
  • wordpress 评论 模块seo如何优化关键词排名
  • 温州门户网站建设推广文章的推广渠道
  • 哪家公司建网站最好百度搜索引擎优化方式
  • 中国互联网十大巨头公司成都网站建设seo
  • 网站建设哪家好采用苏州久远网络山西seo关键词优化软件搜索
  • 潍坊大型做网站建设的公司网店代运营合同
  • 网站制作视频教学百度账号购买1元40个
  • ttkefu在线客服系统网站关键词优化有用吗
  • 闲鱼上面给人做网站造退款排名优化网站
  • 新疆最新消息今天1例湖南seo网站多少钱
  • wordpress打开网站加速色盲测试图第六版
  • 优秀的网页模板网站成品网站货源1688在线
  • 青岛网站建设公司大全漳州seo网站快速排名
  • 淄博哪有做网站的搜索排行榜
  • 网站做301好不好武汉网站seo推广公司
  • 深圳做小程序网站开发怎样注册自己的网站
  • 没有数据库的网站手机上如何制作自己的网站
  • 互联网法律服务平台广州seo公司哪个比较好
  • soho做网站南昌seo数据监控
  • 猪八戒网logo设计邯郸seo营销
  • 什么叫网站建设四网合一网络舆情分析研判报告
  • 做网站毕业论文的参考文献宁德市地图
  • seo网站排名软件灰色关键词排名
  • 易县做网站互联网seo是什么意思
  • 个人网站免费域名关键词优化最好的方法
  • 南阳开网站制作网站关键词优化方法
  • 如何建一个公司的网站百度视频推广怎么收费
  • 北京会所网站推广百度推广开户流程
  • 盐山网站开发公司官网怎么制作