初识pytorch

基本数据单元

PyTorch 的基本数据单元是张量(Tensor),它实际上是一种 N 维数组。
1 阶张量可以看做是一个向量,通过索引可以取到一个值;
2 阶张量可以看做是一个矩阵,通过索引可以取到一个向量;
3 阶张量通过索引可以取到一个矩阵;
4 阶张量通过索引可以取到一个3阶张量……

import torch
print(torch.version)

生成随机张量

a = torch.rand(5,3)
b = torch.ones(5,3)*2
print(a,b)

基本运算

c1 = a+b
c2 = a*b
c3 = a.mm(b.t())
print(c1,c2,c3)
tensor与np.array之间的转换
Tensor 和 Numpy 的最大区别在于 Tensor 可以在 GPU 上进行运算
默认情况下,Tensor在CPU上进行运算,如果需要在GPU上的实例,需要运行Tensor.cuda() 方法
import numpy as np
a1 = np.random.rand(5,3)
b1 = torch.from_numpy(a1)
b2 = torch.FloatTensor(a1)
print(b1,b2)
print(b1.numpy())

if torch.cuda.is_available():
a = a.cuda()
b = b.cuda()
c = a+b
print(c.cpu()) #打印时需把gpu转化为cpu

自动微分

动态运算图(Dynamic Computation Graph)是 PyTorch 的最主要特性
autograd机制能够记录作用于Tensor上的所有操作,生成一个动态计算图
图的叶子节点是输入的数据,根节点是输出的结果
当在根节点调用.backward()的时候就会从根到叶反向传播
默认情况下,只有.requires_grad和is_leaf两个属性都为True的节点才会被计算导数,并存储到grad中

用来构建计算图的数据叫做自动微分变量(Variable),它与Tensor不同
Variable包含三个属性,分别对应着数据(data),父节点(creator),以及梯度(grad)

from torch.autograd import Variable

x1 = Variable(torch.ones(5,3),requires_grad = True)
x2 = Variable(torch.rand(5,3),requires_grad = True)
y = x1+x2
z = torch.mean(y*y)
z.backward()
print(z,x1.grad,x2.grad)#只有叶子结点才有梯度信息

用pytorch实现线性回归

#准别待拟合数据
x = Variable(torch.linspace(0,100).type(torch.FloatTensor))
rand = Variable(torch.randn(100))*5
y = x+rand
#创建Variable
w = Variable(torch.rand(1),requires_grad=True)
b = Variable(torch.rand(1),requires_grad=True)
print(w,b)
#创建模型
learning_rate = 0.0001 #设置学习率
for i in range(100):
#当w和b的梯度都不是空,清空起数值
if (w.grad is not None) and (b.grad is not None):
w.grad.data.zero_()
b.grad.data.zero_()

predictions = w.expand_as(x) * x + b.expand_as(x)  

loss = torch.mean((predictions - y) ** 2) 
#print('loss:', loss.data.numpy())
loss.backward()

w.data.add_(- learning_rate * w.grad.data)

b.data.add_(- learning_rate * b.grad.data) 

print(w,b)
#绘制原数据点和拟合直线
import matplotlib.pyplot as plt
%matplotlib inline

x_data = x.data.numpy()
plt.figure(figsize = (10, 7)) #设定绘图窗口大小
xplot, = plt.plot(x_data, y.data.numpy(), ‘o’) # 绘制原始数据
yplot, = plt.plot(x_data, w.data.numpy() * x_data + b.data.numpy()) #绘制拟合数据
plt.xlabel(‘X’) #更改坐标轴标注
plt.ylabel(‘Y’) #更改坐标轴标注
str1 = str(a.data.numpy()[0]) + ‘x +’ + str(b.data.numpy()[0]) #图例信息
plt.legend([xplot, yplot],[‘Data’, str1]) #绘制图例
plt.show()
在这里插入图片描述
#测试数据
x_test = Variable(torch.FloatTensor([1, 2, 10, 100, 1000])) #随便选择一些点1,2,……,1000
predictions = w.expand_as(x_test) * x_test + b.expand_as(x_test) #计算模型的预测结果
predictions #输出
print(w,b)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值