扩张/空洞卷积可视化

目录

可视化效果

1. 修改特征图大小

2. 调整膨胀率

3. 改变卷积核

位置 1:dilated_conv_one_pixel 函数中大小

位置 2:dilated_conv_all_map 函数中

4. 自定义可视化

完整代码 


可视化效果

1. 修改特征图大小

在main函数中,可以修改size改变特征图尺寸。

def main():
    # 初始化特征图
    size = 64  # 修改为用户希望的尺寸
    m = np.zeros(shape=(size, size), dtype=np.int32)
    center = size // 2
    m[center][center] = 1

2. 调整膨胀率

在main函数中,修改dilated_rates=[1,2,5]这行代码,改为你希望的膨胀率列表,例如[1,3,7]

def main():
    # 从下到上设置膨胀率
    dilated_rates = [1, 3, 7]  # 修改为用户希望的膨胀率
    # ...

3. 改变卷积核

位置 1:dilated_conv_one_pixel 函数中大小

找到 k: int = 3 这行代码,将 3 改为你希望的卷积核大小,例如 5。

def dilated_conv_one_pixel(center: (int, int),
                          feature_map: np.ndarray,
                          k: int = 5,  # 修改为用户希望的卷积核大小
                          r: int = 1,
                          v: int = 1):
    # ...

位置 2:dilated_conv_all_map 函数中

找到 k: int = 3 这行代码,将 3 改为你希望的卷积核大小,例如 5。

def dilated_conv_all_map(dilated_map: np.ndarray,
                        k: int = 5,  # 修改为用户希望的卷积核大小
                        r: int = 1):
    # ...

4. 自定义可视化

在plot_map 函数中
(1)修改颜色映射
  找到 c_list = ['white', 'blue', 'red'] 这行代码,将 ['white', 'blue', 'red'] 改为你希望的颜色列表,例如 ['green', 'yellow', 'purple']。
(2)修改网格线样式
  找到 ax.grid(which='minor', color='black', linestyle='-', linewidth=1.5) 这行代码,调整 color(颜色)、linestyle(线型)和 linewidth(线宽)参数。
(3)修改文字颜色切换点
  找到 thresh = 5 这行代码,将 5 改为你希望的阈值,例如 10。

def plot_map(matrix: np.ndarray):
    # ...(前置代码保持不变)
    c_list = ['green', 'yellow', 'purple']  # 修改颜色映射
    new_cmp = LinearSegmentedColormap.from_list('chaos', c_list)
    # ...(中间代码保持不变)
    ax.grid(which='minor', color='gray', linestyle='--', linewidth=1.0)  # 修改网格线样式
    # ...(中间代码保持不变)
    thresh = 10  # 修改文字颜色切换点
    # ...(后续代码保持不变)

完整代码 

特征图大小:main 函数中的 size
膨胀率:main 函数中的 dilated_rates
卷积核大小:dilated_conv_one_pixel 和 dilated_conv_all_map 函数中的 k
初始特征图:main 函数中的 m
可视化参数:plot_map 函数中的颜色、网格线和阈值
通过修改这些位置的参数,你可以灵活地定制膨胀卷积的行为和可视化效果。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import LinearSegmentedColormap


