目录
位置 1:dilated_conv_one_pixel 函数中大小
可视化效果
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()