如何用Python 实现全连接神经网络(Multi-layer Perceptron)


Posted in Python onOctober 15, 2020

代码

import numpy as np

# 各种激活函数及导数
def sigmoid(x):
  return 1 / (1 + np.exp(-x))


def dsigmoid(y):
  return y * (1 - y)


def tanh(x):
  return np.tanh(x)


def dtanh(y):
  return 1.0 - y ** 2


def relu(y):
  tmp = y.copy()
  tmp[tmp < 0] = 0
  return tmp


def drelu(x):
  tmp = x.copy()
  tmp[tmp >= 0] = 1
  tmp[tmp < 0] = 0
  return tmp


class MLPClassifier(object):
  """多层感知机,BP 算法训练"""

  def __init__(self,
         layers,
         activation='tanh',
         epochs=20, batch_size=1, learning_rate=0.01):
    """
    :param layers: 网络层结构
    :param activation: 激活函数
    :param epochs: 迭代轮次
    :param learning_rate: 学习率 
    """
    self.epochs = epochs
    self.learning_rate = learning_rate
    self.layers = []
    self.weights = []
    self.batch_size = batch_size

    for i in range(0, len(layers) - 1):
      weight = np.random.random((layers[i], layers[i + 1]))
      layer = np.ones(layers[i])
      self.layers.append(layer)
      self.weights.append(weight)
    self.layers.append(np.ones(layers[-1]))

    self.thresholds = []
    for i in range(1, len(layers)):
      threshold = np.random.random(layers[i])
      self.thresholds.append(threshold)

    if activation == 'tanh':
      self.activation = tanh
      self.dactivation = dtanh
    elif activation == 'sigomid':
      self.activation = sigmoid
      self.dactivation = dsigmoid
    elif activation == 'relu':
      self.activation = relu
      self.dactivation = drelu

  def fit(self, X, y):
    """
    :param X_: shape = [n_samples, n_features] 
    :param y: shape = [n_samples] 
    :return: self
    """
    for _ in range(self.epochs * (X.shape[0] // self.batch_size)):
      i = np.random.choice(X.shape[0], self.batch_size)
      # i = np.random.randint(X.shape[0])
      self.update(X[i])
      self.back_propagate(y[i])

  def predict(self, X):
    """
    :param X: shape = [n_samples, n_features] 
    :return: shape = [n_samples]
    """
    self.update(X)
    return self.layers[-1].copy()

  def update(self, inputs):
    self.layers[0] = inputs
    for i in range(len(self.weights)):
      next_layer_in = self.layers[i] @ self.weights[i] - self.thresholds[i]
      self.layers[i + 1] = self.activation(next_layer_in)

  def back_propagate(self, y):
    errors = y - self.layers[-1]

    gradients = [(self.dactivation(self.layers[-1]) * errors).sum(axis=0)]

    self.thresholds[-1] -= self.learning_rate * gradients[-1]
    for i in range(len(self.weights) - 1, 0, -1):
      tmp = np.sum(gradients[-1] @ self.weights[i].T * self.dactivation(self.layers[i]), axis=0)
      gradients.append(tmp)
      self.thresholds[i - 1] -= self.learning_rate * gradients[-1] / self.batch_size
    gradients.reverse()
    for i in range(len(self.weights)):
      tmp = np.mean(self.layers[i], axis=0)
      self.weights[i] += self.learning_rate * tmp.reshape((-1, 1)) * gradients[i]

测试代码

import sklearn.datasets
import numpy as np

def plot_decision_boundary(pred_func, X, y, title=None):
  """分类器画图函数,可画出样本点和决策边界
  :param pred_func: predict函数
  :param X: 训练集X
  :param y: 训练集Y
  :return: None
  """

  # Set min and max values and give it some padding
  x_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5
  y_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5
  h = 0.01
  # Generate a grid of points with distance h between them
  xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))
  # Predict the function value for the whole gid
  Z = pred_func(np.c_[xx.ravel(), yy.ravel()])
  Z = Z.reshape(xx.shape)
  # Plot the contour and training examples
  plt.contourf(xx, yy, Z, cmap=plt.cm.Spectral)
  plt.scatter(X[:, 0], X[:, 1], s=40, c=y, cmap=plt.cm.Spectral)

  if title:
    plt.title(title)
  plt.show()


def test_mlp():
  X, y = sklearn.datasets.make_moons(200, noise=0.20)
  y = y.reshape((-1, 1))
  n = MLPClassifier((2, 3, 1), activation='tanh', epochs=300, learning_rate=0.01)
  n.fit(X, y)
  def tmp(X):
    sign = np.vectorize(lambda x: 1 if x >= 0.5 else 0)
    ans = sign(n.predict(X))
    return ans

  plot_decision_boundary(tmp, X, y, 'Neural Network')

