【python】小型神经网络的搭建
- import numpy as np
- def sigmoid(x):
- # Sigmoid activation function: f(x) = 1 / (1 + e^(-x))
- return 1 / (1 + np.exp(-x))
- def deriv_sigmoid(x):
- # Derivative of sigmoid: f'(x) = f(x) * (1 - f(x))
- fx = sigmoid(x)
- return fx * (1 - fx)
- def mse_loss(y_true, y_pred):
- # y_true and y_pred are numpy arrays of the same length.
- return ((y_true - y_pred) ** 2).mean()
- class OurNeuralNetwork:
- '''
- A neural network with:
- - 2 inputs
- - a hidden layer with 2 neurons (h1, h2)
- - an output layer with 1 neuron (o1)
- *** DISCLAIMER ***:
- The code below is intended to be simple and educational, NOT optimal.
- Real neural net code looks nothing like this. DO NOT use this code.
- Instead, read/run it to understand how this specific network works.
- '''
- def __init__(self):
- # Weights
- self.w1 = np.random.normal()
- self.w2 = np.random.normal()
- self.w3 = np.random.normal()
- self.w4 = np.random.normal()
- self.w5 = np.random.normal()
- self.w6 = np.random.normal()
- # Biases
- self.b1 = np.random.normal()
- self.b2 = np.random.normal()
- self.b3 = np.random.normal()
- def feedforward(self, x):
- # x is a numpy array with 2 elements.
- h1 = sigmoid(self.w1 * x[0] + self.w2 * x[1] + self.b1)
- h2 = sigmoid(self.w3 * x[0] + self.w4 * x[1] + self.b2)
- o1 = sigmoid(self.w5 * h1 + self.w6 * h2 + self.b3)
- return o1
- def train(self, data, all_y_trues):
- '''
- - data is a (n x 2) numpy array, n = # of samples in the dataset.
- - all_y_trues is a numpy array with n elements.
- Elements in all_y_trues correspond to those in data.
- '''
- learn_rate = 0.1
- epochs = 1000 # number of times to loop through the entire dataset
- for epoch in range(epochs):
- for x, y_true in zip(data, all_y_trues):
- # --- Do a feedforward (we'll need these values later)
- sum_h1 = self.w1 * x[0] + self.w2 * x[1] + self.b1
- h1 = sigmoid(sum_h1)
- sum_h2 = self.w3 * x[0] + self.w4 * x[1] + self.b2
- h2 = sigmoid(sum_h2)
- sum_o1 = self.w5 * h1 + self.w6 * h2 + self.b3
- o1 = sigmoid(sum_o1)
- y_pred = o1
- # --- Calculate partial derivatives.
- # --- Naming: d_L_d_w1 represents "partial L / partial w1"
- d_L_d_ypred = -2 * (y_true - y_pred)
- # Neuron o1
- d_ypred_d_w5 = h1 * deriv_sigmoid(sum_o1)
- d_ypred_d_w6 = h2 * deriv_sigmoid(sum_o1)
- d_ypred_d_b3 = deriv_sigmoid(sum_o1)
- d_ypred_d_h1 = self.w5 * deriv_sigmoid(sum_o1)
- d_ypred_d_h2 = self.w6 * deriv_sigmoid(sum_o1)
- # Neuron h1
- d_h1_d_w1 = x[0] * deriv_sigmoid(sum_h1)
- d_h1_d_w2 = x[1] * deriv_sigmoid(sum_h1)
- d_h1_d_b1 = deriv_sigmoid(sum_h1)
- # Neuron h2
- d_h2_d_w3 = x[0] * deriv_sigmoid(sum_h2)
- d_h2_d_w4 = x[1] * deriv_sigmoid(sum_h2)
- d_h2_d_b2 = deriv_sigmoid(sum_h2)
- # --- Update weights and biases
- # Neuron h1
- self.w1 -= learn_rate * d_L_d_ypred * d_ypred_d_h1 * d_h1_d_w1
- self.w2 -= learn_rate * d_L_d_ypred * d_ypred_d_h1 * d_h1_d_w2
- self.b1 -= learn_rate * d_L_d_ypred * d_ypred_d_h1 * d_h1_d_b1
- # Neuron h2
- self.w3 -= learn_rate * d_L_d_ypred * d_ypred_d_h2 * d_h2_d_w3
- self.w4 -= learn_rate * d_L_d_ypred * d_ypred_d_h2 * d_h2_d_w4
- self.b2 -= learn_rate * d_L_d_ypred * d_ypred_d_h2 * d_h2_d_b2
- # Neuron o1
- self.w5 -= learn_rate * d_L_d_ypred * d_ypred_d_w5
- self.w6 -= learn_rate * d_L_d_ypred * d_ypred_d_w6
- self.b3 -= learn_rate * d_L_d_ypred * d_ypred_d_b3
- # --- Calculate total loss at the end of each epoch
- if epoch % 10 == 0:
- y_preds = np.apply_along_axis(self.feedforward, 1, data)
- loss = mse_loss(all_y_trues, y_preds)
- print("Epoch %d loss: %.8f" % (epoch, loss))
- # Define dataset
- data = np.array([
- [-2, -1], # Alice
- [25, 6], # Bob
- [17, 4], # Charlie
- [-15, -6], # Diana
- ])
- all_y_trues = np.array([
- 1, # Alice
- 0, # Bob
- 0, # Charlie
- 1, # Diana
- ])
- # Train our neural network!
- network = OurNeuralNetwork()
- network.train(data, all_y_trues)
tz@croplab,HZAU
2019/6/19
【python】小型神经网络的搭建的更多相关文章
- 使用python制作神经网络——搭建框架
一.神经网络的大体结构可分为三个函数,分别如下: 1.初始化函数 设定输入层节点,隐藏层节点和输出层节点的数量. 2.训练 学习给定训练集样本后,优化权重. 3.查询 给定输入,从输出节点给出答案 所 ...
- Python实现一个简单三层神经网络的搭建并测试
python实现一个简单三层神经网络的搭建(有代码) 废话不多说了,直接步入正题,一个完整的神经网络一般由三层构成:输入层,隐藏层(可以有多层)和输出层.本文所构建的神经网络隐藏层只有一层.一个神经网 ...
- python+Eclipse+pydev环境搭建
python+Eclipse+pydev环境搭建 本文重点介绍使用Eclipse+pydev插件来写Python代码, 以及在Mac上配置Eclipse+Pydev 和Windows配置Ecli ...
- 基于Ubuntu+Python+Tensorflow+Jupyter notebook搭建深度学习环境
基于Ubuntu+Python+Tensorflow+Jupyter notebook搭建深度学习环境 前言一.环境准备环境介绍软件下载VMware下安装UbuntuUbuntu下Anaconda的安 ...
- Python开发:环境搭建(python3、PyCharm)
Python开发:环境搭建(python3.PyCharm) python3版本安装 PyCharm使用(完全图解(最新经典))
- centos6.5下Python IDE开发环境搭建
自由不是想做什么就做什么,而是想不做什么就不做什么. ---摘抄于2016/11/30晚 之前学习了一段时间的Python,但所有部署都在windows上.正赶上最近在学习liux,以后 ...
- Python+Selenium+webdriver环境搭建(windows)以及相关资源下载链接
今天记录一下测试小菜鸟alter在测试入门的一点关于python+Selenium+webdriver环境搭建的经历以及资源分享.欢迎交流学习,批评指正. 一.Python的下载与安装 1.pytho ...
- Python之Django环境搭建(MAC+pycharm+Django++postgreSQL)
Python之Django环境搭建(MAC+pycharm+Django++postgreSQL) 转载请注明地址:http://www.cnblogs.com/funnyzpc/p/7828614. ...
- 深度学习与计算机视觉:基于Python的神经网络的实现
在前面两篇文章介绍了深度学习的一些基本概念,本文则使用Python实现一个简单的深度神经网络,并使用MNIST数据库进行测试. 神经网络的实现,包括以下内容: 神经网络权值的初始化 正向传播 误差评估 ...
随机推荐
- 分布式的几件小事(五)dubbo的spi思想是什么
1.什么是SPI机制 SPI 全称为 Service Provider Interface,是一种服务发现机制. SPI 的本质是将接口实现类的全限定名配置在文件中,并由服务加载器读取配置文件,加载实 ...
- Vue中全局过滤器期与局部过滤器期的使用
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Object.keys()返回对象自身可枚举属性组成的数组
Object.keys()方法是对一个对象的key遍历,会把key组成一个数组返回 示例: // 参数为数组时,返回的是数组的索引 let arr1 = [1, 2, '3'] console.log ...
- Web前端开发解耦1
在网站建设的工作中,Web前端工程师占据着非常重要的位置,好的前端工程师保证了良好的网站优化以及友好的用户体验.今天佚站互联主要分享一下对于Web前端开发规范的一些见解. 学过面向对象编程的朋友应该都 ...
- Python 实用爬虫-04-使用 BeautifulSoup 去水印下载 CSDN 博客图片
Python 实用爬虫-04-使用 BeautifulSoup 去水印下载 CSDN 博客图片 其实没太大用,就是方便一些,因为现在各个平台之间的图片都不能共享,比如说在 CSDN 不能用简书的图片, ...
- Python——枚举(enum)
- 〇——HTML的本质以及在Web程序中的作用
对于所有的Web应用,其实本质上都是一个socket服务端,用户的浏览器就是一个socket的client,我们看看下面这段代码 import socket def handle_request(cl ...
- [uboot] (第四章)uboot流程——uboot编译流程 (转)
以下例子都以project X项目tiny210(s5pv210平台,armv7架构)为例 [uboot] uboot流程系列:[project X] tiny210(s5pv210)上电启动流程(B ...
- HDU - 6583 Typewriter (后缀自动机+dp)
题目链接 题意:你要打印一段字符串,往尾部添加一个字符需要花费p元,复制一段字符到尾部需要花费q元,求打印完全部字符的最小花费. 一开始想的贪心,后来发现忘了考虑p<q的情况了,还纳闷怎么不对. ...
- Gym - 102040B Counting Inversion (数位dp)
题意:求[a,b]区间内的数字中正序对的个数. 具体思路参考: https://blog.csdn.net/weixin_43135318/article/details/88061396 https ...