def dilated_conv_one_pixel(center: (int, int),
                           feature_map: np.ndarray,
                           k: int = 3,
                           r: int = 1,
                           v: int = 1):
    """
    膨胀卷积核中心在指定坐标center处时,统计哪些像素被利用到,
    并在利用到的像素位置处加上增量v
    Args:
        center: 膨胀卷积核中心的坐标
        feature_map: 记录每个像素使用次数的特征图
        k: 膨胀卷积核的kernel大小
        r: 膨胀卷积的dilation rate
        v: 使用次数增量
    """
    assert divmod(k, 2)[1] == 1

    # left-top: (x, y)
    left_top = (center[0] - ((k - 1) // 2) * r, center[1] - ((k - 1) // 2) * r)
    for i in range(k):
        for j in range(k):
            feature_map[left_top[1] + i * r][left_top[0] + j * r] += v


def dilated_conv_all_map(dilated_map: np.ndarray,
                         k: int = 3,
                         r: int = 1):
    """
    根据输出特征矩阵中哪些像素被使用以及使用次数,
    配合膨胀卷积k和r计算输入特征矩阵哪些像素被使用以及使用次数
    Args:
        dilated_map: 记录输出特征矩阵中每个像素被使用次数的特征图
        k: 膨胀卷积核的kernel大小
        r: 膨胀卷积的dilation rate
    """
    new_map = np.zeros_like(dilated_map)
    for i in range(dilated_map.shape[0]):
        for j in range(dilated_map.shape[1]):
            if dilated_map[i][j] > 0:
                dilated_conv_one_pixel((j, i), new_map, k=k, r=r, v=dilated_map[i][j])

    return new_map


def plot_map(matrix: np.ndarray):
    plt.figure()

    c_list = ['white', 'blue', 'red']
    new_cmp = LinearSegmentedColormap.from_list('chaos', c_list)
    plt.imshow(matrix, cmap=new_cmp)

    ax = plt.gca()
    ax.set_xticks(np.arange(-0.5, matrix.shape[1], 1), minor=True)
    ax.set_yticks(np.arange(-0.5, matrix.shape[0], 1), minor=True)

    # 显示color bar
    plt.colorbar()

    # 在图中标注数量
    thresh = 5
    for x in range(matrix.shape[1]):
        for y in range(matrix.shape[0]):
            # 注意这里的matrix[y, x]不是matrix[x, y]
            info = int(matrix[y, x])
            ax.text(x, y, info,
                    verticalalignment='center',
                    horizontalalignment='center',
                    color="white" if info > thresh else "black")
    ax.grid(which='minor', color='black', linestyle='-', linewidth=1.5)
    plt.show()
    plt.close()


def main():
    # bottom to top
    dilated_rates = [1, 2, 5]
    # init feature map
    size = 31
    m = np.zeros(shape=(size, size), dtype=np.int32)
    center = size // 2
    m[center][center] = 1
    # print(m)
    # plot_map(m)

    for index, dilated_r in enumerate(dilated_rates[::-1]):
        new_map = dilated_conv_all_map(m, r=dilated_r)
        m = new_map
    print(m)
    plot_map(m)


if __name__ == '__main__':
    main()

### RepLKNet感受野可视化 为了理解RepLKNet的感受野特性,重要的是要了解其独特的卷积结构设计。在传统卷积神经网络中,感受野通常由卷积核大小、步幅以及层数决定。然而,在RepLKNet中引入了特殊的局部建模能力[^1]。 #### 中心精细粒度与周边广泛共享 由于采用了"focus-and-blur"机制,RepLKNet能够在中心区域维持较高的分辨率和细节捕捉能力,而在外围部分则通过更大范围内的特征共享来减少计算量并提高效率。具体来说: - **中心5×5区域**:保持较高密度的卷积操作以捕获更细致的空间信息。 - **边缘区域**:允许较大程度上的参数共享,从而降低整体模型复杂度而不显著影响最终表现。 这种设计使得即使在网络较深的情况下也能有效扩大实际的感受野尺寸,同时确保核心视觉模式得到充分表达。 #### 指数增长网格布局 另一个关键因素在于所使用的指数型扩张策略。相比于均匀分布或其他形式的增长方式,这种方式能够更好地平衡不同尺度下的空间覆盖需求,并且有助于形成更加紧凑高效的连接模式。这不仅优化了资源分配,也增强了对于多尺度目标检测任务的支持力度。 ```python import matplotlib.pyplot as plt import numpy as np def plot_receptive_field(center_size=5, outer_stride=2, levels=4): fig, ax = plt.subplots() # 绘制中心高精度区 center_points = [(i,j) for i in range(-center_size//2+1, center_size//2+1) for j in range(-center_size//2+1, center_size//2+1)] x_center, y_center = zip(*center_points) ax.scatter(x_center, y_center, c='blue', label=f'Center {center_size}x{center_size}') current_radius = center_size // 2 colors = ['red', 'green', 'purple'] # 绘制外层低精度区 for level in range(1, levels + 1): radius = int(current_radius * (outer_stride ** level)) points = [] for angle in np.linspace(0, 2*np.pi, num=radius*8, endpoint=False): dx = int(radius * np.cos(angle)) dy = int(radius * np.sin(angle)) if abs(dx)<=current_radius and abs(dy)<=current_radius: continue points.append((dx,dy)) x_outer, y_outer = zip(*points) ax.scatter(x_outer, y_outer, c=colors[level%len(colors)], alpha=0.7, s=(level+1)*30, edgecolor='black', label=f'Level-{level}, Radius={radius}') ax.legend(loc="upper right", bbox_to_anchor=(1.2, 1), fontsize=9) ax.set_title('Receptive Field Visualization of RepLKNet') ax.grid(True) plot_receptive_field() plt.show() ``` 此代码片段展示了如何绘制一个简化版的感受野图示,其中蓝色表示中心细粒度区域(`5x5`),其他颜色代表随着距离增加逐渐变宽泛的不同层次的感受野扩展情况。请注意,实际实现可能会有所不同,取决于具体的架构配置和其他超参数的选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值