【发布时间】:2021-02-14 22:38:40
【问题描述】:
我正在使用 PyTorch,但对这个库还是很陌生。
我的输入和输出之间存在y = ax + b 给出的关系,其中a 和b 是从某个分布(比如Uniform)中采样的,也就是说,它们是随机的。我想训练一个网络在看到y 和a 时预测x。我正在使用一个名为probability_network 的网络,其中包含nn.Linear 层。 N(比如 10 个)类可供 x 选择。
class ProabilityNetwork(nn.Module):
def __init__(self):
super(ProabilityNetwork, self).__init__()
self.fc1 = nn.Linear(8, 76)
self.fc2 = nn.Linear(76, 150)
self.fc3 = nn.Linear(150, 75)
self.fc4 = nn.Linear(75, 14)
self.fc5 = nn.Linear(14, 10)
self.tanh = nn.Tanh()
self.sigmoid = nn.Sigmoid()
self.relu = nn.ReLU()
self.softmax = nn.Softmax(dim=1)
def forward(self, inputs):
return self.softmax(self.fc5(self.fc4(self.relu(self.fc3(self.relu(self.fc2(self.relu(self.fc1(inputs)))))))))
probabilty_network = ProbabilityNetwork()
在看到y 时,损失函数应该帮助网络预测一个x 最小化||y-ax||^2。 y = ax + b 中的所有数量都是向量(在本例中每个长度为 4)。我已经尝试过以下损失函数。
prob_values = probabilty_network(torch.cat([y, a], dim=0)) # shape: (batch_size, 10)
x_hat = mapping_tensor[torch.argmax(prob_values, dim=1)] # Mapping from probability to one of 10 classes, mapping_tensor is an array of shape (10, 4)
mse_loss = nn.MSELoss()
loss = mse_loss(y, a*x_hat)
例如,mapping_tensor 可以包含从 0 (0000) 到 9 (1001) 的值的二进制表示。我需要类的二进制表示的原因是我需要一个向量x 来表示损失||y-ax||^2。在这种情况下,x 是一个 4 长度向量,而神经网络的输出是一个 10 长度向量。
上述设置不起作用。预测类中一半的值(以二进制形式写出)总是错误的,这意味着网络在训练时很混乱。
此外,这不是一个无法解决的问题。存在上述损失函数的解决方案(当然有误差,但误差远小于 50%),但计算量很大。我正在尝试检查网络是否可以以某种方式学会以较低的复杂性进行预测。任何帮助表示赞赏。谢谢。
此外,从优化的角度来看,损失函数是最好的解决方案(据我所知)。所以,改变损失函数只会导致更差的结果。
另一种看待问题的方法如下。假设网络看到y 和a。然后网络为每个类x(10 个可能的类)计算|y-ax|,然后选择计算值最小的类。我的问题是,我可以使用什么损失函数来使网络以这种方式训练?
【问题讨论】:
-
你在
mapping_tensor失去了我。直到那时,这看起来像是一个最小二乘回归问题。根据您之前给出的问题陈述,我不清楚映射的目的是什么,也不清楚二进制表示与任何事情有什么关系。 -
@jodag 很抱歉含糊其辞。网络应该预测一个类别。该类具有二进制表示。从网络给出的概率向量的argmax,我找到这个类表示,然后在损失函数中使用这个表示。损失函数期望一个向量和概率向量不能被输入。这清楚吗?
标签: python machine-learning deep-learning pytorch