PyTorch 深度学习实践(2)梯度下降

b站视频连接:https://www.bilibili.com/video/BV1Y7411d7Ys?p=3

上一节我们用穷举法

列举出了所有的可能的k,并且计算了损失函数,损失越小,说明我们的k就越接近,这一次我们用梯度下降,继续计算损失,而不是穷举法了。

cost(w)=1/n∑(y`-y)^2

明显cost对w是一个二次函数,我们只要找到二次函数的最低点即可
在这里插入图片描述
不论我们在那边,只要沿着梯度的方向即可找到局部最优解(非二次函数可能有多个最优解),也就是极小值。
代码:

import matplotlib.pyplot as plt

# prepare the training set
x_data = [1.0, 2.0, 3.0]
y_data = [2.0, 4.0, 6.0]

# initial guess of weight
w = 1.0


# define the model linear model y = w*x
def forward(x):
    return x * w


# define the cost function MSE
# cost(w)=1/n∑(y`-y)^2
def cost(xs, ys):
    cost = 0
    for x, y in zip(xs, ys):
        y_pred = forward(x)
        cost += (y_pred - y) ** 2
    return cost / len(xs)


# define the gradient function  gd
# cost(w)=1/n∑(y`-y)^2
# αcost/αw,也就是cost对w的导数
# 计算所有样本梯度的均值
def gradient(xs, ys):
    grad = 0
    for x, y in zip(xs, ys):
        grad += 2 * x * (x * w - y)
    return grad / len(xs)


epoch_list = []
cost_list = []
# 训练过程w=w-α*gradient
print('predict (before training)', 4, forward(4)) # 未训练前,当x=4时,y=4
for epoch in range(100):
    cost_val = cost(x_data, y_data)  # 其实不算也可以,为了画图
    grad_val = gradient(x_data, y_data)
    w -= 0.01 * grad_val  # 0.01 learning rate
    print('epoch:', epoch, 'w=', w, 'loss=', cost_val)
    epoch_list.append(epoch)
    cost_list.append(cost_val)

print('predict (after training)', 4, forward(4)) # 训练后,w=2,当x=4时,y=8
plt.plot(epoch_list, cost_list)
plt.ylabel('cost')
plt.xlabel('epoch')
plt.show()

随机梯度下降法

随机梯度下降法在神经网络中被证明是有效的。梯度下降容易进入鞍点,所以采用随机梯度,不是直接走向最低点,但总的大方向还是向最低点走。
效率较低(时间复杂度较高),学习性能较好。

随机梯度下降法和梯度下降法的主要区别在于:

1、损失函数由cost()更改为loss()。cost是计算所有训练数据的损失,loss是计算一个训练函数的损失。对应于源代码则是少了两个for循环。

2、梯度函数gradient()由计算所有训练数据的梯度更改为计算一个训练数据的梯度。

代码:

import matplotlib.pyplot as plt

x_data = [1.0, 2.0, 3.0]
y_data = [2.0, 4.0, 6.0]

# 初始猜测为1
w = 1.0


def forward(x):
    return x * w

# 随机梯度用的更多
# 与梯度下降不同的是,cost变为了loss,少了一个for循环求和
# 梯度下降是用所有样本的损失,而随机梯度是用单个样本的损失
def loss(x, y):
    y_pred = forward(x)
    return (y_pred - y) ** 2


# define the gradient function  sgd
# 注意区分普通梯度下降,少了一个for循环求和
# 因为只用了一个样本的梯度,没有用所有样本的梯度,所以没有求和
def gradient(x, y):
    return 2 * x * (x * w - y)


epoch_list = []
loss_list = []
print('predict (before training)', 4, forward(4))
for epoch in range(100):
    for x, y in zip(x_data, y_data): # 其实这里应该随机取这三个里面的某一个,而不是三个都用来更新,这才体现了随机
        grad = gradient(x, y)
        w = w - 0.01 * grad  # update weight by every grad of sample of training set
        print("\tgrad:", x, y, grad)
        l = loss(x, y)
    print("progress:", epoch, "w=", w, "loss=", l)
    epoch_list.append(epoch)
    loss_list.append(l)

# SGD不能并行,但单次运算快
# GD可以并行,但单次慢
# 所以折中用Batch GD,批量随机梯度下降Mini-Batch
print('predict (after training)', 4, forward(4))
plt.plot(epoch_list, loss_list)
plt.ylabel('loss')
plt.xlabel('epoch')
plt.show()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Pytorch中进行深度学习实践的步骤如下: 1. 准备数据集:使用Pytorch提供的工具包torchvision,可以方便地下载和加载一些常见的数据集,如MNIST和CIFAR-10。你可以使用train_set和test_set来分别加载训练集和测试集。 2. 构建模型:在Pytorch中,你可以使用类(Class)来设计和构建深度学习模型。你需要定义一个继承自nn.Module的类,并实现其中的forward方法,该方法描述了如何从输入数据中计算出模型的输出。在这个过程中,你可以根据输入数据的维度来确定权重矩阵w和偏置项b的大小。 3. 定义损失函数和优化器:在深度学习中,我们需要定义一个损失函数来衡量模型的预测结果与真实标签之间的差异。常见的损失函数有交叉熵损失函数(CrossEntropyLoss)和均方误差损失函数(MSELoss)。然后,你可以选择一个优化器来更新模型的参数,常见的优化器有随机梯度下降法(SGD)和Adam优化器。 4. 训练模型:在训练模型之前,你需要定义一些超参数,如学习率、迭代次数和批量大小。然后,你可以使用一个循环来迭代地训练模型。在每一次迭代中,你需要将输入数据传递给模型,计算模型的输出,计算损失函数并进行反向传播,最后使用优化器来更新模型的参数。重复这个过程直到达到设定的迭代次数。 5. 模型评估:在训练完成后,你可以使用测试集来评估模型的性能。通过传递测试集的输入数据给模型,计算模型的预测结果,并与真实标签进行比较,可以得到模型的准确率或其他性能指标。 综上所述,这是一个基本的Pytorch深度学习实践流程,你可以根据具体的任务和数据集进行相应的调整和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值