提问人:cgbsu 提问时间:11/6/2023 最后编辑:desertnautcgbsu 更新时间:11/6/2023 访问量:43
规范化值太小或溢出
Normalization values too small or overflow
问:
我在 PyTorch 中有一个简单的 NN(新手)。我正在尝试拟合 Sellmeier 方程的值。
我的网络非常简单:
self.linear_relu_stack = nn.Sequential(
nn.Linear(self.input_count, self.input_count * self.hidden_layer_scalar),
nn.ReLU(),
nn.Linear(
self.input_count * self.hidden_layer_scalar,
self.input_count * self.hidden_layer_scalar
),
nn.ReLU(),
nn.Linear(self.input_count * self.hidden_layer_scalar, self.sellmeirer_term_count * 2)
)
对于每一步,我都会获取输出层(系数)并将其放入 Sellmeier 函数中以获得输出,然后计算损失(请原谅拼写错误)
def forward(self, inputs):
self.sellmeirer_coefficients = self.linear_relu_stack(inputs)
self.compute_refractive_indicies()
return self.output_refractive_indicies
def compute_refractive_indicies(self):
self.output_refractive_indicies = sellmeirer3(
self.wave_lengths,
*tuple(self.sellmeirer_coefficients)# * self.sellmeirer_scalar) <-- This comment is very relevant to the question
)
return self.output_refractive_indicies
#...
def train(device, model, loss_function, optimizer, total_iteration_count):
model.train()
progress_output = "Starting up"
for current_iteration in range(total_iteration_count):
parameters = model.parameters_to_array().to(device)
prediction = model(parameters)
loss = loss_function(prediction, model.refractive_indicies) # refractive_indicies and wave_lengths come from data
loss.backward()
optimizer.step()
optimizer.zero_grad()
return model, model.sellmeirer_coefficients
Sellmeier 系数显示为 -1 和 1 之间的值,但我认为这可能不是我需要的值范围(可能太小,因为输出太小)。因此,我尝试在计算折射率时放大系数,然后使用已知折射率 + 在损失函数中计算的折射率进行反馈。即使我没有将相乘的 Sellmeier 系数积分回输入层(仅将 -1 到 1 的比例),并将折射率(计算和数据)归一化为这样的比例,Sellmeier 系数也会爆炸,并且输入层接收的值最终会溢出(10^(30+something) 表示 32 但浮点数,10^(n * 100) 表示 n 小于 4 或 5), 导致楠的。
我真的不知道为什么这种不离散地馈入网络的乘法会导致这种情况,我怎样才能让神经网络输出在范围 1 到 1 之外,将包括其先前输出的输入(Sellmeier 系数,还有:来自数据的折射率、计算的折射率、波长)作为输入,并从中学习?为什么缩放它会导致它爆炸?
我认为我所做的规范化有点偏离,但是,虽然我所做的调整确实有所帮助,但在大约 100k 步的训练后,我一度得到了 NaN。Sellmeier 系数似乎确实超出了 -1 到 1 的范围。这是错误的吗?
经过 1000000 步后,Sellmeier 系数的值似乎再次从 -1 归一化为 1。另外,我没有看到 NaN。但我有一种感觉,它可能会让 NaN 以某种方式“慢跑”出来。
答: 暂无答案
评论