pytorch 线性模型

为什么学习pytorch

现在流行一种说法,pytorch 比tensorflow更加的友好.我也不知道哪个更友好,幸好有tensorflow的基础,现在就来学习pytorch 比较一下 看看哪个更加的友好

  • 现在在Git上面最新的模型pytorch实现的更多,这算不算是大家的选择呢!

linear模型

刚接触也不写什么很复杂的,linear 虽然很简单但是该有的都有了,俗话说麻雀虽小五脏俱全,话不多说,走起

Y = WX + b 就这么简单,咱们来实现这个

下面就上代码了:

import torch
from IPython import display
import numpy as np

num_inputs = 2
num_examples = 1000
true_w = [4,-4.4] #仿真数据|
true_b = 7.4

features = torch.tensor(np.random.normal(0, 1, (num_examples,num_inputs)))# 创造特征
labels = true_w[0] * features[:,0] + true_w[1] * features[:,1] + true_b # 创建标签
labels += torch.from_numpy(np.random.normal(0,0.01,size=labels.size())) # 添加噪声

def use_svg_display():
display.set_matplotlib_formats(“svg”)

def set_figsize(figsize = (4,4)):
use_svg_display()
plt.rcParams[“figure.figsize”] = figsize

set_figsize()

plt.scatter(features[:,1].numpy(),labels.numpy(),1)
plt.show()
展示一下 模拟成果
在这里插入图片描述
def data_iter(batch_size,features,labels):
“”
数据迭代器 数据可能不会正好分成整数个需要注意epoch
“”"
num_examples = len(features)
indices = list(range(num_examples))
random.shuffle(indices)
for i in range(0,num_examples,batch_size):
j = torch.LongTensor(indices[i:min(i + batch_size,num_examples)])
yield features.index_select(0,j),labels.index_select(0,j)

W = torch.tensor(np.random.normal(0, 0.01, (num_inputs, 1)),dtype=torch.float32) # 初始化weights,这里没有全部初始化为0,是有原因的,请自行研究,或者提问解答
b = torch.zeros(1,dtype = torch.float32)
W.requires_grad_(requires_grad=True) # 必须设置
b.requires_grad_(requires_grad=True)

def linreg(X,w,b):
“”"
模型
:param X:
:param w:
:param b:
:return:
“”"
return torch.mm(X,w)+b
def squared_loss(y_hat,y):
“”"
平方损失函数
:param y_hat:
:param y:
:return:
“”"
return (y_hat - y.view(y_hat.size())) ** 2 / 2

def sgd(parameters,lr,batch_size):
“”"
优化函数
:param parameters:
:param lr:
:param batch_size:
:return:
“”"
for parameter in parameters:
parameter.data -= lr * parameter.grad / batch_size

lr=0.03
num_epochs = 3
net = linreg
loss = squared_loss

for epoch in range(num_epochs):
# 在每⼀一个迭代周期中,会使⽤用训练数据集中所有样本⼀一次(假设样本数能够被批量量⼤大 ⼩小整除)。X
# 和y分别是⼩小批量量样本的特征和标签
for X, y in data_iter(batch_size, features, labels):
print(“W”,W)
print(“b”,b)
l = loss(net(X, W, b), y).sum() # l是有关⼩小批量量X和y的损失
l.backward() # 反向传播 小批量量的损失对模型参数求梯度
sgd([W, b], lr, batch_size) # 使⽤用小批量量随机梯度下降迭代模型参数
# 注意梯度清零,否则会累加
W.grad.data.zero_()
b.grad.data.zero_()
train_l = loss(net(features, W, b), labels)
print(‘epoch %d, loss %f’ % (epoch + 1, train_l.mean().item()))

注意 这个在一些机器上有可能会报错,这和机器有关,解决方法如下
#features = torch.from_numpy(np.random.normal(0,1,(num_examples,num_inputs)))
features = torch.tensor(np.random.normal(0, 1, (num_examples,num_inputs)),dtype=torch.float32)

这一个简单的模型就这样结束了,这样写起来确实比tensorflow灵活些许.但是现在tensorflow2 也已经对于灵活性方面作出了优化.这是一个百花齐放的时代,有助于时代的发展!!!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值