- 關於非線性轉化方程(non-linear transformation function)
sigmoid函數(S 曲線)用來作爲activation function:
1.1 雙曲函數(tanh)
1.2 邏輯函數(logistic function)
- 實現一個簡單的神經網絡算法
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
應用一:簡單非線性關係數據集測試(XOR):
X: Y
0 0 0
0 1 1
1 0 1
1 1 0code:
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)
“`