#!/usr/bin/env python
# -*- coding: utf-8 -*-
import numpy as np#矩阵运算def tanh(x):return np.tanh(x)def tanh_deriv(x):#对tanh求导return 1.0 - np.tanh(x)*np.tanh(x)def logistic(x):#s函数return 1/(1 + np.exp(-x))def logistic_derivative(x):#对s函数求导return logistic(x)*(1-logistic(x))class NeuralNetwork:#面向对象定义一个神经网络类def __init__(self, layers, activation='tanh'):#下划线构造函数self 相当于本身这个类的指针 layer就是一个list 数字代表神经元个数""":param layers: A list containing the number of units in each layer.Should be at least two values:param activation: The activation function to be used. Can be"logistic" or "tanh""""if activation == 'logistic':self.activation = logistic#之前定义的s函数self.activation_deriv = logistic_derivative#求导函数elif activation == 'tanh':self.activation = tanh#双曲线函数self.activation_deriv = tanh_deriv#求导双曲线函数self.weights = []#初始化一个list作为   权重#初始化权重两个值之间随机初始化for i in range(1, len(layers) - 1):#有几层神经网络 除去输出层#i-1层 和i层之间的权重 随机生成layers[i - 1] + 1 *  layers[i] + 1 的矩阵 -0.25-0.25self.weights.append((2*np.random.random((layers[i - 1] + 1, layers[i] + 1))-1)*0.25)#i层和i+1层之间的权重self.weights.append((2*np.random.random((layers[i] + 1, layers[i + 1]))-1)*0.25)def fit(self, X, y, learning_rate=0.2, epochs=10000):#训练神经网络#learning rateX = np.atleast_2d(X)#x至少2维temp = np.ones([X.shape[0], X.shape[1]+1])#初始化一个全为1的矩阵temp[:, 0:-1] = X  # adding the bias unit to the input layerX = tempy = np.array(y)for k in range(epochs):i = np.random.randint(X.shape[0])#随机选行a = [X[i]]for l in range(len(self.weights)):  #going forward network, for each layer#选择一条实例与权重点乘 并且将值传给激活函数,经过a的append 使得所有神经元都有了值(正向)a.append(self.activation(np.dot(a[l], self.weights[l])))  #Computer the node value for each layer (O_i) using activation functionerror = y[i] - a[-1]  #Computer the error at the top layer 真实值与计算值的差(向量)#通过求导 得到权重应当调整的误差deltas = [error * self.activation_deriv(a[-1])] #For output layer, Err calculation (delta is updated error)#Staring backprobagation 更新weightfor l in range(len(a) - 2, 0, -1): # we need to begin at the second to last layer 每次减一#Compute the updated error (i,e, deltas) for each node going from top layer to input layerdeltas.append(deltas[-1].dot(self.weights[l].T)*self.activation_deriv(a[l]))deltas.reverse()for i in range(len(self.weights)):layer = np.atleast_2d(a[i])delta = np.atleast_2d(deltas[i])self.weights[i] += learning_rate * layer.T.dot(delta)def predict(self, x):x = np.array(x)temp = np.ones(x.shape[0]+1)temp[0:-1] = xa = tempfor l in range(0, len(self.weights)):a = self.activation(np.dot(a, self.weights[l]))return a

 异或运算 

from NeuralNetwork import NeuralNetwork
import numpy as npnn = NeuralNetwork([2, 2, 1], 'tanh')
X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
y = np.array([0, 1, 1, 0])
nn.fit(X, y)
for i in [[0, 0], [0, 1], [1, 0], [1, 1]]:print(i, nn.predict(i))

 

([0, 0], array([-0.00475208]))
([0, 1], array([ 0.99828477]))
([1, 0], array([ 0.99827186]))
([1, 1], array([-0.00776711]))  

 手写体识别

#!/usr/bin/python
# -*- coding:utf-8 -*-# 每个图片8x8  识别数字:0,1,2,3,4,5,6,7,8,9import numpy as np
from sklearn.datasets import load_digits
from sklearn.metrics import confusion_matrix, classification_report
from sklearn.preprocessing import LabelBinarizer
from NeuralNetwork import NeuralNetwork
from sklearn.model_selection import train_test_splitdigits = load_digits()
X = digits.data
y = digits.target
X -= X.min()  # normalize the values to bring them into the range 0-1
X /= X.max()nn = NeuralNetwork([64, 100, 10], 'logistic')
X_train, X_test, y_train, y_test = train_test_split(X, y)
labels_train = LabelBinarizer().fit_transform(y_train)
labels_test = LabelBinarizer().fit_transform(y_test)
print "start fitting"
nn.fit(X_train, labels_train, epochs=3000)
predictions = []
for i in range(X_test.shape[0]):o = nn.predict(X_test[i])predictions.append(np.argmax(o))
print confusion_matrix(y_test, predictions)
print classification_report(y_test, predictions)

 

confusion_matrix
precision    recall  f1-score   support0       1.00      0.97      0.99        341       0.75      0.91      0.82        462       1.00      0.92      0.96        503       1.00      0.92      0.96        514       0.94      0.91      0.92        535       0.95      0.96      0.96        576       0.97      0.95      0.96        387       0.88      1.00      0.93        358       0.88      0.83      0.85        429       0.86      0.82      0.84        44avg / total       0.92      0.92      0.92       450

  

