1. import numpy as np
  2.  
  3. def sigmoid(x):
  4. # Sigmoid activation function: f(x) = 1 / (1 + e^(-x))
  5. return 1 / (1 + np.exp(-x))
  6.  
  7. def deriv_sigmoid(x):
  8. # Derivative of sigmoid: f'(x) = f(x) * (1 - f(x))
  9. fx = sigmoid(x)
  10. return fx * (1 - fx)
  11.  
  12. def mse_loss(y_true, y_pred):
  13. # y_true and y_pred are numpy arrays of the same length.
  14. return ((y_true - y_pred) ** 2).mean()
  15.  
  16. class OurNeuralNetwork:
  17. '''
  18. A neural network with:
  19. - 2 inputs
  20. - a hidden layer with 2 neurons (h1, h2)
  21. - an output layer with 1 neuron (o1)
  22.  
  23. *** DISCLAIMER ***:
  24. The code below is intended to be simple and educational, NOT optimal.
  25. Real neural net code looks nothing like this. DO NOT use this code.
  26. Instead, read/run it to understand how this specific network works.
  27. '''
  28. def __init__(self):
  29. # Weights
  30. self.w1 = np.random.normal()
  31. self.w2 = np.random.normal()
  32. self.w3 = np.random.normal()
  33. self.w4 = np.random.normal()
  34. self.w5 = np.random.normal()
  35. self.w6 = np.random.normal()
  36.  
  37. # Biases
  38. self.b1 = np.random.normal()
  39. self.b2 = np.random.normal()
  40. self.b3 = np.random.normal()
  41.  
  42. def feedforward(self, x):
  43. # x is a numpy array with 2 elements.
  44. h1 = sigmoid(self.w1 * x[0] + self.w2 * x[1] + self.b1)
  45. h2 = sigmoid(self.w3 * x[0] + self.w4 * x[1] + self.b2)
  46. o1 = sigmoid(self.w5 * h1 + self.w6 * h2 + self.b3)
  47. return o1
  48.  
  49. def train(self, data, all_y_trues):
  50. '''
  51. - data is a (n x 2) numpy array, n = # of samples in the dataset.
  52. - all_y_trues is a numpy array with n elements.
  53. Elements in all_y_trues correspond to those in data.
  54. '''
  55. learn_rate = 0.1
  56. epochs = 1000 # number of times to loop through the entire dataset
  57.  
  58. for epoch in range(epochs):
  59. for x, y_true in zip(data, all_y_trues):
  60. # --- Do a feedforward (we'll need these values later)
  61. sum_h1 = self.w1 * x[0] + self.w2 * x[1] + self.b1
  62. h1 = sigmoid(sum_h1)
  63.  
  64. sum_h2 = self.w3 * x[0] + self.w4 * x[1] + self.b2
  65. h2 = sigmoid(sum_h2)
  66.  
  67. sum_o1 = self.w5 * h1 + self.w6 * h2 + self.b3
  68. o1 = sigmoid(sum_o1)
  69. y_pred = o1
  70.  
  71. # --- Calculate partial derivatives.
  72. # --- Naming: d_L_d_w1 represents "partial L / partial w1"
  73. d_L_d_ypred = -2 * (y_true - y_pred)
  74.  
  75. # Neuron o1
  76. d_ypred_d_w5 = h1 * deriv_sigmoid(sum_o1)
  77. d_ypred_d_w6 = h2 * deriv_sigmoid(sum_o1)
  78. d_ypred_d_b3 = deriv_sigmoid(sum_o1)
  79.  
  80. d_ypred_d_h1 = self.w5 * deriv_sigmoid(sum_o1)
  81. d_ypred_d_h2 = self.w6 * deriv_sigmoid(sum_o1)
  82.  
  83. # Neuron h1
  84. d_h1_d_w1 = x[0] * deriv_sigmoid(sum_h1)
  85. d_h1_d_w2 = x[1] * deriv_sigmoid(sum_h1)
  86. d_h1_d_b1 = deriv_sigmoid(sum_h1)
  87.  
  88. # Neuron h2
  89. d_h2_d_w3 = x[0] * deriv_sigmoid(sum_h2)
  90. d_h2_d_w4 = x[1] * deriv_sigmoid(sum_h2)
  91. d_h2_d_b2 = deriv_sigmoid(sum_h2)
  92.  
  93. # --- Update weights and biases
  94. # Neuron h1
  95. self.w1 -= learn_rate * d_L_d_ypred * d_ypred_d_h1 * d_h1_d_w1
  96. self.w2 -= learn_rate * d_L_d_ypred * d_ypred_d_h1 * d_h1_d_w2
  97. self.b1 -= learn_rate * d_L_d_ypred * d_ypred_d_h1 * d_h1_d_b1
  98.  
  99. # Neuron h2
  100. self.w3 -= learn_rate * d_L_d_ypred * d_ypred_d_h2 * d_h2_d_w3
  101. self.w4 -= learn_rate * d_L_d_ypred * d_ypred_d_h2 * d_h2_d_w4
  102. self.b2 -= learn_rate * d_L_d_ypred * d_ypred_d_h2 * d_h2_d_b2
  103.  
  104. # Neuron o1
  105. self.w5 -= learn_rate * d_L_d_ypred * d_ypred_d_w5
  106. self.w6 -= learn_rate * d_L_d_ypred * d_ypred_d_w6
  107. self.b3 -= learn_rate * d_L_d_ypred * d_ypred_d_b3
  108.  
  109. # --- Calculate total loss at the end of each epoch
  110. if epoch % 10 == 0:
  111. y_preds = np.apply_along_axis(self.feedforward, 1, data)
  112. loss = mse_loss(all_y_trues, y_preds)
  113. print("Epoch %d loss: %.8f" % (epoch, loss))
  114.  
  115. # Define dataset
  116. data = np.array([
  117. [-2, -1], # Alice
  118. [25, 6], # Bob
  119. [17, 4], # Charlie
  120. [-15, -6], # Diana
  121. ])
  122. all_y_trues = np.array([
  123. 1, # Alice
  124. 0, # Bob
  125. 0, # Charlie
  126. 1, # Diana
  127. ])
  128.  
  129. # Train our neural network!
  130. network = OurNeuralNetwork()
  131. network.train(data, all_y_trues)

