BP神經網絡

流程
在這裏插入圖片描述

code

import numpy as np


# 定義tanh函數
def tanh(x):
  return np.tanh(x)
 
 
# tanh函數的導數
def tan_deriv(x):
  return 1.0 - np.tanh(x) * np.tan(x)
 
 
# sigmoid函數
def logistic(x):
  return 1 / (1 + np.exp(-x))
 
 
# sigmoid函數的導數
def logistic_derivative(x):
  return logistic(x) * (1 - logistic(x))
 
 
class NeuralNetwork:
  def __init__(self, layers, activation='tanh'):
    """
    神經網絡算法構造函數
    :param layers: 神經元層數
    :param activation: 使用的函數(默認tanh函數)
    :return:none
    """
    if activation == 'logistic':
      self.activation = logistic
      self.activation_deriv = logistic_derivative
    elif activation == 'tanh':
      self.activation = tanh
      self.activation_deriv = tan_deriv
 
    # 權重列表
    self.weights = []
    # 初始化權重(隨機)
    for i in range(1, len(layers) - 1):
      self.weights.append((2 * np.random.random((layers[i - 1] + 1, layers[i] + 1)) - 1) * 0.25)
      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):
    """
    訓練神經網絡
    :param X: 數據集(通常是二維)
    :param y: 分類標記
    :param learning_rate: 學習率(默認0.2)
    :param epochs: 訓練次數(最大循環次數,默認10000)
    :return: none
    """
    # 確保數據集是二維的
    X = np.atleast_2d(X)
 
    temp = np.ones([X.shape[0], X.shape[1] + 1])
    temp[:, 0: -1] = X
    X = temp
    y = np.array(y)
 
    for k in range(epochs):
      # 隨機抽取X的一行
      i = np.random.randint(X.shape[0])
      # 用隨機抽取的這一組數據對神經網絡更新
      a = [X[i]]
      # 正向更新
      for l in range(len(self.weights)):
        a.append(self.activation(np.dot(a[l], self.weights[l])))
      error = y[i] - a[-1]
      deltas = [error * self.activation_deriv(a[-1])]
 
      # 反向更新
      for l in range(len(a) - 2, 0, -1):
        deltas.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] = x
    a = temp
    for l in range(0, len(self.weights)):
      a = self.activation(np.dot(a, self.weights[l]))
    return a
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章