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

求助:Keras中U-Net模型的感受野计算、解释与验证

U-Net生成器模型的感受野计算、原理及验证

一、感受野核心计算逻辑

感受野指输出特征图上单个像素对应输入图像的区域大小。计算时需跟踪两个关键变量:

  • 当前感受野(RF):初始值为1(输入层单个像素的感受野就是自身)
  • 输出步幅(S):初始值为1(输入层每个像素对应输出1个像素,步幅为1)

针对不同层的计算规则:

  1. 卷积层(Same Padding,步长s):
    RF = RF + (核尺寸 - 1) * S
    S = S * s
  2. 池化层(步长s):
    RF = RF + (池化核尺寸 - 1) * S
    S = S * s
  3. 特殊层处理:
    • Dropout、Concatenate:不改变空间特征提取逻辑,RF和S保持不变
    • UpSampling:仅放大特征图,不提取新空间信息,RF不变,S = S // 上采样倍数
    • 拼接层(Concatenate):取两个输入特征图中较大的RF作为输出RF

二、U-Net模型逐层感受野计算

下采样阶段

层类型核/池化尺寸步长感受野(RF)输出步幅(S)
输入层--11
第1个3x3卷积3131
第2个3x3卷积3151
2x2最大池化2262
第1个3x3卷积(128维)31102
第2个3x3卷积(128维)31142
2x2最大池化22164
第1个3x3卷积(256维)31244
第2个3x3卷积(256维)31324
2x2最大池化22368
第1个3x3卷积(512维)31528
第2个3x3卷积(512维)31688
Dropout--688
2x2最大池化227616
第1个3x3卷积(1024维)3110816
第2个3x3卷积(1024维)3114016
Dropout--14016

上采样阶段

层类型核/上采样尺寸步长感受野(RF)输出步幅(S)补充说明
2x2上采样2-1408步幅减半,RF不变
2x2卷积(512维)211488卷积扩展RF
拼接(drop4+up6)--1488取较大RF(148>68)
第1个3x3卷积(512维)311648卷积扩展RF
第2个3x3卷积(512维)311808卷积扩展RF
2x2上采样2-1804步幅减半,RF不变
2x2卷积(256维)211844卷积扩展RF
拼接(conv3+up7)--1844取较大RF(184>32)
第1个3x3卷积(256维)311924卷积扩展RF
第2个3x3卷积(256维)312004卷积扩展RF
2x2上采样2-2002步幅减半,RF不变
2x2卷积(128维)212022卷积扩展RF
拼接(conv2+up8)--2022取较大RF(202>14)
第1个3x3卷积(128维)312062卷积扩展RF
第2个3x3卷积(128维)312102卷积扩展RF
2x2上采样2-2101步幅减半,RF不变
2x2卷积(64维)212111卷积扩展RF
拼接(conv1+up9)--2111取较大RF(211>5)
第1个3x3卷积(64维)312131卷积扩展RF
第2个3x3卷积(64维)312151卷积扩展RF
输出层3x3卷积312171最终感受野

最终输出层的每个像素,对应输入图像的217x217大小区域,这就是该模型的感受野。

三、感受野验证方法

方法1:标记输入验证法

通过构造特殊输入,观察输出响应验证感受野大小:

  1. 生成一张320x320的全0图像,仅将中心位置(160,160)的像素设为1
  2. 将该图像输入模型,得到输出特征图
  3. 观察输出中不为0的区域:输出中心像素对应的输入影响区域应为160 - (217-1)/2 = 52到160 + (217-1)/2 = 268,即输入图像中52~268的区域(共217个像素)会影响输出中心像素,若输出中只有对应区域的响应,则验证了计算结果。

代码示例:

import numpy as np
import tensorflow as tf
from tensorflow.keras import layers, models, regularizers

# 加载模型
model = Generator()

# 构造标记输入
input_img = np.zeros((1, 320, 320, 3))
input_img[0, 160, 160, :] = 1.0

# 前向计算
output = model.predict(input_img, verbose=0)

# 定位输出非零区域
non_zero_y, non_zero_x = np.where(output[0, :, :, 0] > 1e-6)
min_y, max_y = non_zero_y.min(), non_zero_y.max()
min_x, max_x = non_zero_x.min(), non_zero_x.max()

# 计算对应的输入区域范围(输出步幅为1,所以输出区域大小等于感受野覆盖的输入范围)
print(f"输出非零区域大小: {max_y - min_y + 1}x{max_x - min_x + 1}")
print(f"对应输入区域范围: y[{160-(max_y-min_y)//2}~{160+(max_y-min_y)//2}], x[{160-(max_x-min_x)//2}~{160+(max_x-min_x)//2}]")

方法2:脚本自动计算验证

编写脚本逐层遍历模型层,按照计算逻辑自动计算感受野,和手动计算结果对比:

def compute_receptive_field(model):
    rf = 1
    stride = 1
    for layer in model.layers:
        if isinstance(layer, layers.Conv2D):
            k_size = layer.kernel_size[0]
            s = layer.strides[0]
            rf += (k_size - 1) * stride
            stride *= s
        elif isinstance(layer, layers.MaxPooling2D):
            p_size = layer.pool_size[0]
            s = layer.strides[0]
            rf += (p_size - 1) * stride
            stride *= s
        elif isinstance(layer, layers.UpSampling2D):
            up_size = layer.size[0]
            stride = stride // up_size
        # Dropout、Concatenate不改变rf和stride
    return rf, stride

# 计算并打印结果
rf, stride = compute_receptive_field(model)
print(f"自动计算感受野大小: {rf}x{rf}")
print(f"输出步幅: {stride}")

运行脚本后,若输出为217x217,则和手动计算结果一致,验证正确。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 00:12:00