• 人工神经网络实验:第一次上机


    pratice03:

    1.问题描述:

    就是通过设置只有一个hidden层的神经网络,对一个平面的灰面和白面进行分类

    2.完整代码:

    1. # 可提供解题和验证代码,自行产生数据
    2. import torch
    3. import torch.nn as nn
    4. import torch.nn.functional as F
    5. from torch import tensor
    6. from torch.nn import Parameter
    7. class Act_abs(nn.Module):
    8. def __init__(self):
    9. super(Act_abs, self).__init__()
    10. def forward(self, x):
    11. x[abs(x) >= 1] = 1
    12. x[abs(x) < 1] = 0
    13. return x
    14. class Act_v(nn.Module):
    15. def __init__(self):
    16. super(Act_v, self).__init__()
    17. def forward(self, x):
    18. x[x < 1] = 0
    19. x[x >= 1] = 1
    20. return x
    21. class Net(nn.Module):
    22. def __init__(self):
    23. super(Net, self).__init__()
    24. self.lin1 = nn.Linear(2,2,bias =False)
    25. self.lin2 = nn.Linear(2,1,bias =False)
    26. self.lin1.weight = Parameter(tensor([[ 1.0, 0.0], [0.0, 1.0]]))
    27. self.lin2.weight = Parameter(tensor([[ 1.0,1.0]]))
    28. self.act1 = Act_abs()
    29. self.act2 = Act_abs()
    30. def forward(self, x):
    31. y = self.lin1(x)
    32. y = self.act1(y)
    33. y = self.lin2(y)
    34. y = self.act2(y)
    35. return y
    36. if __name__ == '__main__':
    37. net = Net()
    38. # 第一类
    39. dotIn = [tensor([0.0,0.0]),tensor([0.2,0.2]),tensor([-0.2,-0.2]),tensor([0.2,-0.2]),tensor([-0.2,0.2])]
    40. # 边界点(第二类)
    41. dotEdge = [tensor([1.0,1.0]),tensor([-1.0,1.0]),tensor([1.0,-1.0]),tensor([-1.0,-1.0]),tensor([1.0, 0.2]), tensor([-1.0, 0.2]), tensor([1.0, -0.2]), tensor([-1.0, -0.2])]
    42. # 第二类
    43. dotOut = [tensor([1.5, 0.2]), tensor([-1.5, 0.2]), tensor([1.5, -0.2]), tensor([-1.5, -0.2])]
    44. print('----------内部点--------------')
    45. for x in dotIn:
    46. pre = net(x)
    47. if pre[0] == 0.0:
    48. print('第一类')
    49. else:
    50. print('第二类')
    51. print('----------边界点--------------')
    52. for x in dotEdge:
    53. pre = net(x)
    54. if pre[0] == 0.0:
    55. print('第一类')
    56. else:
    57. print('第二类')
    58. print('----------外部点--------------')
    59. for x in dotOut:
    60. pre = net(x)
    61. if pre[0] == 0.0:
    62. print('第一类')
    63. else:
    64. print('第二类')
    65. print('-----------------生成随机数据------------------')
    66. acc = 0
    67. rand_num = 10**4
    68. for i in range(rand_num):
    69. X = (torch.rand(2) - 0.5) * 4 # [-2, 2]
    70. if abs(X[0]) > 1 or abs(X[1]) > 1:
    71. y = tensor([1])
    72. else:
    73. y = tensor([0])
    74. pre = net(X)
    75. if pre == y:
    76. acc+=1
    77. print('识别准确率Acc: '+ str((acc/rand_num)*100) + '%')

    3.代码分析过程:

    (1)

    这里做的事情就是,定义了一个Act_abs类,需要的参数是nn.Module类型的变量,里面定义了一个激活函数forward,需要传递一个数值参数x,forward就是x的绝对值大于1取1,否则取0的函数

    (2)

    定义一个Act_v的类,需要的参数也是nn.Module,和上面那个类基本相同,唯一的区别就是这里是x是x的真实值大于1才取值1

    (3)

    这里面定义了一个神经网络的结构:

    所谓的Linear层,就是用来将输入向量转化为另一个输出向量,

    这里定义了2个线性层,后面设置了对应的线性系数weight1和weight2,

    其中使用了2个相同的abs的激活函数层,

    最终的神经网络结构如下:

    因为是二分类的问题,所以激活函数的选择就是 一个类似bool函数的函数,要么0要么1作为输出,而且之所以要使用abs绝对值,就是因为这个正方形处于4个象限,需要绝对值进行判断是在正方形内部还是外部

    好了。终于发现,我就是一个憨皮,

    其实,这里根本就没有什么train和test什么的,这里其实根本没有gradient descend什么的,因为根本就不会进行什么参数调整,

    仔细看这个结构,就会发现,它相当于实现了c++里面的:

    if(abs(x)>=1 && abs(y)>=1) return 1

    这个效果,所以,我感觉它在玩我,

    可能就是想模仿一下之后“真正”的深度学习模型吧,

    反正这里就很简单

  • 相关阅读:
    【选型】FPGA选型技巧
    Centos7单机部署zookeeper与kafka整体步骤,附上安装测试
    Vue之transition组件
    Apple pencil和其他电容笔区别有哪些?好用又便宜的ipad电容笔推荐
    C++ signed int 在计算机内部表示
    收下这份Mock,极速与后端联调,提升效率不止亿点点
    计算机组成原理-中央处理器详细讲解(持续更新中)
    Rust 数据类型 之 结构体(Struct)
    ansible 002 连接被控端 inventory ansible.cfg ansible-adhoc ansible原理
    Maven
  • 原文地址:https://blog.csdn.net/xiao_ZHEDA/article/details/132608890