效果

如何用Python 实现全连接神经网络(Multi-layer Perceptron)

如何用Python 实现全连接神经网络(Multi-layer Perceptron)

更多机器学习代码,请访问 https://github.com/WiseDoge/plume

以上就是如何用Python 实现全连接神经网络(Multi-layer Perceptron)的详细内容,更多关于Python 实现全连接神经网络的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python实现发送email的几种常用方法
Aug 18 Python
python实现端口转发器的方法
Mar 13 Python
python PyTorch预训练示例
Feb 11 Python
使用Python和xlwt向Excel文件中写入中文的实例
Apr 21 Python
python3下使用cv2.imwrite存储带有中文路径图片的方法
May 10 Python
详解PyCharm配置Anaconda的艰难心路历程
Aug 13 Python
Python如何获得百度统计API的数据并发送邮件示例代码
Jan 27 Python
余弦相似性计算及python代码实现过程解析
Sep 18 Python
浅谈PyQt5中异步刷新UI和Python多线程总结
Dec 13 Python
Python for循环搭配else常见问题解决
Feb 11 Python
解决启动django,浏览器显示“服务器拒绝访问”的问题
May 13 Python
解决python图像处理图像赋值后变为白色的问题
Jun 04 Python
python 实现非极大值抑制算法(Non-maximum suppression, NMS)
Oct 15 #Python
解决pip安装的第三方包在PyCharm无法导入的问题
Oct 15 #Python
python实现粒子群算法
Oct 15 #Python
如何将anaconda安装配置的mmdetection环境离线拷贝到另一台电脑
Oct 15 #Python
Python3.7安装PyQt5 运行配置Pycharm的详细教程
Oct 15 #Python
python利用faker库批量生成测试数据
Oct 15 #Python
如何利用python检测图片是否包含二维码
Oct 15 #Python
You might like
浅谈php安全性需要注意的几点事项
2014/07/17 PHP
php利用smtp类实现电子邮件发送
2015/10/30 PHP
PHP实现链式操作的三种方法详解
2017/11/16 PHP
PHP curl批处理及多请求并发实现方法分析
2018/08/15 PHP
使用Zookeeper分布式部署PHP应用程序
2019/03/15 PHP
tp5(thinkPHP5框架)使用DB实现批量删除功能示例
2019/05/28 PHP
转自Jquery官方 jQuery1.1.3发布,速度提升800%,体积保持20K
2007/08/19 Javascript
Javascript Tab 导航插件 (23个)
2009/06/11 Javascript
jquery学习笔记 用jquery实现无刷新登录
2011/08/08 Javascript
使用jquery实现图文切换效果另加特效
2013/01/20 Javascript
jQuery实现鼠标可拖动调整表格列宽度
2014/05/26 Javascript
jquery比较简洁的软键盘特效实现方法
2015/03/19 Javascript
浅谈JavaScript中的Math.atan()方法的使用
2015/06/14 Javascript
js创建数组的简单方法
2016/07/27 Javascript
教你用Cordova打包Vue项目的方法
2017/10/17 Javascript
微信{"errcode":48001,"errmsg":"api unauthorized, hints: [ req_id: 1QoCla0699ns81 ]"}
2018/10/12 Javascript
详解Vue中的自定义指令
2020/12/07 Vue.js
[03:11]DOTA2上海特锦赛小组赛第一日recap精彩回顾
2016/02/28 DOTA
[01:18]PWL开团时刻DAY4——圣剑与抢盾
2020/11/03 DOTA
Python3调用微信企业号API发送文本消息代码示例
2017/11/10 Python
Python跨文件全局变量的实现方法示例
2017/12/10 Python
python操作excel的方法
2018/08/16 Python
Python实现计算字符串中出现次数最多的字符示例
2019/01/21 Python
连接pandas以及数组转pandas的方法
2019/06/28 Python
python3 selenium自动化测试 强大的CSS定位方法
2019/08/23 Python
Numpy的简单用法小结
2019/08/28 Python
基于第一个PhoneGap(cordova)的应用详解
2013/05/03 HTML / CSS
泰国王权免税店官方网站:KingPower
2019/03/11 全球购物
你对IPv6了解程度
2016/02/09 面试题
门诊挂号室室长岗位职责
2013/11/27 职场文书
初中生操行评语大全
2014/04/24 职场文书
赞助商致辞
2015/07/30 职场文书
利用Python读取微信朋友圈的多种方法总结
2021/08/23 Python
Selenium浏览器自动化如何上传文件
2022/04/06 Python
Redis高并发缓存架构性能优化
2022/05/15 Redis
Python软件包安装的三种常见方法
2022/07/07 Python