【深度学习】动手学深度学习 pytorch版

  • Post author:
  • Post category:其他




线性回归

我们构造⼀个简单的⼈⼯训练数据集,它可以使我们能够直观⽐较学到的参数和真实的模型参数的区别。设训练数据集样本数为1000,输⼊个数(特征数)为2。我们使用随机生成的样本数据X、线性回归模型的真实权重



w

=

[

2

,

3.4

]

T

w={[2,-3.4]}^T






w




=










[


2


,







3


.


4


]











T












,偏执项



b

=

4.2

b=4.2






b




=








4


.


2





,随机噪声



σ

\sigma






σ





来生成标签。具体公式:



y

=

X

w

+

b

+

σ

y=Xw+b+\sigma






y




=








X


w




+








b




+








σ





。其中随机噪声



σ

\sigma






σ





服从0,0.001的正态分布,代表没有意义的干扰。

接着用它来训练一个线性回归模型逼近真实参数。

import torch
import torch.utils.data as Data
import torch.nn as nn
import torch.optim as optim
from IPython import display
from matplotlib import pyplot as plt
import numpy as np
import random
from collections import OrderedDict

# 生成数据集
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)

# 数据读取器
batch_size=10
dataset=Data.TensorDataset(features,labels)
data_iter=Data.DataLoader(dataset,batch_size,shuffle=True)

# 定义网络 方法1
# class LinearNet(nn.Module):
#     def __init__(self,feature_nums):
#         super(LinearNet, self).__init__()
#         self.linear=nn.Linear(feature_nums,1)
#     def foaward(self,x):
#         return self.linear(x)
#
# net=LinearNet(num_inputs)

# 定义网络 方法2
# net=nn.Sequential(
#     nn.Linear(num_inputs, 1)
# )
# 定义网络 方法3
net=nn.Sequential(OrderedDict([
    ('linear',nn.Linear(num_inputs, 1))
]))
# 初始化参数
# 权重采样于标准正态分布 偏置项为0
nn.init.normal_(net[0].weight,mean=0,std=0.01)
nn.init.constant_(net[0].bias,val=0)

# for param in net.parameters():
#     print(param)

# 定义损失 均方差损失函数
loss_fun=nn.MSELoss()
# 定义优化器 随机梯度下降
optimizer = optim.SGD(net.parameters(), lr=0.03)

num_epoch=3
for epoch in range(1,num_epoch+1):
    for x,y in data_iter:
        output=net(x)
        loss=loss_fun(output,y.view(-1,1))
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
    print('epoch %d, loss: %f' % (epoch, loss.item()))

# 比较真实参数和我们训练得到的参数
dense = net[0]
print(true_w, dense.weight)
print(true_b, dense.bias)

在这里插入图片描述



softmax回归


MNIST数据集探索

import torch
import torchvision
import torchvision.transforms as transforms
from utils.util import *

# transforms.ToTensor()将尺寸为 (H x W x C) 且数据位于[0, 255]的PIL 图⽚
# 或者数据类型为 np.uint8 的 NumPy 数组
# 转换为尺⼨为 (C x H x W) 且数据类型为 torch.float32 且位于[0.0, 1.0]的 Tensor 。
mnist_train =torchvision.datasets.FashionMNIST(root='./Datasets/FashionMNIST',train=True, download=True, transform=transforms.ToTensor())
mnist_test =torchvision.datasets.FashionMNIST(root='./Datasets/FashionMNIST',train=False, download=True, transform=transforms.ToTensor())

feature, label = mnist_train[0]
# print(feature.shape, label) # torch.Size([1, 28, 28]) 9 尺寸是c*h*w

# 观察
X, y = [], []
for i in range(10):
    X.append(mnist_train[i][0]) # feature
    y.append(mnist_train[i][1]) # label
show_fashion_mnist(X, get_fashion_mnist_labels(y))

在这里插入图片描述



版权声明:本文为qq_44173974原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。