Pytorch常用api详解

torch.cat()

对象:给定的序列化张量,即Tensor型。
功能:实现两个张量在指定维度上的拼接。
输出:拼接后的张量。
函数以及参数torch.cat(tensor, dim),官方给出的有四个参数,但是我们平时只会用到前两个参数即可。
tensor:有相同形状的张量序列,所有的张量需要有相同的形状才能够拼接,除非是在拼接维度上两个张量可以有不同的尺寸,或者两个张量都是空的。
dim:两个张量或者多个张量拼接的维度。

应用实例1:两个张量形状相同

代码

import torch

x = torch.randn(2,4)
y = torch.randn(2,4)

print(f'x={x}','\n',f'y={y}')
print(f'z={torch.cat((x,y), 0)}')

输出:

x=tensor([[-1.2870, -0.7040,  0.3016, -0.2970],
        [-0.8151, -0.5236, -1.7680,  0.7675]]) 
 y=tensor([[-1.4207, -0.2694,  0.2521, -0.7187],
        [ 0.8776, -0.0352, -0.5094,  0.0602]])
z=tensor([[-1.2870, -0.7040,  0.3016, -0.2970],
        [-0.8151, -0.5236, -1.7680,  0.7675],
        [-1.4207, -0.2694,  0.2521, -0.7187],
        [ 0.8776, -0.0352, -0.5094,  0.0602]])

应用实例2:多个张量形状相同

代码

import torch

x = torch.randn(2,4)
y = torch.randn(2,4)

print(f'x={x}','\n',f'y={y}')
print(f'z={torch.cat((x,y,x,y), 0)}')

输出

x=tensor([[ 0.4697, -0.4881, -2.0199, -0.8661],
        [ 0.4911, -0.1259,  1.1939,  0.7730]]) 
 y=tensor([[ 0.8633,  0.4438, -0.6975,  0.5440],
        [ 0.1554, -1.6358, -1.2234, -0.6597]])
z=tensor([[ 0.4697, -0.4881, -2.0199, -0.8661],
        [ 0.4911, -0.1259,  1.1939,  0.7730],
        [ 0.8633,  0.4438, -0.6975,  0.5440],
        [ 0.1554, -1.6358, -1.2234, -0.6597],
        [ 0.4697, -0.4881, -2.0199, -0.8661],
        [ 0.4911, -0.1259,  1.1939,  0.7730],
        [ 0.8633,  0.4438, -0.6975,  0.5440],
        [ 0.1554, -1.6358, -1.2234, -0.6597]])

应用实例3:两个张量形状不同,但只在拼接维度上

代码

import torch

x = torch.randn(3,4)
y = torch.randn(2,4)

print(f'x={x}','\n',f'y={y}')
print(f'z={torch.cat((x,y), 0)}')


x_1 = torch.randn(2,3)
y_1 = torch.randn(2,4)

print(f'x_1=\n{x_1}','\n',f'y_1=\n{y_1}')
print(f'z_1=\n{torch.cat((x_1,y_1), 1)}')

输出

x=tensor([[-0.1966, -0.9648,  1.2787, -1.4578],
        [-1.2216,  0.1663,  0.5380, -0.0376],
        [-1.7365, -0.4151, -1.0336, -0.6732]]) 
 y=tensor([[ 1.4477,  0.3616, -0.1504,  0.4662],
        [-1.1334,  1.3100,  0.1624,  0.8206]])
z=tensor([[-0.1966, -0.9648,  1.2787, -1.4578],
        [-1.2216,  0.1663,  0.5380, -0.0376],
        [-1.7365, -0.4151, -1.0336, -0.6732],
        [ 1.4477,  0.3616, -0.1504,  0.4662],
        [-1.1334,  1.3100,  0.1624,  0.8206]])
x_1=
tensor([[ 1.1418,  0.0774,  0.2047],
        [-0.0673, -1.5794,  0.0131]]) 
 y_1=
tensor([[ 1.4149, -1.9538,  0.1660,  1.1142],
        [-1.6455,  0.5595, -0.1162,  0.8628]])
z_1=
tensor([[ 1.1418,  0.0774,  0.2047,  1.4149, -1.9538,  0.1660,  1.1142],
        [-0.0673, -1.5794,  0.0131, -1.6455,  0.5595, -0.1162,  0.8628]])

