You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于ConvNet的Forward Forward算法不同形状张量求和问题求助

问题描述

我正在开展基于ConvNet的Forward Forward算法相关研究。在执行预测时,需要对各层的goodness score求和,但卷积操作导致各score张量维度不同,运行代码中goodness_score_per_label += [sum(goodness).unsqueeze(1)]行时出现报错。

代码示例

def predict(self, x):
        goodness_score_per_label = []
        for label in range(self.output_dim):
            # perform one hot encoding#
            print('label:', label, x.shape)
            encoded = overlay_y_on_x(x, label)
            goodness = []
            for idx, layer in enumerate(self.layers):
                encoded = layer(encoded)
                print('encoded:', encoded.shape)
                goodness += [encoded.pow(2).mean(1)]
                print('goodness:', len(goodness), goodness[idx].shape)
            goodness_score_per_label += [sum(goodness).unsqueeze(1)]
        goodness_score_per_label = torch.cat(goodness_score_per_label, 1)
        return goodness_score_per_label.argmax(1)

张量维度信息

encoded: torch.Size([50000, 6, 14, 14])
goodness: 1 torch.Size([50000, 14, 14])
encoded: torch.Size([50000, 16, 7, 7])
goodness: 2 torch.Size([50000, 7, 7])
encoded: torch.Size([50000, 120, 3, 3])

最优解决方法

问题核心是各层的goodness张量保留了卷积后的空间维度(如14x14、7x7),维度不匹配无法直接求和。需先将每个层的goodness压缩为单维度的batch级分数,再进行求和操作,以下是两种常用方案:

方案1:全局平均池化(推荐,贴合原论文思路)

对每个层的goodness在空间维度上做全局平均,将[batch_size, H, W]转为[batch_size],统一维度后即可相加。修改代码中计算goodness的逻辑:

# 替换原goodness += [encoded.pow(2).mean(1)]
goodness += [encoded.pow(2).mean(dim=[1,2,3])]

解释:encoded.pow(2).mean(dim=[1,2,3])直接对通道、高度、宽度维度求平均,一步得到每个样本的单值goodness score,维度为[50000],各层结果维度一致,后续sum(goodness)可正常执行。

方案2:全局求和池化

若更关注激活值的总能量而非平均,可将平均改为求和:

goodness += [encoded.pow(2).sum(dim=[1,2,3])]

该方式保留激活值的总量级,适合对能量敏感的场景。

修改后的完整predict函数

def predict(self, x):
    goodness_score_per_label = []
    for label in range(self.output_dim):
        encoded = overlay_y_on_x(x, label)
        goodness = []
        for layer in self.layers:
            encoded = layer(encoded)
            # 全局平均计算单样本goodness
            score = encoded.pow(2).mean(dim=[1,2,3])
            goodness.append(score)
        # 各层分数求和后增加维度,方便后续拼接
        total_goodness = sum(goodness).unsqueeze(1)
        goodness_score_per_label.append(total_goodness)
    goodness_score_per_label = torch.cat(goodness_score_per_label, 1)
    return goodness_score_per_label.argmax(1)

内容的提问来源于stack exchange,提问作者Azucode

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 02:14:54