验证 CrossEntropyLoss 内部运算过程

## 验证 CrossEntropyLoss 内部运算过程
import torch
from torch.nn import CrossEntropyLoss
from torch.optim import SGD

# 假设三分类真实值real 和预测值pred
real = [0,1,1,2]
pred = [[0.7,0.2,0.1],
        [0.1,0.6,0.3],
        [0.1,0.6,0.3],
        [0.2,0.2,0.6]]
real = torch.tensor(real)
pred = torch.tensor(pred)

# 使用torch 内置模块计算
cel = CrossEntropyLoss()
print(cel(pred,real)) --> # 得出结果tensor(0.8312)


# 按自己理解计算,先把真实标签转化为one-hot编码,再乘以log(softmax(pred)),每个样本结果求和再求平均数
#1. 先真实标签one-hot化
def func(x):
    res = np.zeros(len(set(real.tolist())))
    res[x] = 1
    return res
real_ = torch.tensor(list(map(func,real)))
real_
'''
tensor([[1., 0., 0.],
        [0., 1., 0.],
        [0., 1., 0.],
        [0., 0., 1.]], dtype=torch.float64)
'''

#2. 将预测值转化为softmax值
pred_softmax = torch.softmax(pred,dim=1)
pred_softmax
'''
tensor([[0.4640, 0.2814, 0.2546],
        [0.2584, 0.4260, 0.3156],
        [0.2584, 0.4260, 0.3156],
        [0.2864, 0.2864, 0.4272]])
'''
#3. 计算交叉熵

-1*(torch.mv(real_[0].unsqueeze(dim=0).float(),torch.log(pred_softmax[0]).float())
+torch.mv(real_[1].unsqueeze(dim=0).float(),torch.log(pred_softmax[1]).float())
+torch.mv(real_[2].unsqueeze(dim=0).float(),torch.log(pred_softmax[2]).float())
+torch.mv(real_[3].unsqueeze(dim=0).float(),torch.log(pred_softmax[3]).float()))/4
# --> tensor([0.8312]) 与上述函数求出结果一样

推荐这些文章:

TypeError: can't convert cuda:0 device type tensor to numpy. Use Tensor.cpu() to copy the tensor to host memory first.

代码
# -*- coding: utf-8 -*-
"""
Created on Sat Feb 19 13:19:30 2022

@author: koneko
"""

from matplotlib import pyplot as plt
import torch
import math

dtype = torch.float
device = torch.device("cuda:0")