Process finished with exit code 0


torch.Tensor.repeat():

对象:给定的张量,即Tensor型。
功能:在指定的维度上对张量进行重复扩充,也可以用来增加维度。
输出:升维或扩充后的张量。
函数以及参数torch.tensor.repeat(size),size所在的索引表示扩充的维度的索引。
size:表示张量在这个索引维度下的扩充倍数。
注意事项:函数的参数量必须大于等于tensor的维度,如a.shape=(2,3),那么如果我们想扩充2倍a的第0个维度时,应该这么写a.repeat(2,1),对于不扩充的维度则写1。

应用实例1:一维张量扩充

代码

import torch

x = torch.randn(3)

print(f'x={x}')

print(f'x_1={x.repeat(2)}')

输出

x=tensor([-0.1485,  1.8445,  1.4257])
x_1=tensor([-0.1485,  1.8445,  1.4257, -0.1485,  1.8445,  1.4257])

应用实例2:多维张量扩充

代码

import torch

x = torch.randn(3, 4, 3)

print(f'x={x}')
#在第2个维度上扩充两倍,其他维度保持不变
print(f'x_1={x.repeat(1,1,2)}')

输出

x=tensor([[[-0.0294,  1.2902,  0.9825],
         [-0.3032,  1.6733,  0.9163],
         [ 0.3079, -0.0159,  0.2626],
         [-0.2934, -0.6076,  0.1593]],

        [[ 1.7661, -1.0698,  0.4074],
         [-0.3660, -0.3219,  0.3732],
         [-1.3314, -0.8263, -1.0793],
         [ 1.2589,  0.1886,  0.5453]],

        [[ 0.2520, -0.5695, -0.6685],
         [ 0.5554,  0.0119, -0.5650],
         [ 0.9733, -0.3812,  0.1963],
         [-1.1284,  0.2561,  0.4507]]])
x_1=tensor([[[-0.0294,  1.2902,  0.9825, -0.0294,  1.2902,  0.9825],
         [-0.3032,  1.6733,  0.9163, -0.3032,  1.6733,  0.9163],
         [ 0.3079, -0.0159,  0.2626,  0.3079, -0.0159,  0.2626],
         [-0.2934, -0.6076,  0.1593, -0.2934, -0.6076,  0.1593]],

        [[ 1.7661, -1.0698,  0.4074,  1.7661, -1.0698,  0.4074],
         [-0.3660, -0.3219,  0.3732, -0.3660, -0.3219,  0.3732],
         [-1.3314, -0.8263, -1.0793, -1.3314, -0.8263, -1.0793],
         [ 1.2589,  0.1886,  0.5453,  1.2589,  0.1886,  0.5453]],

        [[ 0.2520, -0.5695, -0.6685,  0.2520, -0.5695, -0.6685],
         [ 0.5554,  0.0119, -0.5650,  0.5554,  0.0119, -0.5650],
         [ 0.9733, -0.3812,  0.1963,  0.9733, -0.3812,  0.1963],
         [-1.1284,  0.2561,  0.4507, -1.1284,  0.2561,  0.4507]]])

应用实例3:张量维度扩充

代码

import torch

x = torch.randn(1,2)

print(f'x={x}')
#将a多扩充一个维度,这个维度扩充的倍数需要写在最前面,如此案例的3
print(f'x_1={x.repeat(3,1,1)}')

输出

x=tensor([[-0.2581, -0.8387]])
x_1=tensor([[[-0.2581, -0.8387]],

        [[-0.2581, -0.8387]],

        [[-0.2581, -0.8387]]])

torch.ones_like()

对象:张量Tensor
功能:根据输入张量的形状,生成同样形状的元素为单位1的新张量。
输出:shape与输入张量相同的,元素全为1的张量。
函数以及参数torch.ones_like(tensor)
tensor:输入张量。

应用实例1:

代码

import torch

x = torch.randn(1,2)
y = torch.ones_like(x)

print(f'x={x}')

print(f'y={y}')

输出:

x=tensor([[-0.8550, -1.1273]])
y=tensor([[1., 1.]])

torch.zeros_like()

对象:张量Tensor
功能:根据输入张量的形状,生成同样形状的元素全为0的新张量。
输出:shape与输入张量相同的,元素全为0的张量。
函数以及参数torch.ones_like(tensor)
tensor:输入张量。

