【TensorFlow&PyTorch】loss损失计算

简单来说,深度学习就是通过计算梯度、反向传播来不断改善网络内的参数,以此使得网络模型更加贴合目标数据。而梯度和loss值是分不开的,选择好合适的loss计算方法也是有助于训练好优秀的网络模型的。

常用的loss计算方法有两种,一个是均方差,另一个是交叉熵。均方差差不多是万金油,什么都可以套一套,通常与sigmoid激活函数搭配使用。交叉熵则更加适合分类问题,简单来说,交叉熵越低,事物发生的确定性越大。

下面简单介绍一下TensorFlow和PyTorch的损失计算的API。

均方差:

均方差=∑(y-out)**2

其中out为计算值,也就是模型的计算结果。y为真实值,也就是数据集中的正确的结果。

TensorFlow:

loss=tensorflow.keras.losses.MSE(计算值,真实值)
loss=tensorflow.reduce_mean(loss)

PyTorch:

loss=torch.nn.functional.mse_loss(计算值,真实值)
#PyTorch中默认会把loss值都加起来,所以比 TensorFlow少一行代码

 交叉熵:

交叉熵 H(p,q)=-∑p(x)·㏒₂q(x)

 p和q分别为两个事件,p(x)和q(x)为两个事件发生的概率。

下面输入的计算值和真实值都需要进行one-hot处理.

TensorFlow中one-hot接口:one-hot=tensorflow.one_hot(输入值,depth=一共分了几类)

PyTorch中会自动进行one-hot处理

TensorFlow:

真实值=tensorflow.one-hot(真实值,depth=2/n)
#二分类时:
计算值=tensorflow.one-hot(计算值,depth=2)
loss=tensorflow.losses.binary_crossentropy(计算值,真实值)

#多分类时:
计算值=tensorflow.one-hot(计算值,depth=n)
loss=tensorflow.losses.categorical_crossentropy(计算值,真实值)

PyTorch:

loss=torch.nn.functional.cross_entropy(计算值,真实值)

处理loss:

 总的流程是loss->梯度->优化器。

计算出loss后进行梯度求导,如何传入优化器,由优化器来调整网络的参数。

TensorFlow:

#例:
with tensorflow.Gradient Tape() as tape:
    out=model(x)
    loss=tensorflow.keras.losses.MSE(y,out)
    grad=tape.gradient(loss,model.trainable_variables)
optimizer.apply_gradients(zip(grad,model.trainable_variables))

PyTorch:

#例:
out=model(x)
loss=torch.nn.function.mse_loss(out,y)
#貌似不需要这行??? grads=torch.autograd.grad(loss,model.paremeters())
optimizer.zero_grad()
loss.backward()
optimizer.step()

其中,model是网络模型,optimizer是优化器。

你可能感兴趣的:(tensorflow,pytorch,深度学习)