在深度学习中常用的torch,np语法

17 篇文章 2 订阅
16 篇文章 0 订阅

常用torch,np语法

一、torch
1.torch加载和保存模型:
有两种方式,一种是保存的是整个网路加参数,另一种是只保存参数

#1.网络+参数
torch.save(model,'net.pth')#保存  也可以是.pkl
model=torch.load('net.pth') #读取   直接赋值给网络就行了

#2.只保存参数
torch.save(model.state_dict(),"net.pth")
model.load_state_dict(torch.load("net.pth"))

2.查看tensor的尺寸:

x = torch.rand(3,3)
#两个效果是一样的
print(x.shape)
print(x.size())

3.使用 FloatTensor = torch.FloatTensor 对象快速创建一个指定数据类型的tensor:如FloatTensor, LongTensor

DEVICE = torch.device("cuda:3")
x = torch.rand(2,2).to(DEVICE)
#-----------------
#创建FloatTensor数据类型,这样写是放在cpu中
#------------------
FloatTensor =  torch.FloatTensor
y1 = torch.rand(3,3).type(FloatTensor)
#---------------------------------------
#指定cuda的longtensor数据类型,注意的是,这么写会默认设置这个数据是在cuda0位置
#且修改位置时得先存入CUDA0再换到其他位置,如果CUDA0位置是满的,会导致创建失败
#----------------------------------------
LongTensor  = torch.cuda.LongTensor if x.is_cuda else torch.LongTensor
y2 = torch.rand(3,3).type(LongTensor)

#---------------
# 为了避免创建失败,我们一般先创建一个放在cpu,然后转移到GPU,如对于y1
#-------------
y1 = y1.to(DEVICE)#这样y1就被放到了CUDA3上


#---------------------------------------
#  使用FloatTensor 对象创建一个和另一个tensor尺寸一样的tensor 
#   FloatTensor (x.shape)的括号里面一定是torch.size数据类型,如果是列表的话只会将这个列表转换
#    为tensor
#-------------------------------------------
jj = FloatTensor (x.shape) #这里x.shape和x.size()是一样的作用

  1. torch中tensor的[…,]索引方式取值
    这种方式可以用于对高纬tensor的最后维度值进行快速操作。
x = torch.rand(5,3,256,25675)
first = x[..., 0]#这样得到了一个5,3,256,256大小的tensor,其每一个值都是最后一个75列中的第一个

5.torch中的linspace

x = torch.linspace(0, 25, 26) #得到的是 start-end 取n个点的一维tensor shape为:26

6.torch中的repeat()

#以5中得到的x为例
x = x.repeat(26,1)#repeat中的维度位置数量就代表了生成的tensor对应维度重复的数量,1代表不重复。得到的shape为:26,26  
x = x.repeat(13,1,1)# 得到的为13,26,26

二、np

1.np.concatenate: 作用是将()中多个np.array进行连接

#这一段代码是计算ap的
mrec = np.concatenate(([0.0], rec, [1.0]))
mpre = np.concatenate(([0.0], prec, [0.0]))
#例:
a = np.array([0.1,0.3,0.5])
x = np.concatenate(([[0],a,[0]]))
print(x)
>>>[0.  0.1 0.3 0.5 0. ]

2.np.where(condition): 作用是返回array中满足条件的下标和数据类型,也就是说返回值有两个。
例:
这个例子中np.where(mrec[1:] != mrec[:-1])可以适用于在连续变化的数组中找到开始变化的位置。

mrec = np.array([0.0666,0.0666,0.1333,0.1333,0.1333,0.1333,0.1333,0.1333,0.1333,0.2,0.2,0.2666,0.3333 ,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4666,0.4666])
k = np.where(mrec[1:] != mrec[:-1])
print(k)
print(k[0])
>>>(array([ 1,  8, 10, 11, 12, 21], dtype=int64),)
[ 1  8 10 11 12 21]

3.np中的一个重要语法
当一个np.array使用索引时:如果这个索引时一个可iterable的变量,那么会自动进行一次遍历,如这里的x. print(kk[jj])

mrec=np.array([0.0666,0.0666,0.1333,0.1333,0.1333,0.1333,0.1333,0.1333,0.1333,0.2,0.2,0.2666,0.3333 ,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4,0.4666,0.4666])
mrec = np.concatenate(([0.0], mrec, [1.0]))
k = np.array([ 0,  2  ,9 ,11 ,12, 13, 22 ,24])
x =(mrec[k + 1] - mrec[k]) *0.5
print(x)
>>>[0.0333  0.03335 0.03335 0.0333  0.03335 0.03335 0.0333  0.2667 ]
#简单的例子:
jj = np.array([0,1,2,3,4])
kk = np.array([1,2,3,4,5,6])
print(kk[jj])
>>>[1 2 3 4 5]

4.关于生成mask:
注意:操作基础是np.array()

