pytorch 线性回归

shuffle(list) 方法将list的所有元素随机排序。返回值为None,直接改变list的顺序
注意:shuffle() 是不能直接访问的,需要导入 random 模块,然后通过 random 静态对象调用该方法。

yield 的作用就是把一个函数变成一个 generator,带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator,调用 fab(5) 不会执行 fab 函数,而是返回一个 iterable 对象!在 for 循环执行时,每次循环都会执行 fab 函数内部的代码,执行到 yield b 时,fab 函数就返回一个迭代值,下次迭代时,代码从 yield b 的下一条语句继续执行,而函数的本地变量看起来和上次中断执行前是完全一样的,于是函数继续执行,直到再次遇到 yield。

pytorch中index_select( )的用法

a = torch.linspace(1, 12, steps=12).view(3, 4) #返回一个一维的tensor(张量)
b = torch.index_select(a, 0, torch.tensor([0, 2]))
= a.index_select(0, torch.tensor([0, 2])) # 用法相同
第一个参数是索引的对象,第二个参数0表示按行索引,1表示按列进行索引,第三个参数是一个tensor,就是索引的序号,比如b里面tensor[0,2]表示第0行和第2行,c里面tensor[1, 3]表示第1列和第3列。

所有的tensor都有.requires_grad属性,可以设置这个属性.
x = tensor.ones(2,4,requires_grad=True)
调用tensor.requires_grad_()方法:x.requires_grad_(False) 修改该属性

torch.mul(a, b)是矩阵a和b对应位相乘,a和b的维度必须相等,比如a的维度是(1, 2),b的维度是(1, 2),返回的仍是(1, 2)的矩阵
torch.mm(a, b)是矩阵a和b矩阵相乘,比如a的维度是(1, 2),b的维度是(2, 3),返回的就是(1, 3)的矩阵

python中的reshape(shape):返回一个具有新的形状为shape的数组,并不改变原数组的数据
numpy中的resize(shape):返回值为None,对原始数据直接进行修改
pytorch中的view(shape):返回一个具有新的形状为shape的张量,不改变原数据

permute(dims) 将tensor的维度换位。dim为维度的序号

torch.manual_seed(1),使每次得到的随机数是固定的

设置默认tensor的数据类型torch.set_default_tensor_type(‘torch.FloatTensor’)

torch.utils.data.TensorDataset()包装张量的数据集,即传入张量(第一个维度相同),会通过第一个维度indexing

data_iter = Data.DataLoader(
    dataset=dataset, # 传入数据集
    batch_size=batch_size, # 批处理的数目
    shuffle=True, # 是否打乱数据
    num_workers=2, # 多线程
)

```python
import torch
from torch import nn
import numpy as np
torch.manual_seed(1)

 print(torch.__version__)
torch.set_default_tensor_type('torch.FloatTensor')

#生成数据集
num_inputs = 2
num_examples = 1000

true_w = [2, -3.4]
true_b = 4.2

features = torch.tensor(np.random.normal(0, 1, (num_examples, num_inputs)), dtype=torch.float)
labels = true_w[0] * features[:, 0] + true_w[1] * features[:, 1] + true_b
labels += torch.tensor(np.random.normal(0, 0.01, size=labels.size()), dtype=torch.float)

#读取数据集
import torch.utils.data as Data

batch_size = 10

#包装数据集的特征和标签
dataset = Data.TensorDataset(features, labels)
#将数据集放入DataLoader
data_iter = Data.DataLoader(
dataset=dataset, # torch TensorDataset format
batch_size=batch_size, # mini batch size
shuffle=True, # whether shuffle the data or not
#num_workers=2, # read data in multithreading
)

for X, y in data_iter:
    print(X, '\n', y)
    break

#定义模型
class LinearNet(nn.Module):
    def __init__(self, n_feature):
    super(LinearNet, self).__init__() # 调用父函数初始化
    self.linear = nn.Linear(n_feature,1) # function prototype:    `torch.nn.Linear(in_features, out_features, bias=True)`

def forward(self, x):
    y = self.linear(x)
    return y

net = LinearNet(num_inputs)
print(net)

#ways to init a multilayer network
#method one
net = nn.Sequential(
    nn.Linear(num_inputs, 1)
    # other layers can be added here
)

''':arg
#method two
net = nn.Sequential()
net.add_module('linear', nn.Linear(num_inputs, 1))
#net.add_module ......


#method three
from collections import OrderedDict
net = nn.Sequential(OrderedDict([
('linear', nn.Linear(num_inputs, 1))
# ......
]))

print(net)
print(net[0])
'''
#初始化模型参数
from torch.nn import init

init.normal_(net[0].weight, mean=0.0, std=0.01)
init.constant_(net[0].bias, val=0.0) # or you can use `net[0].bias.data.fill_(0)` to modify it directly
for param in net.parameters():
    print(param)

#定义损失函数
loss = nn.MSELoss() # nn built-in squared loss function
#function prototype: `torch.nn.MSELoss(size_average=None, reduce=None, reduction='mean')`
#定义优化函数
import torch.optim as optim

optimizer = optim.SGD(net.parameters(), lr=0.03) # built-in random gradient descent function
print(optimizer) # function prototype: `torch.optim.SGD(params, lr=, momentum=0, dampening=0, weight_decay=0, nesterov=False)`


#训练
num_epochs = 6
for epoch in range(1, num_epochs + 1):
    for X, y in data_iter:
        output = net(X)
        l = loss(output, y.view(-1, 1))
        optimizer.zero_grad() # reset gradient, equal to net.zero_grad()
        l.backward()
        optimizer.step()
        # 调用optimizer.step(),就是一个apply gradients的过程。将更新的值加到model的parameters上。
print('epoch %d, loss: %f' % (epoch, l.item()))
#在这里插入代码片result comparision
dense = net[0]
print(true_w, dense.weight.data)
print(true_b, dense.bias.data)
sys.setdefaultencoding('utf-8')


发布了35 篇原创文章 · 获赞 3 · 访问量 758

猜你喜欢

转载自blog.csdn.net/qq_41168327/article/details/104615322