tz@croplab,HZAU

2019/6/19

【python】小型神经网络的搭建的更多相关文章

  1. 使用python制作神经网络——搭建框架

    一.神经网络的大体结构可分为三个函数,分别如下: 1.初始化函数 设定输入层节点,隐藏层节点和输出层节点的数量. 2.训练 学习给定训练集样本后,优化权重. 3.查询 给定输入,从输出节点给出答案 所 ...

  2. Python实现一个简单三层神经网络的搭建并测试

    python实现一个简单三层神经网络的搭建(有代码) 废话不多说了,直接步入正题,一个完整的神经网络一般由三层构成:输入层,隐藏层(可以有多层)和输出层.本文所构建的神经网络隐藏层只有一层.一个神经网 ...

  3. python+Eclipse+pydev环境搭建

    python+Eclipse+pydev环境搭建   本文重点介绍使用Eclipse+pydev插件来写Python代码,  以及在Mac上配置Eclipse+Pydev 和Windows配置Ecli ...

  4. 基于Ubuntu+Python+Tensorflow+Jupyter notebook搭建深度学习环境

    基于Ubuntu+Python+Tensorflow+Jupyter notebook搭建深度学习环境 前言一.环境准备环境介绍软件下载VMware下安装UbuntuUbuntu下Anaconda的安 ...

  5. Python开发:环境搭建(python3、PyCharm)

    Python开发:环境搭建(python3.PyCharm) python3版本安装 PyCharm使用(完全图解(最新经典))

  6. centos6.5下Python IDE开发环境搭建

    自由不是想做什么就做什么,而是想不做什么就不做什么.        ---摘抄于2016/11/30晚 之前学习了一段时间的Python,但所有部署都在windows上.正赶上最近在学习liux,以后 ...

  7. Python+Selenium+webdriver环境搭建(windows)以及相关资源下载链接

    今天记录一下测试小菜鸟alter在测试入门的一点关于python+Selenium+webdriver环境搭建的经历以及资源分享.欢迎交流学习,批评指正. 一.Python的下载与安装 1.pytho ...

  8. Python之Django环境搭建(MAC+pycharm+Django++postgreSQL)

    Python之Django环境搭建(MAC+pycharm+Django++postgreSQL) 转载请注明地址:http://www.cnblogs.com/funnyzpc/p/7828614. ...

  9. 深度学习与计算机视觉:基于Python的神经网络的实现

    在前面两篇文章介绍了深度学习的一些基本概念,本文则使用Python实现一个简单的深度神经网络,并使用MNIST数据库进行测试. 神经网络的实现,包括以下内容: 神经网络权值的初始化 正向传播 误差评估 ...

随机推荐

  1. 分布式的几件小事(五)dubbo的spi思想是什么

    1.什么是SPI机制 SPI 全称为 Service Provider Interface,是一种服务发现机制. SPI 的本质是将接口实现类的全限定名配置在文件中,并由服务加载器读取配置文件,加载实 ...

  2. Vue中全局过滤器期与局部过滤器期的使用

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. Object.keys()返回对象自身可枚举属性组成的数组

    Object.keys()方法是对一个对象的key遍历,会把key组成一个数组返回 示例: // 参数为数组时,返回的是数组的索引 let arr1 = [1, 2, '3'] console.log ...

  4. Web前端开发解耦1

    在网站建设的工作中,Web前端工程师占据着非常重要的位置,好的前端工程师保证了良好的网站优化以及友好的用户体验.今天佚站互联主要分享一下对于Web前端开发规范的一些见解. 学过面向对象编程的朋友应该都 ...

  5. Python 实用爬虫-04-使用 BeautifulSoup 去水印下载 CSDN 博客图片

    Python 实用爬虫-04-使用 BeautifulSoup 去水印下载 CSDN 博客图片 其实没太大用,就是方便一些,因为现在各个平台之间的图片都不能共享,比如说在 CSDN 不能用简书的图片, ...

  6. Python——枚举(enum)

  7. 〇——HTML的本质以及在Web程序中的作用

    对于所有的Web应用,其实本质上都是一个socket服务端,用户的浏览器就是一个socket的client,我们看看下面这段代码 import socket def handle_request(cl ...

  8. [uboot] (第四章)uboot流程——uboot编译流程 (转)

    以下例子都以project X项目tiny210(s5pv210平台,armv7架构)为例 [uboot] uboot流程系列:[project X] tiny210(s5pv210)上电启动流程(B ...

  9. HDU - 6583 Typewriter (后缀自动机+dp)

    题目链接 题意:你要打印一段字符串,往尾部添加一个字符需要花费p元,复制一段字符到尾部需要花费q元,求打印完全部字符的最小花费. 一开始想的贪心,后来发现忘了考虑p<q的情况了,还纳闷怎么不对. ...

  10. Gym - 102040B Counting Inversion (数位dp)

    题意:求[a,b]区间内的数字中正序对的个数. 具体思路参考: https://blog.csdn.net/weixin_43135318/article/details/88061396 https ...