1. 程式人生 > >python 神經網絡實例

python 神經網絡實例

git poc layer numbers work numpy hang self. spl

#http://python.jobbole.com/82758/
# import numpy as np
#
#
# # sigmoid function
# def nonlin(x, deriv=False):
#     if (deriv == True):
#         return x * (1 - x)
#     return 1 / (1 + np.exp(-x))
#
#
# # input dataset
# X = np.array([[0, 0, 1],
#               [0, 1, 1],
#               [1, 0, 1],
#               [1, 1, 1]])
# # # output dataset # y = np.array([[0, 0, 1, 1]]).T # # # seed random numbers to make calculation # # deterministic (just a good practice) # np.random.seed(1) # # # initialize weights randomly with mean 0 # syn0 = 2 * np.random.random((3, 1)) - 1 # # for iter in range(10000): # # forward propagation #
l0 = X # l1 = nonlin(np.dot(l0, syn0)) # # # how much did we miss? # l1_error = y - l1 # # # multiply how much we missed by the # # slope of the sigmoid at the values in l1 # l1_delta = l1_error * nonlin(l1, True) # # # update weights # syn0 += np.dot(l0.T, l1_delta)#反向傳播,w = w + f(y) * l1_delta
# print("Output After Training:") # print(l1) import numpy as np def nonlin(x, deriv=False): if (deriv == True): return x * (1 - x) return 1 / (1 + np.exp(-x)) X = np.array([[0, 0, 1], [0, 1, 1], [1, 0, 1], [1, 1, 1]]) y = np.array([[0], [1], [1], [0]]) np.random.seed(1) # randomly initialize our weights with mean 0 syn0 = 2 * np.random.random((3, 4)) - 1 syn1 = 2 * np.random.random((4, 1)) - 1 for j in range(60000): # Feed forward through layers 0, 1, and 2 l0 = X l1 = nonlin(np.dot(l0, syn0)) l2 = nonlin(np.dot(l1, syn1)) # how much did we miss the target value? l2_error = y - l2 if (j % 10000) == 0: print("Error:" + str(np.mean(np.abs(l2_error)))) # in what direction is the target value? # were we really sure? if so, don‘t change too much. l2_delta = l2_error * nonlin(l2, deriv=True) # how much did each l1 value contribute to the l2 error (according to the weights)? l1_error = l2_delta.dot(syn1.T) # in what direction is the target l1? # were we really sure? if so, don‘t change too much. l1_delta = l1_error * nonlin(l1, deriv=True) syn1 += l1.T.dot(l2_delta) syn0 += l0.T.dot(l1_delta) print("Output After Training:") print(l2)

# 1.
# 關於非線性轉化方程(non - linear
# transformation
# function)
#
# sigmoid函數(S
# 曲線)用來作為activation
# function:
#
# 1.1
# 雙曲函數(tanh)
#
# 1.2
# 邏輯函數(logistic
# function)
#
#
# 2.
# 實現一個簡單的神經網絡算法

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_derivative(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_derivative
        elif activation == tanh:
            self.activation = tanh
            self.activation_deriv = tanh_deriv

        self.weights = []
        for i in range(1, len(layers) - 1):
            #layers[i - 1]為前一輸入層節點數 +1是加上一個偏置點,
            #layers[i]為當前層的輸出節點數 +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):
        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]]

            #len(self.weights)為輸出節點個數,每個輸出節點對應了一組權值是weight中的一行self.weights[l]
            for l in range(len(self.weights)):  # going forward network, for each layer
                # Computer the node value for each layer (O_i) using activation function
                # a[l] 為輸入數據的特征值

                print(a[l])
                print(self.weights[l])
                a.append(self.activation(np.dot(a[l], self.weights[l])))

            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):  # we need to begin at the second to last layer
                # 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]))
        return a




print("簡單非線性關系數據集測試(XOR)")
# 1. 簡單非線性關系數據集測試(XOR):
#
# X:                  Y
# 0 0                 0
# 0 1                 1
# 1 0                 1
# 1 1                 0



#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))



print("\n\n手寫數字識別")
# 2. 手寫數字識別:
#
# 每個圖片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.preprocessing import LabelBinarizer
#from NeuralNetwork import NeuralNetwork
from sklearn.cross_validation import train_test_split


digits = load_digits()
X = digits.data
y = digits.target
X -= X.min() # normalize the values to bring them into the range 0-1
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)
labels_test = LabelBinarizer().fit_transform(y_test)
print("start fitting")
nn.fit(X_train,labels_train,epochs=3000)
predictions = []
for i in range(X_test.shape[0]):
    o = nn.predict(X_test[i] )
    predictions.append(np.argmax(o))
print (confusion_matrix(y_test,predictions))
print (classification_report(y_test,predictions))

python 神經網絡實例