应用实例1:

代码

import torch

x = torch.randn(1,2)
y = torch.zeros_like(x)

print(f'x={x}')

print(f'y={y}')

输出:

x=tensor([[ 0.3998, -0.4588]])
y=tensor([[0., 0.]])

torch.max()

对象:一个张量或两个Tensor
功能:通过对张量遍历(或对张量的某一个维度遍历)输出张量的最大值,也可以输入两个张量,通过比较两个张量间对应位置的元素,取最大值,最终输出所有位置上最大值构成的张量。
输出:某个最大值,或者张量,以及最大值的索引。
函数以及参数torch.max(input_tensor,dim)
input_tensor:输入张量。
dim:指定维度。

应用实例1:单维度

代码

import torch

x = torch.randn(1,4)
x_max = torch.max(x)
#dim=0是每列的最大值,dim=1是每行的最大值,返回最大值以及最大值索引
x_row,pos = torch.max(x, dim=1)

print(f'x={x}')
print(f'x_max={x_max}')
print(f'x_ans={x_row}')
print(f'max_pos={pos}')

输出:

x=tensor([[ 1.7854, -0.5585, -0.5001,  0.4208]])
x_max=1.785356879234314
x_ans=tensor([1.7854])
max_pos=tensor([0])

应用实例2:多维度

代码

import torch

x = torch.randn(3,4)
x_max = torch.max(x)
#返回每行的最大值,以及最大值在对应行的索引
x_row,pos = torch.max(x, dim=1)

print(f'x={x}')
print(f'x_max={x_max}')
print(f'x_ans={x_row}')
print(f'max_pos={pos}')

输出:

x=tensor([[-0.2816, -0.4243,  0.9465,  0.1041],
        [ 0.5618, -1.4577, -0.2811,  1.6255],
        [-0.9093, -1.6243, -0.5805, -0.3621]])
x_max=1.6254589557647705
x_ans=tensor([ 0.9465,  1.6255, -0.3621])
max_pos=tensor([2, 3, 3])

应用实例3:输入两个张量

代码

import torch

x = torch.randn(3,4)
y = torch.randn(3,4)
x_y = torch.max(x, y)

print(f'x={x}')
print(f'y={y}')
print(f'x_y={x_y}')

输出:

x=tensor([[-0.0504,  1.5075,  0.7595, -0.1954],
        [ 0.1285, -1.3820,  0.8436,  0.2701],
        [ 0.2804,  0.9583, -0.1772,  1.0917]])
y=tensor([[-1.1441,  1.7095,  0.2986, -1.3146],
        [ 0.8251, -0.4364,  1.0754,  0.2895],
        [ 0.3503, -0.7810, -1.4669,  0.9201]])
x_y=tensor([[-0.0504,  1.7095,  0.7595, -0.1954],
        [ 0.8251, -0.4364,  1.0754,  0.2895],
        [ 0.3503,  0.9583, -0.1772,  1.0917]])

应用实例4:实例3基础上,选择输出的某个维度进行max,该场景常用于深度学习的正负样本匹配中

代码

import torch

x = torch.randn(2,3,2)
y = torch.randn(2,3,2)
x_y = torch.max(x, y)
#[0]表示输出的是元素的张量,[1]表示输出的元素的索引,该场景常用于深度学习的正负样本匹配中
x_y_ans = x_y.max(2)[0]

print(f'x={x}')
print(f'y={y}')
print(f'x_y={x_y}')
print(f'x_y_ans={x_y_ans}')

输出:

x=tensor([[[ 0.2531,  0.1651],
         [-0.4608, -1.2071],
         [ 0.9032, -0.8951]],

        [[ 0.2045,  0.5828],
         [ 0.6315,  1.5716],
         [-0.5640, -1.8911]]])
y=tensor([[[-0.1512,  1.3686],
         [ 0.4760, -1.3106],
         [ 0.2326,  0.4541]],

        [[ 0.3184, -0.6637],
         [-1.3316, -1.0620],
         [-0.2468, -0.2879]]])
x_y=tensor([[[ 0.2531,  1.3686],
         [ 0.4760, -1.2071],
         [ 0.9032,  0.4541]],

        [[ 0.3184,  0.5828],
         [ 0.6315,  1.5716],
         [-0.2468, -0.2879]]])
