5.2 神經網絡算法應用

  1. 關於非線性轉化方程(non-linear transformation function)

sigmoid函數(S 曲線)用來作爲activation function:

 1.1 雙曲函數(tanh)

 1.2  邏輯函數(logistic function)
  1. 實現一個簡單的神經網絡算法
NeuralNetwork.py

import numpy as np

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

def tanh_deriv(x):
    return 1.0-np.tanh(x)*np.tanh(x)

def logistic(x):
    return 1/(1+np.exp(-x))

def logistic_deriv(x):
    return logistic(x)*(1-logistic(x))

class NeuralNetwork:
    def __init__(self,layers,activation='tanh'):
        """
        :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
            self.activation_deriv=logistic_deriv
        else:
            self.activation=tanh
            self.activation_deriv=tanh_deriv
        self.weights=[]
#        for i in range(1, len(layers)-1 ):
#            self.weights.append(np.random.random((layers[i - 1] + 1, layers[i] + 1)))
#            self.weights.append(np.random.random((layers[i] + 1, layers[i + 1])))
        for i in range(1,len(layers)-1):
            self.weights.append(np.random.random((layers[i-1]+1,layers[i]+1)))
        self.weights.append(np.random.random((layers[-2]+1,layers[-1])))

    def fit(self,X,y,learning_rate=0.2,epochs=10000):
        X=np.atleast_2d(X)
        temp=np.ones([X.shape[0],X.shape[1]+1])
        temp[:,0:-1]=X # adding the bias unit to the input layer
        X=temp
        y=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(self.activation(np.dot(a[l],self.weights[l])))  #Compute the node value for each layer (O_i) using activation function
            error=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
            for l in range(len(a)-2,0,-1):
                #Compute the updated error (i,e, deltas) for each node going from top layer to input layer
                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]))
        print('a:',a)
        return a 
  1. 應用一:簡單非線性關係數據集測試(XOR):
    X: Y
    0 0 0
    0 1 1
    1 0 1
    1 1 0

    code:

from NeuralNetwork import NeuralNetwork
import numpy as np

nn=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))

3.2 手寫數字識別:

每個圖片8x8 
識別數字:0,1,2,3,4,5,6,7,8,9
code:
# -*- coding:utf-8 -*-
# 每個圖片8x8  識別數字:0,1,2,3,4,5,6,7,8,9


import numpy as np 
from sklearn.datasets import load_digits
from sklearn.metrics import confusion_matrix,classification_report
from sklearn.cross_validation import train_test_split
from sklearn.preprocessing import LabelBinarizer
from NeuralNetwork import NeuralNetwork

digits=load_digits()
X=digits.data
y=digits.target
X-=X.min()
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)
label_test=LabelBinarizer().fit_transform(y_test)
print("starting fit")
nn.fit(X_train, labels_train,epochs=30000)
predictions=[]
for i in range(X_test.shape[0]):
    output=nn.predict(X_test[i])
    predictions.append(np.argmax(output))
print confusion_matrix(y_test, predictions)
print classification_report(y_test, predictions)










“`

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章