# Create random input and output data
x = torch.linspace(-math.pi, math.pi, 2000, device=dev...

Pytorch常用创建Tensor方法总结

1、import from numpy / list
方法:torch.from_numpy(ndarray) 常见的初始化有torch.tensor和torch.Tensor 区别:

tensor():通过numpy 或 list 的现有数据初始化
Tensor():

1、接收数据的维度(,)shape
2、接收现有的数据[,]

Example:

a = np.array([1,2,3])
data = torch.from_numpy(a)
print(data)
"""
输出:
tensor([...

Pytorch初始化模型参数

#高斯分布torch.nn.init.normal_(tensor: torch.Tensor, mean: float = 0.0, std: float = 1.0) → torch.Tensor#均匀分布torch.nn.init.uniform_(tensor: torch.Tensor, a: float = 0.0, b: float = 1.0) → torch.Tensor#常数分布torch.nn.init.constant_(tensor: torch.Tensor, val: float) → torch.Tensor#全0分布torch.nn.init.zeros_(...

torch.squeeze() 和torch.unsqueeze()的用法,给tensor删除或者添加维度为1的维度(squeeze和unsqueeze)

import torch
x = torch.randn(3,1,4,1,2)
a = x.squeeze(dim=1) # 成员函数删除第二维度
print(a.shape)
b = torch.squeeze(x, dim=1) # torch自带函数删除第二维度
print(b.shape)
c = torch.squeeze(x, dim=3) # 删除第三维度
print(c.shape)
d = torch.squeeze(x) # 若不标注删除第几维度,则会删除所有为1的维度
print(d.shape)

输出:torch.Size([3, 4, 1, 2])tor...

pytorch中几个难理解的方法整理--gather&squeeze&unsqueeze

gather
pytorch中gather源码形式:torch.gather(input, dim, index, *, sparse_grad = False, out = None)
然后在pytorch官方文档中,写了这样的一个例子,这个例子是三维的
out[i][j][k] = input[index[i][j][k]][j][k] # if dim == 0
out[i][j][k] = input[i][index[i][j][k]][k] # if dim == 1
out[i][j][k] = input[i][j][index[i][j][k]] # if dim =...

torch中的几个函数(min()、max()、prod()、clamp_()、where())

torch.min()、torch.max()、torch.prod() 
   这两个函数很好理解,就是求张量中的最小值和最大值以及相乘
    1.在这两个函数中如果没有指定维度的话,那么默认是将张量中的所有值进行比较,输出最大值或者最小值或是所有值相乘。
    2.而当指定维度之后,会将对应维度的数据进行比较,同时输出的有最小值以及这个最小值在对应维度的下标,或是指定维度相乘
    3.使用这两个函数对两个张量进行比较时,输出的是张量中每一个值对应位置的最小值,对应位置相乘

1 >>> a = torch.Tensor([[1,2,3,4]...

Pytorch nn.BCEWithLogitsLoss() 的简单理解与用法

这个东西,本质上和nn.BCELoss()没有区别,只是在BCELoss上加了个logits函数(也就是sigmoid函数),例子如下:

import torch
import torch.nn as nn

label = torch.Tensor([1, 1, 0])
pred = torch.Tensor([3, 2, 1])
pred_sig = torch.sigmoid(pred)
loss = nn.BCELoss()
print(loss(pred_sig, label))

loss = nn.BCEWithLogitsLoss()
print(loss(pred, la...

【pytorch】normal函数的详细使用和常见错误

normal函数的详细使用和常见错误
1.normal(mean, std, *, generator=None, out=None)

返回值:一个张量,张量中每个元素是从相互独立的正态分布中随机生成的。每个正态分布的均值和标准差对应着mean中的一个值和std中的一个值
参数

mean(tensor):是一个张量,存储着输出张量中每个元素正态分布的均值
std(tensor):是一个张量,存储着输出张量中每个元素正态分布的标准差
注意:张量mean和std的形状不一定相同,但是元素个数必须相同。如果二者形状不一致,返回张量的形状和mean的一致
generator=None:用于采样的...

torch.bmm(), torch.mul(), torch.matmul()

torch.mul(a, b)
点乘:对应位相乘,维度必须相等
返回维度与 a, b 相同
torch.mm(a, b)
矩阵相乘
如:
a: [1, 2]
b: [2, 3]
output: [1, 3]
torch.bmm(a, b)
a, b必须是3D维度的,对两个向量维度有要求。
a: [p, m, n]
b: [p, n, q]
output: [p, m, q]
可看作把第 0 维 p 提出,[m, n] 与 [n, q] 相乘(维度层面)
import torch
x = torch.rand(2,3,6)
y = torch.rand(2,6,7)
print(torch.b...

Python——torch.unsqueeze

unsqueeze在指定位置处插入尺寸为1的维度。
注意:返回的张量与此张量共享相同的基础数据。
 
>>> x = torch.tensor([1, 2, 3, 4])
>>> torch.unsqueeze(x, 0)
tensor([[ 1, 2, 3, 4]])
>>> torch.unsqueeze(x, 1)
tensor([[ 1],
[ 2],
[ 3],
[ 4]])
 

 

...

文章标题:验证 CrossEntropyLoss 内部运算过程
文章链接:https://www.dianjilingqu.com/51128.html
本文章来源于网络,版权归原作者所有,如果本站文章侵犯了您的权益,请联系我们删除,联系邮箱:saisai#email.cn,感谢支持理解。
THE END
< <上一篇
下一篇>>