x_y_ans=tensor([[ 1.3686,  0.4760,  0.9032],
        [ 0.5828,  1.5716, -0.2468]])

torch.chunk()

对象:一个张量Tensor
功能:将张量按照我们想要切分的个数,以及切分的维度,将张量在指定维度上平均切分成n个张量。
输出:切分后的n个张量。
函数以及参数torch.chunk(input_tensor,chunks,dims)
input_tensor:输入张量。
chunks:切分出chunks个张量。
dim:指定维度。

应用实例1:

代码

import torch

x = torch.randn(5,3)
#指定索引为1的维度,即3这个维度,分成2个tensor,因此一个tensor的维度为(5,2)
#另外一个tensor的维度为(5,1)
x_1,x_2 = x.chunk(2,1)

print(f'x={x}')
print(f'x_1={x_1}')
print(f'x_2={x_2}')

输出:

x=tensor([[-1.4278, -0.3466,  1.1817],
        [ 0.7366,  1.3741,  1.4865],
        [-0.3405, -0.6658,  1.0279],
        [-0.7094, -0.1081,  1.9509],
        [-0.4722, -0.6317, -1.4544]])
x_1=tensor([[-1.4278, -0.3466],
        [ 0.7366,  1.3741],
        [-0.3405, -0.6658],
        [-0.7094, -0.1081],
        [-0.4722, -0.6317]])
x_2=tensor([[ 1.1817],
        [ 1.4865],
        [ 1.0279],
        [ 1.9509],
        [-1.4544]])

torch.cuda.amp.autocast() 和torch.cuda.amp.GradScaler

amp功能:amp即使用混合精度学习的方式来训练网络,用于前向传播部分(包括loss的计算),不能用于反向传播的过程。
注意:Pytorch1.5版本之前可以通过pip install apex,然后from apex import amp来调用amp.scale_loss,但是从Pytorch1.6开始之后的版本,调用时会导致报错。可以通过使用Pytorch自带的torch.cuda.amp来代替。
autocast功能:在进入autocast上下文之后,cuda ops会自动把tensor的数据类型转换为半精度浮点型,从而在不损失训练精度的情况下加快运算。
GradScaler功能:可以通过放大loss的值来防止梯度消失underflow

使用方法1:

from torch.cuda.amp import autocast
from torch.optim import SGD

model = Net().cuda()
optimizer = SGD(...)
model.train()

for epoch in epochs:
	for step, data in enumerate(train_loader):
		optimizer.zero_grad()
		
		with amp.autocast():
			output = model(data)
			total_loss = compute_loss(output, GT)
		
		total_loss.backward()
		optimizer.step()

使用方法2:加入GradScaler

from torch.cuda.amp import autocast
from torch.optim import SGD

model = Net().cuda()
optimizer = SGD(...)
model.train()

#在训练最开始之前实例化一个GradScaler对象
scaler = amp.GradScaler()

for epoch in epochs:
	for step, data in enumerate(train_loader):
		optimizer.zero_grad()
		
		with amp.autocast():
			output = model(data)
			total_loss = compute_loss(output, GT)
		
		scaler.scale(total_loss).backward()
		scaler.step(optimizer)
		scaler.update()

该部分参考此篇博客


torch.detach()

对象:给定的张量,即Tensor型。
功能:返回一个新的张量,这个张量从当前的计算图中分离出来,但仍指向原变量的存储位置,但是这个张量在计算图中不再计算梯度与更新梯度。
注意:修改分离出来的tensor时,同样会改变原来的tensor,因为他们都指向同一个地址。

应用实例1:当使用detach()分离tensor

代码

import torch

a = torch.tensor([1., 2., 3.], requires_grad=True)
print(a.grad)

out = a.sigmoid()
print(out)

# 添加detach(),c的requires_grad为False
c = out.detach()
print(c)

输出:

None
tensor([0.7311, 0.8808, 0.9526], grad_fn=<SigmoidBackward0>)
tensor([0.7311, 0.8808, 0.9526])

应用实例2:当使用detach()分离tensor但并没有改变tensor的值时,对其进行backward()不会有问题

代码

import torch

a = torch.tensor([1., 2., 3.], requires_grad=True)
print(a.grad)

out = a.sigmoid()
print(out)

