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