• 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("
    
    手写数字识别")
    # 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))
  • 相关阅读:
    最有价值的专家--微软官方网站
    CC++初学者编程教程(16) 搭建Xcode cocos2dx开发环境--尹成老师博客
    微软最具价值的专家之毛星云博客
    Winsock IO模型之IOCP模型
    IOCP模型与网络编程
    关于proc索引的创建
    查找表存在于那些proc中
    Sql 时间做条件
    Sql 无指定条件,防并发update
    sql 根据客户需用 增减查询字段
  • 原文地址:https://www.cnblogs.com/adong7639/p/7577352.html
Copyright © 2020-2023  润新知