nn.MSELoss均方损失函数:
这里,loss,x,y的维度是一样的,可以是向量或者矩阵,i是下标。比如若x,y是矩阵
则x,y的均方误差计算是逐元素运算的
import torch
import torch.nn as nn
crit=nn.MSELoss()#均方损失函数
target = torch.FloatTensor([[1, 2, 3], [4, 5, 6]])
pred= torch.FloatTensor([[7, 8, 9], [8, 4, 3]])
cost=crit(pred,target)#将pred,target逐个元素求差,然后求平方,再求和,再求均值,
print(cost)#tensor(22.3333)
sum=0
for i in range (0,2):#遍历行i
for j in range(0,3):#遍历列
sum+=(target[i][j]-pred[i][j])*(target[i][j]-pred[i][j])#对应元素做差,然后平方
print(sum/6)#tensor(22.3333)
很多的loss函数都有size_average和reduce两个布尔类型的参数,因为一般损失函数都是直接计算batch的数据,因此返回的loss结果都是维度为(batch_size,)的向量。
1)如果reduce=False,那么size_average参数失效,直接返回向量形式的loss
2)如果redcue=true,那么loss返回的是标量。
2.a: if size_average=True, 返回loss.mean();#就是平均数
2.b: if size_average=False,返回loss.sum()
注意:默认情况下,reduce=true,size_average=true