x = np.array([[1,2,3,4,5],[5,4,6,7,9],[6,0,1,21,22]])
print(x)
mask  = x>3
print(mask)
print(x[mask])
>>>
[[ 1  2  3  4  5]
 [ 5  4  6  7  9]
 [ 6  0  1 21 22]]
[[False False False  True  True]
 [ True  True  True  True  True]
 [ True False False  True  True]]
[ 4  5  5  4  6  7  9  6 21 22]

x = torch.tensor([[1,2,3,4,5],[5,4,6,7,9],[6,0,1,21,22]])
temp = x[:,3]
print(temp)
mask1  = temp>5
print(mask1)
print(x[mask1])
>>>
>tensor([ 4,  7, 21])
tensor([0, 1, 1], dtype=torch.uint8)
tensor([[ 5,  4,  6,  7,  9],
        [ 6,  0,  1, 21, 22]])

5.关于np的排序:
np.argsort(x)默认是对x进行从小到大排序,返回的是x从小到大的下标。后面加[::-1]则是逆序。

x =np.array([2,3,6,4,1])
print(x)
arg_sort = np.argsort(x)[::-1]  
print(arg_sort)
>>>
[2 3 6 4 1]
[2 3 1 0 4]

6.发现了一个np.transpose()函数特别有意思的地方但是好像没啥用:用于对通过opencv读取的图片进行行列的索引读取。
因为cv读取的图片使用索引进行提取像素值时是按照先行后列的顺序的,[行,列]。当我们要对指定行的所有列进行操作时很简单,直接用
[start:end , :]就可以,对于对指定列的所有行时也可以使用相同的方法,但是需要先进行transpose转换

ih, iw,_ = img.shape
w, h = 412,412
back = np.ones((w,h,3)).astype(np.uint8) * 128
scale = min(w / iw, h / ih)
nw = int(iw * scale)
nh = int(ih * scale)
image = cv.resize(img, (nw, nh))
print(image.shape)

if nw != w:    #这里是对列进行修改,一个多此一举的变化,但是很有意思
    start =  int((w - nw)/2)
    back = np.transpose(back,(1,0,2))
    image = np.transpose(image,(1,0,2))
    back[start:start+nw,:] = image
    back = np.transpose(back,(1,0,2))
else:
    start = int((h - nh) / 2)
    back[start:start+nh,:] = image

7.reshape:

x = [10.0, 13.0, 16.0, 30.0, 33.0, 23.0, 30.0, 61.0, 62.0, 45.0, 59.0, 119.0, 116.0, 90.0, 156.0, 198.0, 373.0, 326.0]
y  = np.array(x).reshape(-1, 2) #这里reshape(dim1,dim2)就是把x重新变成指定的形状,-1表示自适应。最后一个维度就是按照存储顺序以给定的数目一组一组的取数。
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
深度学习常用的损失函数有很多种,下面是几种常见的损失函数及其实现方式: 1. 均方误差(Mean Squared Error,MSE)损失函数: MSE损失函数适用于回归问题,计算预测值与真实值之间的平均平方差。它可以用来评估模型的预测效果。 公式:MSE = 1/n * Σ(y_pred - y_true)^2 在Python,可以使用以下代码实现MSE损失函数的计算: ```python import numpy as np def mse_loss(y_pred, y_true): return np.mean(np.square(y_pred - y_true)) ``` 2. 交叉熵(Cross Entropy)损失函数: 交叉熵损失函数适用于分类问题,对于多分类问题可以使用分类交叉熵损失函数,对于二分类问题可以使用二分类交叉熵损失函数。 公式(多分类):CrossEntropy = -1/n * Σ(y_true * log(y_pred)) 公式(二分类):BinaryCrossEntropy = -1/n * (y_true * log(y_pred) + (1 - y_true) * log(1 - y_pred)) 在Python,可以使用以下代码实现交叉熵损失函数的计算: ```python import numpy as np def cross_entropy_loss(y_pred, y_true): return -np.mean(y_true * np.log(y_pred)) def binary_cross_entropy_loss(y_pred, y_true): return -np.mean(y_true * np.log(y_pred) + (1 - y_true) * np.log(1 - y_pred)) ``` 3. 对数损失(Log Loss)损失函数: 对数损失函数常用于二分类问题,特别适用于处理概率预测问题,将模型输出的概率与真实标签的对数概率之差作为损失值。 公式:LogLoss = -1/n * Σ(y_true * log(y_pred) + (1 - y_true) * log(1 - y_pred)) 在Python,可以使用以下代码实现对数损失函数的计算: ```python import numpy as np def log_loss(y_pred, y_true): return -np.mean(y_true * np.log(y_pred) + (1 - y_true) * np.log(1 - y_pred)) ``` 这些是深度学习常用的损失函数及其实现方式,根据具体的任务和需求,选择合适的损失函数能够提高模型的性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值