一、非线性回归
import torch
import matplotlib.pyplot as plt
from torch import nn,optim
from torch.autograd import Variable
import numpy as np
x_data = np.linspace(-2,2,200)[:,np.newaxis]
noise = np.random.normal(0,0.2,x_data.shape)
y_data = np.square(x_data) + noise
plt.scatter(x_data,y_data)
plt.show()
#数据处理
x_data = x_data.reshape(-1,1)
y_data = y_data.reshape(-1,1)
#把numpy数据变成tensor
x_data = torch.FloatTensor(x_data)
y_data = torch.FloatTensor(y_data)
#数据输入
inputs = Variable(x_data)
#数据标签
target = Variable(y_data)
#构建神经网络模型
class LinearRegression(nn.Module):
#定义网络结构
def __init__(self):
super(LinearRegression,self).__init__()
self.linear = nn.Linear(1,10)
self.tanh = nn.Tanh()
self.fc2 = nn.Linear(10,1)
#定义网络计算
def forward(self,x):
x = self.linear(x)
x = self.tanh(x)
x = self.fc2(x)
return x
#定义模型
model = LinearRegression()
#定义代价函数
mse_loss = nn.MSELoss()
#定义优化器
optimizer = optim.SGD(model.parameters(),lr=0.3)
for name,parameters in model.named_parameters():
print('name:{},parameters:{}'.format(name,parameters))
for i in range(2001):
#得到模型的输出值(预测值)
out = model(inputs)
#计算损失
loss = mse_loss(out,target)
#梯度清零
optimizer.zero_grad()
#计算梯度
loss.backward()
#修改权值
optimizer.step()
if i % 200 == 0:
print(i,loss.item())
#预测
y_pred = model(inputs)
plt.scatter(x_data,y_data)
plt.plot(x_data,y_pred.data.numpy(),'r-',lw=3)
plt.show()
二、Softmax激活函数
三、交叉熵讲解
四、过拟合与抵抗过拟合的方式
回归拟合:
过拟合导致测试误差变大
防止过拟合的方法:增大数据集、 Early stopping(一种提前结束训练的策略用来防止过拟合)、Dropout (选取某几个节点不进行计算)、正则化项 、
五、Pytorch中的优化器
Adadelta、Adagrad、Adam、Adamax、AdamW、ASGD、LBFGS、RMSprop、Rprop、SGD、SparseAdam
常用优化器为SGD与Adam