欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python實(shí)現(xiàn)的人工神經(jīng)網(wǎng)絡(luò)算法示例【基于反向傳播算法】

 更新時(shí)間:2017年11月11日 12:02:14   作者:miangangzhen  
這篇文章主要介紹了Python實(shí)現(xiàn)的人工神經(jīng)網(wǎng)絡(luò)算法,結(jié)合實(shí)例形式分析了Python基于反向傳播算法實(shí)現(xiàn)的人工神經(jīng)網(wǎng)絡(luò)相關(guān)操作技巧,需要的朋友可以參考下

本文實(shí)例講述了Python實(shí)現(xiàn)的人工神經(jīng)網(wǎng)絡(luò)算法。分享給大家供大家參考,具體如下:

注意:本程序使用Python3編寫(xiě),額外需要安裝numpy工具包用于矩陣運(yùn)算,未測(cè)試python2是否可以運(yùn)行。

本程序?qū)崿F(xiàn)了《機(jī)器學(xué)習(xí)》書(shū)中所述的反向傳播算法訓(xùn)練人工神經(jīng)網(wǎng)絡(luò),理論部分請(qǐng)參考我的讀書(shū)筆記。

在本程序中,目標(biāo)函數(shù)是由一個(gè)輸入x和兩個(gè)輸出y組成,
x是在范圍【-3.14, 3.14】之間隨機(jī)生成的實(shí)數(shù),而兩個(gè)y值分別對(duì)應(yīng) y1 = sin(x),y2 = 1。

隨機(jī)生成一萬(wàn)份訓(xùn)練樣例,經(jīng)過(guò)網(wǎng)絡(luò)的學(xué)習(xí)訓(xùn)練后,再用隨機(jī)生成的五份測(cè)試數(shù)據(jù)驗(yàn)證訓(xùn)練結(jié)果。

調(diào)節(jié)算法的學(xué)習(xí)速率,以及隱藏層個(gè)數(shù)、隱藏層大小,訓(xùn)練新的網(wǎng)絡(luò),可以觀察到參數(shù)對(duì)于學(xué)習(xí)結(jié)果的影響。

算法代碼如下:

#!usr/bin/env python3
# -*- coding:utf-8 -*-
import numpy as np
import math
# definition of sigmoid funtion
# numpy.exp work for arrays.
def sigmoid(x):
  return 1 / (1 + np.exp(-x))
# definition of sigmoid derivative funtion
# input must be sigmoid function's result
def sigmoid_output_to_derivative(result):
  return result*(1-result)
# init training set
def getTrainingSet(nameOfSet):
  setDict = {
    "sin": getSinSet(),
    }
  return setDict[nameOfSet]
def getSinSet():
  x = 6.2 * np.random.rand(1) - 3.14
  x = x.reshape(1,1)
  # y = np.array([5 *x]).reshape(1,1)
  # y = np.array([math.sin(x)]).reshape(1,1)
  y = np.array([math.sin(x),1]).reshape(1,2)
  return x, y
def getW(synapse, delta):
  resultList = []
  # 遍歷隱藏層每個(gè)隱藏單元對(duì)每個(gè)輸出的權(quán)值,比如8個(gè)隱藏單元,每個(gè)隱藏單元對(duì)兩個(gè)輸出各有2個(gè)權(quán)值
  for i in range(synapse.shape[0]):
    resultList.append(
      (synapse[i,:] * delta).sum()
      )
  resultArr = np.array(resultList).reshape(1, synapse.shape[0])
  return resultArr
def getT(delta, layer):
  result = np.dot(layer.T, delta)
  return result
def backPropagation(trainingExamples, etah, input_dim, output_dim, hidden_dim, hidden_num):
  # 可行條件
  if hidden_num < 1:
    print("隱藏層數(shù)不得小于1")
    return
  # 初始化網(wǎng)絡(luò)權(quán)重矩陣,這個(gè)是核心
  synapseList = []
  # 輸入層與隱含層1
  synapseList.append(2*np.random.random((input_dim,hidden_dim)) - 1)
  # 隱含層1與隱含層2, 2->3,,,,,,n-1->n
  for i in range(hidden_num-1):
    synapseList.append(2*np.random.random((hidden_dim,hidden_dim)) - 1)
  # 隱含層n與輸出層
  synapseList.append(2*np.random.random((hidden_dim,output_dim)) - 1)
  iCount = 0
  lastErrorMax = 99999
  # while True:
  for i in range(10000):
    errorMax = 0
    for x, y in trainingExamples:
      iCount += 1
      layerList = []
      # 正向傳播
      layerList.append(
        sigmoid(np.dot(x,synapseList[0]))
        )
      for j in range(hidden_num):
        layerList.append(
          sigmoid(np.dot(layerList[-1],synapseList[j+1]))
          )
      # 對(duì)于網(wǎng)絡(luò)中的每個(gè)輸出單元k,計(jì)算它的誤差項(xiàng)
      deltaList = []
      layerOutputError = y - layerList[-1]
      # 收斂條件
      errorMax = layerOutputError.sum() if layerOutputError.sum() > errorMax else errorMax
      deltaK = sigmoid_output_to_derivative(layerList[-1]) * layerOutputError
      deltaList.append(deltaK)
      iLength = len(synapseList)
      for j in range(hidden_num):
        w = getW(synapseList[iLength - 1 - j], deltaList[j])
        delta = sigmoid_output_to_derivative(layerList[iLength - 2 - j]) * w
        deltaList.append(delta)
      # 更新每個(gè)網(wǎng)絡(luò)權(quán)值w(ji)
      for j in range(len(synapseList)-1, 0, -1):
        t = getT(deltaList[iLength - 1 -j], layerList[j-1])
        synapseList[j] = synapseList[j] + etah * t
      t = getT(deltaList[-1], x)
      synapseList[0] = synapseList[0] + etah * t
    print("最大輸出誤差:")
    print(errorMax)
    if abs(lastErrorMax - errorMax) < 0.0001:
      print("收斂了")
      print("####################")
      break
    lastErrorMax = errorMax
  # 測(cè)試訓(xùn)練好的網(wǎng)絡(luò)
  for i in range(5):
    xTest, yReal = getSinSet()
    layerTmp = sigmoid(np.dot(xTest,synapseList[0]))
    for j in range(1, len(synapseList), 1):
      layerTmp = sigmoid(np.dot(layerTmp,synapseList[j]))
    yTest = layerTmp
    print("x:")
    print(xTest)
    print("實(shí)際的y:")
    print(yReal)
    print("神經(jīng)元網(wǎng)絡(luò)輸出的y:")
    print(yTest)
    print("最終輸出誤差:")
    print(np.abs(yReal - yTest))
    print("#####################")
  print("迭代次數(shù):")
  print(iCount)