# 添加detach(),c的requires_grad为False
c = out
print(c)

# 使用新生成的Variable进行反向传播
c.sum().backward()
print(a.grad)

输出

None
tensor([0.7311, 0.8808, 0.9526], grad_fn=<SigmoidBackward0>)
tensor([0.7311, 0.8808, 0.9526], grad_fn=<SigmoidBackward0>)
tensor([0.1966, 0.1050, 0.0452])

应用实例3:当使用detach()分离tensor,但对分离出来的tensor进行求梯度时,会有问题。

代码

import torch

a = torch.tensor([1., 2., 3.], requires_grad=True)
print(a.grad)

out = a.sigmoid()
print(out)

# 添加detach(),c的requires_grad为False
c = out.detach()
print(c)

# 使用新生成的Variable进行反向传播
c.sum().backward()
print(a.grad)

输出

None
tensor([0.7311, 0.8808, 0.9526], grad_fn=<SigmoidBackward0>)
tensor([0.7311, 0.8808, 0.9526])
RuntimeError: element 0 of tensors does not require grad and does not have a grad_fn

应用实例4:当使用detach()分离tensor并更改时,即使对原张量进行求梯度,也会有问题。

代码

import torch

a = torch.tensor([1., 2., 3.], requires_grad=True)
print(a.grad)

out = a.sigmoid()
print(out)

# 添加detach(),c的requires_grad为False
c = out.detach()
print(c)

# 使用新生成的Variable进行反向传播
c.sum().backward()
print(a.grad)

输出

None
tensor([0.7311, 0.8808, 0.9526], grad_fn=<SigmoidBackward0>)
tensor([0.7311, 0.8808, 0.9526])
tensor([0., 0., 0.])
tensor([0., 0., 0.], grad_fn=<SigmoidBackward0>)
RuntimeError: one of the variables needed for gradient computation has been modified by an inplace operation: [torch.FloatTensor [3]], which is output 0 of SigmoidBackward0, is at version 1; expected version 0 instead. Hint: enable anomaly detection to find the operation that failed to compute its gradient, with torch.autograd.set_detect_anomaly(True).

引用自:pytorch:.detach()、.detach_()的作用和区别


torch.no_grad()

对象:所有计算得到的张量结果
功能:在该模块下,所有计算得到的张量的requires_grad都会被设置成false,即不再进行反向传播,也不求导。
注意:通常伴随with使用,即with torch.no_grad():

应用实例1:

代码

x = torch.randn(10, 5, requires_grad = True)
y = torch.randn(10, 5, requires_grad = True)
z = torch.randn(10, 5, requires_grad = True)
with torch.no_grad():
    w = x + y + z
    print(w.requires_grad)
    print(w.grad_fn)
print(w.requires_grad)

输出:

False
None
False

torch.backward()

对象:张量运算后的结果。
功能:根据张量的运算方式,来求输入的梯度变化,即求导或者求偏导。

应用实例1:

代码

x = torch.tensor([1,2], dtype=torch.float32, requires_grad=True)
y = x + 1
print(y)
z = torch.mean(y**2)
print(z)
z.backward()
print(x.grad)

输出:

tensor([2., 3.], grad_fn=<AddBackward0>)
tensor(6.5000, grad_fn=<MeanBackward0>)
tensor([2., 3.])

应用实例2:

代码

x = torch.tensor([1,2], dtype=torch.float32, requires_grad=True)
y = x.sigmoid()
print(y)
y.sum().backward()
print(x.grad)

输出:

tensor([0.7311, 0.8808], grad_fn=<SigmoidBackward0>)
tensor([0.1966, 0.1050])

应用实例3:

代码

x = torch.tensor([1,2,3], dtype=torch.float32, requires_grad=True)
y = x.sigmoid()
print(y)
y.backward(torch.ones_like(x))
print(x.grad)

输出:

tensor([0.7311, 0.8808, 0.9526], grad_fn=<SigmoidBackward0>)
tensor([0.1966, 0.1050, 0.0452])

细品这三个案例之间的区别~


