为什么学习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 也已经对于灵活性方面作出了优化.这是一个百花齐放的时代,有助于时代的发展!!!