要绘制上述代码中权重初始化的分布,可以分别展示每一层初始化权重的直方图。我们将用 torch.fmod 对 torch.normal 生成的随机数进行取模运算,确保权重值在 -2 到 2 之间。
含义解释
- torch.normal(0, init_sd, size=...):生成服从均值为 0、标准差为- init_sd的正态分布的张量。
- torch.fmod(tensor, 2):对张量- tensor中的每个元素取模 2 操作,结果在 [-2, 2) 范围内。
绘制分布的代码
以下代码生成初始化权重并绘制其直方图:

import torch
import matplotlib.pyplot as plt# 参数
x_dim = 100  # 示例输入维度
width = 50   # 隐藏层宽度
n_double = 10  # 示例额外维度
init_sd_first = 0.1
init_sd_middle = 0.5
init_sd_last = 1.0# 初始化权重
initial_weights = [torch.fmod(torch.normal(0, init_sd_first, size=(x_dim, width + n_double)), 2),torch.fmod(torch.normal(0, init_sd_middle, size=(width, width + n_double)), 2),torch.fmod(torch.normal(0, init_sd_middle, size=(width, width + n_double)), 2),torch.fmod(torch.normal(0, init_sd_last, size=(width, 1)), 2)
]# 绘制直方图
plt.figure(figsize=(20, 5))titles = ["Initial Weights Layer 1", "Initial Weights Layer 2", "Initial Weights Layer 3", "Initial Weights Layer 4"]
for i, weights in enumerate(initial_weights):plt.subplot(1, 4, i + 1)plt.hist(weights.numpy().flatten(), bins=30, color='blue', alpha=0.7)plt.title(titles[i])plt.xlabel('Weight Value')plt.ylabel('Frequency')plt.tight_layout()
plt.show()
说明
-  参数设置: x_dim、width和n_double分别代表输入维度、隐藏层宽度和额外维度。
-  初始化权重: - 第一层权重初始化:均值为 0,标准差为 init_sd_first,尺寸为(x_dim, width + n_double)。
- 第二层和第三层权重初始化:均值为 0,标准差为 init_sd_middle,尺寸为(width, width + n_double)。
- 第四层权重初始化:均值为 0,标准差为 init_sd_last,尺寸为(width, 1)。
- 使用 torch.fmod对初始化权重取模 2,使得权重在 [-2, 2) 范围内。
 
- 第一层权重初始化:均值为 0,标准差为 
-  绘制直方图:每个子图展示了不同层初始化权重的分布情况。 
通过这些图形,可以直观地看到不同标准差和不同层的权重分布情况。这有助于理解权重初始化对神经网络的影响。