python深度学习

tech2023-02-26  96

用numpy实现有关回归的一个机器学习任务 主要步骤包括: 首先,是给出一个数组x,然后基于表达式:y=3x^2+2,加上一些噪音数据到达另一组数据y。 然后,构建一个机器学习模型,学习表达式y=wx^2+b的两个参数w,b。利用数组x,y的数据为训练数据 最后,采用梯度梯度下降法,通过多次迭代,学习到w、b的值。

# #!/usr/bin/env python # # -*- coding:utf-8 -*- import torch import numpy as np import matplotlib.pyplot as plt #声称输入数据x及目标数据y np.random.seed(100) x = np.linspace(-1,1,100).reshape(100,1) y = 3*np.power(x,2)+2+0.2*np.random.rand(x.size).reshape(100,1) #画图 plt.scatter(x,y) plt.show() #随机初始化权重参数 w1 = np.random.rand(1,1) b1 = np.random.rand(1,1) #训练模型 lr = 0.001 for i in range(800): #前向传播 y_pred = np.power(x,2)*w1+b1 #定义损失函数 loss = 0.5*(y_pred-y)**2 loss = loss.sum() #计算梯度 grad_w = np.sum((y_pred-y)*np.power(x,2)) grad_b = np.sum((y_pred-y)) #使用梯度下降法,使loss最小 w1 -= lr*grad_w b1 -= lr*grad_b #可视化结果 plt.plot(x,y_pred,'r-',label = 'predict') plt.scatter(x,y,color='blue',marker='o',label='true') plt.xlim(-1,1) plt.ylim(2,6) plt.legend() plt.show() print(w1,b1)

结果显示: 使用Tensor及antograd实现机器学习

# #!/usr/bin/env python # # -*- coding:utf-8 -*- import torch as t import numpy as np import matplotlib.pyplot as plt t.manual_seed(100) dtype = t.float #生成x坐标数据,x为tensor,需要把x的形状转换为100x1 x = t.unsqueeze(t.linspace(-1,1,100),dim=1) #生成y坐标数据,y为tensor,形状为100x1,另加上一些噪声 y = 3*x.pow(2)+2+0.2*t.rand(x.size()) #画图 plt.scatter(x.numpy(),y.numpy()) plt.show() #随机初始化权重参数 w = t.randn(1,1,dtype=dtype,requires_grad=True) b = t.zeros(1,1,dtype=dtype,requires_grad=True) #训练模型 lr = 0.001 for i in range(800): #前向传播 y_pred = x.pow(2).mm(w)+b #定义损失函数 loss = 0.5*(y_pred-y)**2 loss = loss.sum() #自动计算梯度,梯度存放在grad属性中 loss.backward() #手动更新参数,需要用torch.no_grad(),使上下文环境中切断自动求导的计算 with t.no_grad(): w -=lr*w.grad b -=lr*b.grad #梯度清零 w.grad.zero_() b.grad.zero_() #可视化结果 plt.plot(x.numpy(),y_pred.detach().numpy(),'r-',label = 'predict') plt.scatter(x.numpy(),y.numpy(),color='blue',marker='o',label='true') plt.xlim(-1,1) plt.ylim(2,6) plt.legend() plt.show() print(w,b)

训练模型

层、模型、损失函数和优化器等都定义或创建好,接下来就是训练模型。训练模型时需要注意使模型处于训练模式,即调用model.train()。调用model.train()会把所有的module设置为训练模式。如果是测试或验证阶段,需要使模型处于验证阶段,即调用model.eval()。调用model.eval()会把所有的training属性设置为False。

优化器

随机梯度下降法(SGD)就是最普通的优化器,一般SGD并说没有加速效果, 3.2小节使用的SGD包含动量参数Momentum,它是SGD的改良版。导入optim模块,实例化SGD优化器,这里使用动量参数momentum(该值一般在(0,1)之间),是SGD的改进版,效果一般比不使用动量规则的要好。

动态修改学习率参数

for epoch in range(num_epoches): #动态修改参数学习率 if epoch%5==0: optimizer.param_groups[0]['lr']*=0.1 print(optimizer.param_groups[0]['lr']) for img, label in train_loader: ######

卷积核

填充

最新回复(0)