0

0

统一卷积输出尺寸以实现跨层 goodness 分数可加性

霞舞

霞舞

发布时间:2026-03-14 09:28:03

|

735人浏览过

|

来源于php中文网

原创

统一卷积输出尺寸以实现跨层 goodness 分数可加性

本文介绍如何通过合理设置卷积层的 padding,确保各层输出空间尺寸一致,从而安全地对不同层的 goodness 分数(如平方均值)进行逐元素求和,解决 Forward-Forward 算法中因 shape 不匹配导致的 sum() 报错问题。

本文介绍如何通过合理设置卷积层的 padding,确保各层输出空间尺寸一致,从而安全地对不同层的 goodness 分数(如平方均值)进行逐元素求和,解决 forward-forward 算法中因 shape 不匹配导致的 `sum()` 报错问题。

在 Forward-Forward 算法中,模型需为每个类别计算一个总 goodness 分数,该分数由网络各层的局部 goodness(通常定义为激活张量的平方均值:x.pow(2).mean(1))累加得到。然而,标准卷积(无 padding 或 padding 不足)会不断缩小特征图的空间尺寸(如 14×14 → 7×7 → 3×3),导致各层 goodness 张量形状不一致(例如 [50000, 14, 14]、[50000, 7, 7]、[50000, 3, 3]),无法直接调用 sum(goodness) —— PyTorch 的 sum() 对列表中 shape 不同的 Tensor 会抛出 RuntimeError。

根本解法不是后处理“拉平再插值”或“裁剪对齐”,而是从网络设计源头保证空间维度一致:使用 same convolution(即输出尺寸 ≈ 输入尺寸),其关键在于为每个卷积层显式配置合适的 padding,使得:

[ \text{Output_size} = \left\lfloor \frac{H + 2 \times \text{padding} - \text{kernel_size}}{\text{stride}} \right\rfloor + 1 \approx H ]

当 stride=1 时,满足此条件的最小非负 padding 是:
[ \text{padding} = \left\lfloor \frac{\text{kernel_size} - 1}{2} \right\rfloor ]

例如,对 kernel_size=3,padding=1;对 kernel_size=5,padding=2。这样,无论经过多少层卷积,只要 stride 保持为 1,空间尺寸将基本不变(忽略边界舍入误差),各层 goodness 张量便具有相同 shape(如全为 [N, H, W]),可直接逐元素相加。

以下是推荐的模块化实现方式(适配 Forward-Forward 架构):

Vondy
Vondy

下一代AI应用平台,汇集了一流的工具/应用程序

下载
import torch
import torch.nn as nn

class SameConvBlock(nn.Module):
    def __init__(self, in_channels, out_channels, kernel_size=3, stride=1, bias=True, device="cuda"):
        super().__init__()
        # ✅ 关键:自动计算 same-padding
        padding = (kernel_size - 1) // 2
        self.conv = nn.Conv2d(
            in_channels, out_channels, 
            kernel_size=kernel_size, 
            stride=stride, 
            padding=padding, 
            bias=bias
        ).to(device)
        self.bn = nn.BatchNorm2d(out_channels).to(device)
        self.relu = nn.ReLU().to(device)
        # 注意:若需下采样,应在 relu 后接独立的 MaxPool2d(而非用 stride>1 的 conv)
        # 这样可清晰分离「特征提取」与「空间压缩」逻辑

    def forward(self, x):
        return self.relu(self.bn(self.conv(x)))