转载于:https://www.cnblogs.com/wlc297984368/p/7467254.html

神经网络一(Neural Network)相关推荐

  1. 卷积神经网络(Convolutional Neural Network, CNN)

    卷积神经网络(Convolutional Neural Network, CNN) 目录 卷积神经网络(Convolutional Neural Network, CNN) 概述: 结构: 卷积层:

  2. 深度学习之递归神经网络(Recurrent Neural Network,RNN)

    为什么有bp神经网络.CNN.还需要RNN? BP神经网络和CNN的输入输出都是互相独立的:但是实际应用中有些场景输出内容和之前的内 容是有关联的. RNN引入"记忆"的概念:递归 ...

  3. python中forward的作用_基于numpy的前馈神经网络(feedforward neural network)

    *** 这几天在上Andrew Ng教授开的Coursera系列课程Deep Learning,总觉得光是看视频和做作业还不够,还是得自己动手写写代码,亲自实现课程里提到的算法内容,于是便有了这篇博客 ...

  4. 递归神经网络(Recursive Neural Network, RNN)

    信息往往还存在着诸如树结构.图结构等更复杂的结构.这就需要用到递归神经网络 (Recursive Neural Network, RNN),巧合的是递归神经网络的缩写和循环神经网络一样,也是RNN,递 ...

  5. 非常详细的讲解让你深刻理解神经网络NN(neural network)

    作者:RayChiu_Labloy 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 目录 什么是神经网络NN.人工神经网络ANN 神经元(神经网络的基本单元) 概念详解 ...

  6. 什么是RNN?一文看懂强大的循环神经网络(Recurrent Neural Network, RNN)

    循环神经网络(Recurrent Neural Network,RNN)是一类用于处理序列数据的神经网络.所谓序列数据,即前面的输入和后面的输入是有关系的,如一个句子,或者视频帧.就像卷积网络是专门用 ...

  7. 脉冲神经网络:MATLAB实现脉冲神经网络(Spiking Neural Network,SNN) 用于图像分类(提供MATLAB代码)

    一.脉冲神经网络 脉冲神经网络 (Spiking Neural Network,SNN) ,是第三代神经网络.其旨在弥合神经科学和机器学习之间的差距,使用最拟合生物神经元机制的模型来进行计算,更接近生 ...

  8. 深度学习基础--不同网络种类--尖峰神经网络/脉冲神经网络(spiking neural network, snn)

    尖峰神经网络/脉冲神经网络(spiking neural network, snn)   是三代神经网络模型,属于计算神经科学,动物的神经网络大多是脉冲神经网络.   资料不多,而且大多是外文   本 ...

  9. 循环神经网络(Recurrent Neural Network)详解

    循环神经网络(RNNs)是神经网络中一个大家族,它们主要用于文本.信号等序列相关的数据.常见的循环神经网络有长短期记忆网络(LSTM).门控循环单元网络(GRU)等,而这些循环神经网络都是在最早的一种 ...

  10. 卷积神经网络Convolutional Neural Network (CNN)

    卷积神经网络 转载请注明:http://blog.csdn.net/stdcoutzyx/article/details/41596663 自今年七月份以来,一直在实验室负责卷积神经网络(Convol ...

最新文章

  1. [Xcode 实际操作]八、网络与多线程-(19)使用RunLoop使PerformSelector方法延迟动作的执行...
  2. linux-arm下如何开启tftp传输,arm linux 下移植busybox 的tftp
  3. PyQt5 让窗口在桌面居中的办法
  4. poj 2236 WirelessNetwork 并查集
  5. “浴霸”三摄出镜率真高!中兴Blade 20工信部入网
  6. 谁在杀死Facebook?谁该为我们负责?
  7. 分布式链路追踪(Sleuth、Zipkin)
  8. 我的电脑属性被隐藏 咋能显示
  9. 14.5-全栈Java笔记:java.awt这些布局怎么写?|流式|边界|网格
  10. 某处发现百分百恢复覆盖的分区数据恢复方法(掌握)
  11. CAN网络错误帧排查
  12. 【数学建模】预测模型之BP网络预测
  13. 诗经名句(供大家看代码疲劳的时候消遣下)
  14. 我认知的 DevOps 核心价值
  15. 手机市场变天:荣耀鸣枪,重回舞台中央?
  16. 名侦探柯南之零的执行人
  17. Linux下安装OpenOffice
  18. 多项式求和 SDUT25044
  19. C# 之 扑克游戏 -- 21点规则介绍和代码实现
  20. Jenkins部署项目时,git报错fatal: index file smaller than expected

热门文章

  1. 后端根据百度地图真实路径距离_做地图功能的设计,有哪些容易被我们忽略的思考?...
  2. thrift java 对象_Apache Thrift,Java:对象数据类型
  3. 台达编码器型号含义_编码器型号说明 编码器型号大全 编码器型号选型
  4. 方舟生存进化服务器Linux,方舟生存进化官方服务器与私人服务器有什么区别
  5. 图像融合(三)-- 拉普拉斯金字塔
  6. 系统学习数字图像处理之灰度变换和空域滤波
  7. “21天好习惯”第一期-21
  8. ax200黑苹果蓝牙驱动_家庭网络升级计划篇一:将无线进行到底,AX200网卡升级体验...
  9. shellcode助手
  10. node + express + sockio 在线聊天室