【发布时间】:2021-07-27 23:40:04
【问题描述】:
我有一个神经网络Network,它有一个向量输出。我不想使用典型的损失函数,而是想实现我自己的损失函数,它是某个类中的一种方法。这看起来像:
class whatever:
def __init__(self, network, optimizer):
self.network = network
self.optimizer = optimizer
def cost_function(relevant_data):
...implementation of cost function with respect to output of network and relevant_data...
def train(self, epochs, other_params):
...part I'm having trouble with...
我主要关心的是渐变。由于我采用的是自己的自定义损失函数,是否需要针对成本函数实现自己的梯度?
一旦我做了数学,我意识到如果成本是 J,那么就网络最后一层的梯度而言,J 的梯度是一个相当简单的函数。即,它看起来像:Equation link。
如果我使用一些传统的损失函数,例如 CrossEntropy,我的后处理将如下所示:
objective = nn.CrossEntropyLoss()
for epochs:
optimizer.zero_grad()
output = Network(input)
loss = objective(output, data)
loss.backward()
optimizer.step()
但在我的情况下,我们如何做到这一点?我的猜测是这样的:
for epochs:
optimizer.zero_grad()
output = Network(input)
loss = cost_function(output, data)
#And here is where the problem comes in
loss.backward()
optimizer.step()
loss.backward() 据我了解,它采用损失函数相对于参数的梯度。但是我是否仍然可以在使用自己的损失函数时调用它(大概程序不知道梯度方程是什么)。我是否还必须实现另一种方法/子例程才能找到渐变?
这让我想到了另一个问题:如果我确实想为我的损失函数实现梯度计算,我还需要神经网络参数的梯度。我如何获得那些?有这样的功能吗?
【问题讨论】:
标签: python machine-learning neural-network pytorch backpropagation