前言
pytorch调用GPU
一、pytorch是什么?
通俗的讲,里面包括众多深度学习模块,简单使用过后就入门了。
二、使用步骤
1.引入库
代码如下(示例):
import torch
# todo 判断GPU是否可用
use_gpu = torch.cuda.is_available()
2.构建基本数据
包括一些训练集,分别用trX和trY表示,模型用model表示
trX = torch.Tensor([binary_encode(i, NUM_DIGITS) for i in range(101, 2 ** NUM_DIGITS)])
trY = torch.LongTensor([fizz_buzz_encode(i) for i in range(101, 2 ** NUM_DIGITS)]) # 目标值
模型类似搭建方式:
NUM_HIDDEN = 100
model = torch.nn.Sequential(
torch.nn.Linear(NUM_DIGITS, NUM_HIDDEN),
torch.nn.ReLU(),
torch.nn.Linear(NUM_HIDDEN, 4)
)
损失函数和优化器定义
loss_fn = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.05)
然后使用GPU
# todo 使用GPU和CPU
if use_gpu:
model = model.cuda()
loss_fn = loss_fn.cuda()
trX = trX.cuda()
trY = trY.cuda()
接下来训练时自动使用GPU
for epoch in range(10000):
for start in range(0, len(trX), BATCH_SIZE): # BATCH_SIZE小于len(trX),start取值0, len(trX)之间的BATCH_SIZE的倍数
end = start + BATCH_SIZE
batchX = trX[start:end]
batchY = trY[start:end]
y_pred = model(batchX)
loss = loss_fn(y_pred, batchY)
optimizer.zero_grad()
# loss = loss.cpu()
loss.backward() # 利用一批样本减小损失训练
optimizer.step()
# Find loss on training data
loss = loss_fn(model(trX), trY).item() # item()的作用是取出单元素张量的元素值并返回该值,保持该元素类型不变。
# 输出全部数据的损失
print('Epoch:', epoch, 'Loss:', loss)
需要注意的是,测试集也要使用GPU,否则会报错
testX = torch.Tensor([binary_encode(i, NUM_DIGITS) for i in range(1, 101)]) # 转化为tensor
if use_gpu:
testX = testX.cuda()
当然,之后的测试集目标值已经自动使用gpu中的model进行预测,不需要进行处理
with torch.no_grad():
# model = model.cuda()
testY = model(testX)
最后,别忘了将tensor从GPU中搬到CPU中,以便处理成numpy(假如需要的话)
testY = testY.cpu()
print(testY)
print(np.sum(testY.numpy().max(1)[1])
总结
对pytorch或GPU不熟悉的同学,不必把他们当作太难的东西,试着跟不同的教程做一遍就熟悉了,不懂得地方跳过也没关系,直接使用就行了