utils.py 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. # -*- coding: UTF-8 -*-
  2. '''
  3. 定义多层感知器的模型组件,比如线性模型,Sigmoid函数等
  4. '''
  5. import torch
  6. import torch.nn.functional as F
  7. import numpy as np
  8. class Linear:
  9. def __init__(self, in_features, out_features, bias=True):
  10. '''
  11. 模型参数初始化
  12. 需要注意的是,此次故意没做参数初始化的优化
  13. '''
  14. self.weight = torch.randn((in_features, out_features))
  15. self.bias = torch.randn(out_features) if bias else None
  16. def __call__(self, x):
  17. self.out = x @ self.weight
  18. if self.bias is not None:
  19. self.out += self.bias
  20. return self.out
  21. def parameters(self):
  22. '''
  23. 返回线性模型的参数,主要用于参数迭代更新
  24. 由于PyTorch的计算单元就是张量,
  25. 所以此次只需将不同参数简单合并成列表即可
  26. '''
  27. if self.bias is not None:
  28. return [self.weight, self.bias]
  29. return [self.weight]
  30. class Sigmoid:
  31. def __call__(self, x):
  32. self.out = torch.sigmoid(x)
  33. return self.out
  34. def parameters(self):
  35. '''
  36. Sigmoid函数没有模型参数
  37. '''
  38. return []
  39. class Tanh:
  40. def __call__(self, x):
  41. self.out = torch.tanh(x)
  42. return self.out
  43. def parameters(self):
  44. '''
  45. Tanh函数没有模型参数
  46. '''
  47. return []
  48. class Sequential:
  49. def __init__(self, layers):
  50. self.layers = layers
  51. def __call__(self, x):
  52. for layer in self.layers:
  53. x = layer(x)
  54. self.out = x
  55. return self.out
  56. def parameters(self):
  57. '''
  58. 将各层的模型参数简单合并成列表即可
  59. '''
  60. return [p for layer in self.layers for p in layer.parameters()]
  61. def predict_proba(self, x):
  62. '''
  63. 为了数据可视化,计算模型输出的概率
  64. '''
  65. if isinstance(x, np.ndarray):
  66. x = torch.tensor(x).float()
  67. logits = self(x)
  68. self.proba = F.softmax(logits, dim=1).detach().numpy()
  69. return self.proba