10分钟快速入门PyTorch (1)

作者: SherlockLiao | 来源:发表于2017-05-14 13:58 被阅读531次

    上一篇教程我们基本的介绍了pytorch里面的操作单元,Tensor,以及计算图中的操作单位Variable,相信大家都已经熟悉了,下面这一部分我们就从两个最基本的机器学习,线性回归以及logistic回归来开始建立我们的计算图进行运算。

    由于这个系列文章主要是将pytorch教程的,所以每个算法的太多数学背景以及推导过程就不再细讲了,需要的同学可以自己找相应的教材去了解,什么统计学习方法,prml,周志华的西瓜书以及机器学习实战都可以了解到相应内容。

    线性回归

    对于线性回归,相信大家都很熟悉了,各种机器学习的书第一个要讲的内容必定有线性回归,这里简单的回顾一下什么是简单的一元线性回归。即给出一系列的点,找一条直线,使得这条直线与这些点的距离之和最小。

    1

    上面这张图就简单地描绘出了线性回归的基本原理,下面我们重点讲讲如何用pytorch写一个简单的线性回归。

    code

    data

    首先我们需要给出一系列的点作为线性回归的数据,使用numpy来存储这些点。

    x_train = np.array([[3.3], [4.4], [5.5], [6.71], [6.93], [4.168],
                        [9.779], [6.182], [7.59], [2.167], [7.042],
                        [10.791], [5.313], [7.997], [3.1]], dtype=np.float32)
    
    y_train = np.array([[1.7], [2.76], [2.09], [3.19], [1.694], [1.573],
                        [3.366], [2.596], [2.53], [1.221], [2.827],
                        [3.465], [1.65], [2.904], [1.3]], dtype=np.float32)
    

    显示出来就是这个样子


    2

    还记得pytorch里面的基本处理单元吗?Tensor,我们需要将numpy转换成Tensor,如果你还记得上一节的内容,那么你就一定记得这个函数,torch.from_numpy()

    x_train = torch.from_numpy(x_train)
    
    y_train = torch.from_numpy(y_train)
    

    这样我们的数据就转换成了Tensor。

    model

    上一节讲了基本的模型框架,按照这个框架就可以写出一个线性回归模型了

    class LinearRegression(nn.Module):
        def __init__(self):
            super(LinearRegression, self).__init__()
            self.linear = nn.Linear(1, 1)  # input and output is 1 dimension
    
        def forward(self, x):
            out = self.linear(x)
            return out
    model = LinearRegression()
    

    这里的nn.Linear表示的是 y=w*x+b,里面的两个参数都是1,表示的是x是1维,y也是1维。当然这里是可以根据你想要的输入输出维度来更改的,之前使用的别的框架的同学应该很熟悉。

    然后需要定义loss和optimizer,就是误差和优化函数

    criterion = nn.MSELoss()
    optimizer = optim.SGD(model.parameters(), lr=1e-4)
    

    这里使用的是最小二乘loss,之后我们做分类问题更多的使用的是cross entropy loss,交叉熵。优化函数使用的是随机梯度下降,注意需要将model的参数model.parameters()传进去让这个函数知道他要优化的参数是那些。

    train

    接着开始训练

    num_epochs = 1000
    for epoch in range(num_epochs):
        inputs = Variable(x_train)
        target = Variable(y_train)
    
        # forward
        out = model(inputs) # 前向传播
        loss = criterion(out, target) # 计算loss
        # backward
        optimizer.zero_grad() # 梯度归零
        loss.backward() # 方向传播
        optimizer.step() # 更新参数
    
        if (epoch+1) % 20 == 0:
            print('Epoch[{}/{}], loss: {:.6f}'.format(epoch+1,
                                                      num_epochs,
                                                      loss.data[0]))
    

    第一个循环表示每个epoch,接着开始前向传播,然后计算loss,然后反向传播,接着优化参数,特别注意的是在每次反向传播的时候需要将参数的梯度归零,即

    optimzier.zero_grad()
    

    validation

    训练完成之后我们就可以开始测试模型了

    model.eval()
    predict = model(Variable(x_train))
    predict = predict.data.numpy()
    

    特别注意的是需要用 model.eval(),让model变成测试模式,这主要是对dropout和batch normalization的操作在训练和测试的时候是不一样的

    最后可以得到这个结果

    Paste_Image.png

    以及loss的结果

    Paste_Image.png

    ok,在这篇文章中我们使用pytorch实现了简单的线性回归模型,掌握了pytorch的一些基本操作,下一节我们将使用logistic回归对MNIST手写字体数据集做识别。


    本文代码已经上传到了github

    欢迎查看我的知乎专栏,深度炼丹

    欢迎访问我的博客

    相关文章

      网友评论

      本文标题:10分钟快速入门PyTorch (1)

      本文链接:https://www.haomeiwen.com/subject/sqjqxxtx.html