示例代码:
import torch
import torch.nn.functional as F
import matplotlib.pyplot as plt
# 1.准备数据 generate data
x=torch.unsqueeze(torch.linspace(-1,1,100),dim=1)
print(x.shape)
y=x*x+0.2*torch.rand(x.size())
#显示数据散点图
plt.scatter(x.data.numpy(),y.data.numpy())
# 2.定义网络结构 build net
class Net(torch.nn.Module):
#n_feature:输入特征个数 n_hidden:隐藏层个数 n_output:输出层个数
def __init__(self,n_feature,n_hidden,n_output):
# super表示继承Net的父类,并同时初始化父类的参数
super(Net,self).__init__()
# nn.Linear代表线性层 代表y=w*x+b 其中w的shape为[n_hidden,n_feature] b的shape为[n_hidden]
# y=w^T*x+b 这里w的维度是转置前的维度 所以是反的
self.hidden =torch.nn.Linear(n_feature,n_hidden)
self.predict =torch.nn.Linear(n_hidden,n_output)
print(self.hidden.weight)
print(self.predict.weight)
#定义一个前向传播过程函数
def forward(self, x):
# n_feature n_hidden n_output
#举例(2,5,1) 2 5 1
# - ** -
# ** - - - ** - -
# - ** - - - **
# ** - - - ** - -
# - ** -
# 输入层 隐藏层 输出层
x=F.relu(self.hidden(x))
x=self.predict(x)
return x
# 实例化一个网络为net
net = Net(n_feature=1,n_hidden=10,n_output=1)
print(net)
# 3.定义损失函数 这里使用均方误差(mean square error)
loss_func=torch.nn.MSELoss()
# 4.定义优化器 这里使用随机梯度下降
optimizer=torch.optim.SGD(net.parameters(),lr=0.2)
#定义300遍更新 每10遍显示一次
plt.ion()
# 5.训练
for t in range(100):
prediction = net(x) # input x and predict based on x
loss = loss_func(prediction, y) # must be (1. nn output, 2. target)
# 5.3反向传播三步不可少
optimizer.zero_grad() # clear gradients for next train
loss.backward() # backpropagation, compute gradients
optimizer.step() # apply gradients
if t % 10 == 0:
# plot and show learning process
plt.cla()
plt.scatter(x.data.numpy(), y.data.numpy())
plt.plot(x.data.numpy(), prediction.data.numpy(), 'r-', lw=5)
plt.text(0.5, 0, 'Loss=%.4f' % loss.data.numpy(), fontdict={'size': 20, 'color': 'red'})
plt.show()
plt.pause(0.1)
plt.ioff()
参考:pytorch基础-搭建网络