神经网络原理

神经网络是一种模拟人类神经系统工作方式的机器学习算法。它由多个称为神经元的基本单元组成,这些神经元相互连接并传递信息。神经网络广泛应用于图像和语音识别、自然语言处理、预测和分类等领域。

神经元

神经元是神经网络的基本单元。它接收输入信号,并通过激活函数对输入进行加权和处理,然后将输出传递给下一层的神经元。神经元的结构如下所示:

class Neuron:
    def __init__(self, weights, bias):
        self.weights = weights
        self.bias = bias

    def activate(self, inputs):
        total = 0
        for i in range(len(inputs)):
            total += inputs[i] * self.weights[i]
        total += self.bias
        return self.sigmoid(total)

    def sigmoid(self, x):
        return 1 / (1 + math.exp(-x))

在上面的代码中,weights表示神经元的权重,bias表示偏置项。activate方法对输入进行加权求和并通过sigmoid函数进行激活。

神经网络结构

神经网络由多个神经元组成,这些神经元按层次结构排列。通常包括输入层、隐藏层和输出层。输入层接收外部输入,隐藏层和输出层根据权重和偏置项进行计算和传递。

class NeuralNetwork:
    def __init__(self, layer_sizes):
        self.layers = []
        for i in range(1, len(layer_sizes)):
            self.layers.append(self.create_layer(layer_sizes[i - 1], layer_sizes[i]))

    def create_layer(self, input_size, output_size):
        layer = []
        for _ in range(output_size):
            weights = [random.uniform(-1, 1) for _ in range(input_size)]
            bias = random.uniform(-1, 1)
            layer.append(Neuron(weights, bias))
        return layer

    def feedforward(self, inputs):
        for layer in self.layers:
            outputs = []
            for neuron in layer:
                outputs.append(neuron.activate(inputs))
            inputs = outputs
        return outputs

在上面的代码中,NeuralNetwork类接受一个整数列表layer_sizes作为参数,该列表定义了每个层次的神经元数量。create_layer方法用于创建每个层次的神经元,并随机初始化权重和偏置项。

feedforward方法用于将输入信号传递到网络中的每个层次,最终返回输出层的输出。

训练神经网络

为了让神经网络能够进行预测和分类,我们需要对其进行训练。训练过程主要包括前向传播和反向传播。

前向传播通过将输入信号传递到网络中的每个层次并计算输出。然后,通过计算预测值与真实值之间的误差来评估网络的性能。

反向传播用于更新权重和偏置项,以减小误差并改善网络的性能。它通过计算误差梯度并反向传递到每个神经元来实现。

class NeuralNetwork:
    ...

    def train(self, inputs, targets, learning_rate):
        outputs = self.feedforward(inputs)
        errors = [targets[i] - outputs[i] for i in range(len(targets))]

        for i in range(len(self.layers) - 1, -1, -1):
            layer = self.layers[i]
            next_layer = self.layers[i + 1] if i < len(self.layers) - 1 else None

            for j, neuron in enumerate(layer):
                if next_layer:
                    error = 0
                    for next_neuron in next_layer:
                        error += next_neuron.weights[j] * errors[next_layer.index(next_neuron)]
                    errors[j] = error

                for k in range(len(neuron.weights)):
                    neuron.weights[k] += learning_rate * errors[j] * outputs[j] * (1 - outputs[j]) * inputs[k]
                neuron.bias += learning_rate * errors[j] * outputs[j] * (1 - outputs[j])

在上面的代码中,train方法接受输入数据、目标输出和学习率作