deep_test.py 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. import torch
  2. import torch.nn as nn
  3. '''
  4. 使用正态分布随机生成两类数据
  5. 第一类有100个点,使用均值为2,标准差为1的正态分布随机生成,标签为0。
  6. 第二类有100个点,使用均值为-2,标准差为1的正态分布随机生成,标签为1。
  7. torch.normal(tensor1,tensor2)
  8. 输入两个张量,tensor1为正态分布的均值,tensor2为正态分布的标准差。
  9. torch.normal以此抽取tensor1和tensor2中对应位置的元素值构造对应的正态分布以随机生成数据,返回数据张量。
  10. '''
  11. x1_t = torch.normal(2*torch.ones(100,2),1)
  12. y1_t = torch.zeros(100)
  13. x2_t = torch.normal(-2*torch.ones(100,2),1)
  14. y2_t = torch.ones(100)
  15. x_t = torch.cat((x1_t,x2_t),0)
  16. y_t = torch.cat((y1_t,y2_t),0)
  17. '''
  18. 搭建神经网络,
  19. 输入层包括2个节点,两个隐层均包含5个节点,输出层包括1个节点。
  20. '''
  21. net = nn.Sequential(
  22. nn.Linear(2,5), # 输入层与第一隐层结点数设置,全连接结构
  23. torch.nn.Sigmoid(), # 第一隐层激活函数采用sigmoid
  24. nn.Linear(5,5), # 第一隐层与第二隐层结点数设置,全连接结构
  25. torch.nn.Sigmoid(), # 第一隐层激活函数采用sigmoid
  26. nn.Linear(5,2), # 第二隐层与输出层层结点数设置,全连接结构
  27. nn.Softmax(dim=1) # 由于有两个概率输出,因此对其使用Softmax进行概率归一化
  28. )
  29. print(net)
  30. '''
  31. Sequential(
  32. (0): Linear(in_features=2, out_features=5, bias=True)
  33. (1): Sigmoid()
  34. (2): Linear(in_features=5, out_features=5, bias=True)
  35. (3): Sigmoid()
  36. (4): Linear(in_features=5, out_features=2, bias=True)
  37. (5): Softmax(dim=1)
  38. )'''
  39. # 配置损失函数和优化器
  40. optimizer = torch.optim.SGD(net.parameters(),lr=0.01) # 优化器使用随机梯度下降,传入网络参数和学习率
  41. loss_func = torch.nn.CrossEntropyLoss() # 损失函数使用交叉熵损失函数
  42. # 模型训练
  43. num_epoch = 10000 # 最大迭代更新次数
  44. for epoch in range(num_epoch):
  45. y_p = net(x_t) # 喂数据并前向传播
  46. loss = loss_func(y_p,y_t.long()) # 计算损失
  47. '''
  48. PyTorch默认会对梯度进行累加,因此为了不使得之前计算的梯度影响到当前计算,需要手动清除梯度。
  49. pyTorch这样子设置也有许多好处,但是由于个人能力,还没完全弄懂。
  50. '''
  51. optimizer.zero_grad() # 清除梯度
  52. loss.backward() # 计算梯度,误差回传
  53. optimizer.step() # 根据计算的梯度,更新网络中的参数
  54. if epoch % 1000 == 0:
  55. print('epoch: {}, loss: {}'.format(epoch, loss.data.item()))
  56. '''
  57. torch.max(y_p,dim = 1)[0]是每行最大的值
  58. torch.max(y_p,dim = 1)[0]是每行最大的值的下标,可认为标签
  59. '''
  60. print("所有样本的预测标签: \n",torch.max(y_p,dim = 1)[1])