打卡day48
随机初始化权重 + 广播的矩阵运算
import numpy as np# 随机初始化权重矩阵 (3个神经元的输入层 → 2个神经元的输出层)
W = np.random.randn(2, 3) * 0.01 # 随机高斯分布# 输入数据 (4个样本,每个样本3个特征)
X = np.random.rand(4, 3) # 生成随机初始权重# 广播机制实现全连接层
# W.shape=(2,3), X.shape=(4,3) → 需要转置X使维度匹配
Z = np.dot(X, W.T) # 广播:自动扩展维度计算 (4,3) @ (3,2) → (4,2)print("输出矩阵形状:", Z.shape) # (4, 2)
输出
输出矩阵形状: (4, 2)
批量数据添加随机噪声
import torch# 生成真实数据 (100样本, 特征维度5)
data = torch.randn(100, 5) # 生成同维度的随机噪声张量# 创建随机噪声 (利用广播自动扩展到所有样本)
noise_intensity = 0.1
noise = noise_intensity * torch.randn(100, 5) # 独立噪声# 广播机制添加噪声 (相同形状直接相加)
noisy_data = data + noiseprint("噪声数据示例:\n", noisy_data[:2])
输出
噪声数据示例:tensor([[ 1.5465, 1.0551, -1.5296, -0.8784, 1.1809],[ 1.0077, -0.1633, 1.2001, -0.9204, 0.8572]])
Dropout正则化实现
def dropout_layer(X, dropout_rate):if dropout_rate == 0: return X# 生成随机掩码(利用广播保留原始维度)mask = (torch.rand(X.shape) > dropout_rate).float() # torch.rand生成随机掩码# 缩放并应用掩码(广播到所有元素)return mask * X / (1 - dropout_rate)# 测试
X = torch.ones(3, 4)
print("Dropout结果:\n", dropout_layer(X, 0.5))
输出
Dropout结果:tensor([[2., 2., 0., 2.],[0., 2., 2., 0.],[2., 0., 2., 0.]])
参数随机扰动 + 广播比较
# 模型参数
theta = np.array([1.0, -0.5, 2.0]) # 生成随机扰动方向 (广播到每个参数)
perturbation = np.random.choice([-0.1, 0.1], size=theta.shape)# 评估两个候选参数
candidate1 = theta + perturbation
candidate2 = theta - perturbationprint(f"原始参数: {theta}")
print(f"扰动方向: {perturbation}")
print(f"候选1: {candidate1}\n候选2: {candidate2}")
输出
原始参数: [ 1. -0.5 2. ]
扰动方向: [ 0.1 0.1 -0.1]
候选1: [ 1.1 -0.4 1.9]
候选2: [ 0.9 -0.6 2.1]