1. 程式人生 > >用純numpy實現一個簡單的神經網路(理解)

用純numpy實現一個簡單的神經網路(理解)

簡單的一個numpy神經網路示例:

import numpy as np
class NeuralNetwork():
    def __init__(self):

        #將權重轉換為3×1矩陣,其值從-1到1,平均值為0
        self.synaptic_weights = 2 * np.random.random((3, 1)) - 1
        
    def sigmoid(self, x):
        # 定義 sigmoid 函式
        return 1 / (1 + np.exp(-x))
    def sigmoid_derivative(self, x):
        # 計算Sigmoid函式的導數(用於反向傳播)
        return x * (1 - x)
        
    # 訓練
    def train(self, training_inputs, training_outputs, training_iterations):
        # 訓練模型在不斷調整權重的同時進行準確預測
        for iteration in range(training_iterations):
            # 訓練資料通過每一層網路節點
            output = self.think(training_inputs)
            #反向傳播誤差率的計算
            error = training_outputs - output
            # performing weight adjustments
            # 進行權重調整
            adjustments = np.dot(training_inputs.T, error * self.sigmoid_derivative(output))
            self.synaptic_weights += adjustments

    def think(self, inputs):
        # 通過神經元傳遞輸入以獲得輸出
        # 將值轉換為浮點數
        inputs = inputs.astype(float)
        output = self.sigmoid(np.dot(inputs, self.synaptic_weights))
        return output
 
if __name__ == "__main__":
    # 初始化神經元類
    neural_network = NeuralNetwork()
    print("初始化權重: ")
    print(neural_network.synaptic_weights)
    # 4組訓練資料--3輸入1輸出
    training_inputs = np.array([[0, 0, 1],
                                [1, 1, 1],
                                [1, 0, 1],
                                [0, 1, 1]])
    training_outputs = np.array([[0, 1, 1, 0]]).T
    # 訓練
    neural_network.train(training_inputs, training_outputs, 20000)
    print("訓練之後的權重: ")
    print(neural_network.synaptic_weights)
    user_input_one = str(input("輸入第一個資料: "))
    user_input_two = str(input("輸入第二個資料: "))
    user_input_three = str(input("輸入第三個資料: "))
    print("輸入資料轉換", user_input_one, user_input_two, user_input_three)
    print("模型輸出: ")
    print(neural_network.think(np.array([user_input_one, user_input_two, user_input_three])))