if __name__ == '__main__':
  import datetime
  tStart = datetime.datetime.now()
  # 使用什么樣的訓(xùn)練樣例
  nameOfSet = "sin"
  x, y = getTrainingSet(nameOfSet)
  # setting of parameters
  # 這里設(shè)置了學(xué)習(xí)速率。
  etah = 0.01
  # 隱藏層數(shù)
  hidden_num = 2
  # 網(wǎng)絡(luò)輸入層的大小
  input_dim = x.shape[1]
  # 隱含層的大小
  hidden_dim = 100
  # 輸出層的大小
  output_dim = y.shape[1]
  # 構(gòu)建訓(xùn)練樣例
  trainingExamples = []
  for i in range(10000):
    x, y = getTrainingSet(nameOfSet)
    trainingExamples.append((x, y))
  # 開(kāi)始用反向傳播算法訓(xùn)練網(wǎng)絡(luò)
  backPropagation(trainingExamples, etah, input_dim, output_dim, hidden_dim, hidden_num)
  tEnd = datetime.datetime.now()
  print("time cost:")
  print(tEnd - tStart)

更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python加密解密算法與技巧總結(jié)》、《Python編碼操作技巧總結(jié)》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》及《Python入門(mén)與進(jìn)階經(jīng)典教程

希望本文所述對(duì)大家Python程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • 代碼分析Python地圖坐標(biāo)轉(zhuǎn)換

    代碼分析Python地圖坐標(biāo)轉(zhuǎn)換

    這篇文章主要介紹了Python地圖坐標(biāo)轉(zhuǎn)換的相關(guān)知識(shí)點(diǎn)以及分享了相關(guān)的代碼實(shí)例,對(duì)此有興趣的朋友學(xué)習(xí)下。
    2018-02-02
  • 使用Python的Zato發(fā)送AMQP消息的教程

    使用Python的Zato發(fā)送AMQP消息的教程

    這篇文章主要介紹了使用Python的Zato發(fā)送AMQP消息的教程,主要是基于一些Zato的圖形化界面進(jìn)行操作,需要的朋友可以參考下
    2015-04-04
  • Python爬取肯德基官網(wǎng)ajax的post請(qǐng)求實(shí)現(xiàn)過(guò)程

    Python爬取肯德基官網(wǎng)ajax的post請(qǐng)求實(shí)現(xiàn)過(guò)程

    這篇文章主要介紹了Python爬取肯德基官網(wǎng)ajax的post請(qǐng)求實(shí)現(xiàn)過(guò)程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家學(xué)有所得,多多進(jìn)步
    2021-10-10
  • 淺談pytorch和Numpy的區(qū)別以及相互轉(zhuǎn)換方法

    淺談pytorch和Numpy的區(qū)別以及相互轉(zhuǎn)換方法

    今天小編就為大家分享一篇淺談pytorch和Numpy的區(qū)別以及相互轉(zhuǎn)換方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • 利用Python中的mock庫(kù)對(duì)Python代碼進(jìn)行模擬測(cè)試

    利用Python中的mock庫(kù)對(duì)Python代碼進(jìn)行模擬測(cè)試

    這篇文章主要介紹了利用Python中的mock庫(kù)對(duì)Python代碼進(jìn)行模擬測(cè)試,mock庫(kù)自從Python3.3依賴(lài)成為了Python的內(nèi)置庫(kù),本文也等于介紹了該庫(kù)的用法,需要的朋友可以參考下
    2015-04-04
  • python協(xié)程與?asyncio?庫(kù)詳情

    python協(xié)程與?asyncio?庫(kù)詳情

    這篇文章主要介紹了python協(xié)程與?asyncio?庫(kù)詳情,文章基于python展開(kāi)詳細(xì)內(nèi)容,具有一定的參考價(jià)值。需要的小伙伴可以參考一下
    2022-05-05
  • tensorflow 限制顯存大小的實(shí)現(xiàn)

    tensorflow 限制顯存大小的實(shí)現(xiàn)

    今天小編就為大家分享一篇tensorflow 限制顯存大小的實(shí)現(xiàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-02-02
  • python列表生成器迭代器實(shí)例解析

    python列表生成器迭代器實(shí)例解析

    這篇文章主要介紹了python列表生成器迭代器實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • 基于TensorFlow中自定義梯度的2種方式

    基于TensorFlow中自定義梯度的2種方式

    今天小編就為大家分享一篇基于TensorFlow中自定義梯度的2種方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-02-02
  • Python進(jìn)度條的制作代碼實(shí)例

    Python進(jìn)度條的制作代碼實(shí)例

    這篇文章主要介紹了Python進(jìn)度條的制作代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08

最新評(píng)論