要绘制上述代码中权重初始化的分布,可以分别展示每一层初始化权重的直方图。我们将用 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,标准差为
-
绘制直方图:每个子图展示了不同层初始化权重的分布情况。
通过这些图形,可以直观地看到不同标准差和不同层的权重分布情况。这有助于理解权重初始化对神经网络的影响。