python 神经网络实例

 

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

 

posted on 2017-09-22 21:59  Maddock  阅读(3736)  评论(0编辑  收藏  举报

导航