# 在模型定义中统一使用 SameConvBlock
class FFConvNet(nn.Module):
    def __init__(self, input_channels=1, output_dim=10, device="cuda"):
        super().__init__()
        self.layers = nn.Sequential(
            SameConvBlock(input_channels, 6, kernel_size=3, device=device),   # → [N,6,H,W]
            SameConvBlock(6, 16, kernel_size=3, device=device),               # → [N,16,H,W]
            SameConvBlock(16, 120, kernel_size=3, device=device),             # → [N,120,H,W]
        ).to(device)
        self.output_dim = output_dim
        self.device = device

    def predict(self, x):
        goodness_score_per_label = []
        for label in range(self.output_dim):
            encoded = overlay_y_on_x(x, label)  # 假设已定义,shape: [N,C,H,W]
            goodness = []
            for layer in self.layers:
                encoded = layer(encoded)                     # shape 保持 [N,C,H,W]
                g = encoded.pow(2).mean(dim=1)             # → [N,H,W],每层一致!
                goodness.append(g)
            # ✅ 现在所有 goodness[i] 形状相同,可安全 sum → [N,H,W]
            total_goodness = sum(goodness)                 # 自动广播逐元素相加
            goodness_score_per_label.append(total_goodness.unsqueeze(1))  # → [N,1,H,W]

        # 拼接并取 argmax(按 channel 维度)
        scores = torch.cat(goodness_score_per_label, dim=1)  # → [N, output_dim, H, W]
        return scores.mean(dim=[2,3]).argmax(dim=1)  # 全局平均后分类(或保留 spatial-aware 逻辑)

⚠️ 重要注意事项

  • 避免混合 stride > 1 的卷积与 same-padding:若需降维,请显式使用 nn.MaxPool2d(kernel_size=2, stride=2) 或 nn.AvgPool2d,并在 pooling 后重新校准后续层的 padding(因输入尺寸已变);
  • 全局池化替代方案:若坚持使用原始尺寸递减结构,可在每层 goodness 后添加自适应池化(如 nn.AdaptiveAvgPool2d((1,1))),将 [N,H,W] 统一压缩为 [N,1,1],再展平为 [N] 后相加 —— 但会丢失空间结构信息,违背 Forward-Forward 的局部 goodness 设计初衷;
  • 验证 shape 一致性:在 predict 中加入断言可增强鲁棒性:
    assert all(g.shape == goodness[0].shape for g in goodness), "Goodness tensors must have identical shape!"

综上,通过 padding = (kernel_size - 1) // 2 实现 same convolution,是从架构层面根治跨层求和 shape 冲突的最简洁、高效且语义清晰的方案,既符合 Forward-Forward 的理论要求,也便于调试与扩展。

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
css中的padding属性作用
css中的padding属性作用

在CSS中,padding属性用于设置元素的内边距。想了解更多padding的相关内容,可以阅读本专题下面的文章。

176

2023.12.07

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

500

2023.08.14

pytorch是干嘛的
pytorch是干嘛的

pytorch是一个基于python的深度学习框架,提供以下主要功能:动态图计算,提供灵活性。强大的张量操作,实现高效处理。自动微分,简化梯度计算。预构建的神经网络模块,简化模型构建。各种优化器,用于性能优化。想了解更多pytorch的相关内容,可以阅读本专题下面的文章。

469

2024.05.29

Python AI机器学习PyTorch教程_Python怎么用PyTorch和TensorFlow做机器学习
Python AI机器学习PyTorch教程_Python怎么用PyTorch和TensorFlow做机器学习

PyTorch 是一种用于构建深度学习模型的功能完备框架,是一种通常用于图像识别和语言处理等应用程序的机器学习。 使用Python 编写,因此对于大多数机器学习开发者而言,学习和使用起来相对简单。 PyTorch 的独特之处在于,它完全支持GPU,并且使用反向模式自动微分技术,因此可以动态修改计算图形。

27

2025.12.22

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

25

2026.03.13

Python异步编程与Asyncio高并发应用实践
Python异步编程与Asyncio高并发应用实践

本专题围绕 Python 异步编程模型展开,深入讲解 Asyncio 框架的核心原理与应用实践。内容包括事件循环机制、协程任务调度、异步 IO 处理以及并发任务管理策略。通过构建高并发网络请求与异步数据处理案例,帮助开发者掌握 Python 在高并发场景中的高效开发方法,并提升系统资源利用率与整体运行性能。

44

2026.03.12

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

177

2026.03.11

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

50

2026.03.10

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

92

2026.03.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号