✨✨持续更新中…

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: PyTorch 是一个基于 Python 的科学计算库,它是 Torch 在 Python 语言上的衍生版本。它主要提供了以下 API: 1. torch.Tensor: PyTorch 中最核心的数据结构,即张量(Tensor)。它是一个具有动态图计算功能的多维数组,支持 GPU 计算、自动求导等功能。 2. torch.nn: PyTorch 中的神经网络模块,提供了丰富的网络层和损失函数等组件,方便用户搭建自己的神经网络模型。 3. torch.optim: PyTorch 中的优化器模块,提供了常见的优化算法,如 SGD、Adam 等,方便用户训练神经网络模型。 4. torch.utils.data: PyTorch 中的数据处理模块,提供了常用的数据处理工具,如 DataLoader、Dataset 等,可以方便地对数据进行处理和加载。 5. torch.autograd: PyTorch 中的自动求导模块,能够自动计算张量的梯度,方便用户进行反向传播计算。 6. torch.cuda: PyTorch 中的 GPU 加速模块,支持在 GPU 上进行张量计算,提高计算效率。 7. torch.onnx: PyTorch 中的模型导出模块,可以将 PyTorch 模型导出为 ONNX 格式,方便用户在其他框架中使用。 8. torchvision: PyTorch 中的图像处理模块,提供了常用的图像处理工具,如数据加载、预处理、可视化等。 ### 回答2: PyTorch是一个非常流行的深度学习框架,具有丰富的API,使得开发和训练神经网络变得更加简单和高效。下面是一些PyTorchAPI的简要介绍: 1. Tensor操作:PyTorch的核心是Tensor数据结构。它提供了各种用于创建、操作和变换Tensor的API函数。例如,torch.tensor函数可以从Python中的列表或数组创建Tensor对象,torch.zeros和torch.ones函数可以创建全零或全一的Tensor,torch.arange函数可以创建一个从给定范围开始到结束的Tensor。 2. 自动求导:PyTorch的autograd模块提供了自动求导的支持。它允许开发者定义和执行任意计算图,并自动计算任意张量相对于其他张量的梯度。只需要将需要计算梯度的张量设置为可追踪状态,PyTorch将会自动构建计算图并记录梯度信息。这可以用来方便地进行反向传播和参数更新。 3. 神经网络层:PyTorch提供了丰富的神经网络层API,包括线性层、卷积层、循环神经网络层等。用户可以根据自己的需要选择和组合这些层来构建神经网络模型。 4. 损失函数:PyTorch提供了常见的损失函数API,例如均方误差、交叉熵等。这些函数可以用来衡量模型的输出与标签之间的差异,并作为训练过程的目标函数。 5. 优化器:PyTorch提供了各种优化器API,例如随机梯度下降、Adam等。这些优化器可以用来更新模型的参数,以使目标函数最小化。 6. 数据加载和预处理:PyTorch提供了一系列用于加载和预处理数据的API函数。例如torchvision模块可以用于加载常见的计算机视觉数据集,torch.utils.data模块可以用于数据集的处理和批量加载。 总的来说,PyTorchAPI非常丰富和灵活,可以满足各种深度学习任务的需求,使得开发者可以更加自由地设计和实现自己的深度学习模型。 ### 回答3: PyTorch是一个广泛应用于深度学习领域的开源深度学习框架,它提供了丰富的API使得开发者能够快速构建、训练和部署深度学习模型。 PyTorchAPI提供了各种不同的模块和函数,使得用户能够以简洁的方式创建神经网络模型。一些最常用API包括torch.nn模块,该模块提供了各种不同的层和损失函数,如全连接层、卷积层、循环神经网络等。此外,torch.optim模块提供了各种优化算法,如随机梯度下降、动量优化等,用于训练模型。torch.utils.data模块则提供了用于数据加载和预处理的工具,如数据集类、数据加载器等。 PyTorchAPI还支持动态图机制,这使得用户能够方便地构建计算图并进行动态计算。这种动态图机制使得PyTorch在调试和开发过程中更加灵活,并且允许用户执行复杂的控制流操作。 此外,PyTorch还提供了许多其他有用的API,如torchvision提供了一些用于计算机视觉任务的预训练模型和数据集,torchtext提供了用于自然语言处理任务的数据处理工具等。 总而言之,PyTorchAPI非常丰富和灵活,使得用户可以根据自己的需求快速构建和训练深度学习模型。它的简洁性和易用性使得PyTorch成为许多研究者和开发者的首选框架之一。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

澄鑫

谢谢,将继续努力提供技术方案

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值