📜  Python中的单个神经元神经网络

📅  最后修改于: 2020-04-28 04:43:13             🧑  作者: Mango

神经网络是深度学习的核心,深度学习是一个在许多不同领域都有实际应用的领域。今天,神经网络已用于图像分类,语音识别,目标检测等。现在,让我们尝试了解所有这些最新技术背后的基本单位。
单个神经元将给定的输入转换为某些输出。根据给定的输入和分配给每个输入的权重,确定神经元是否激活。假设神经元具有3个输入连接和1个输出。


在给定的示例中,我们将使用tanh 激活函数
最终目标是为该神经元找到最佳的权重集,以产生正确的结果。通过使用几个不同的训练示例训练神经元来做到这一点。在每个步骤中,计算神经元输出中的误差,然后反向传播梯度。计算神经元输出的步骤称为正向传播,而计算梯度的步骤称为反向传播
下面是实现:

# Python程式实现单神经元神经网络
# 导入所有必需品库
from numpy import exp, array, random, dot, tanh
# 创建具有单个神经元的神经网络的类
class NeuralNetwork():
    def __init__(self):
        # 使用种子确保每次运行都会产生相同的权重
        random.seed(1)
        # 3x1权重矩阵
        self.weight_matrix = 2 * random.random((3, 1)) - 1
    # tanh作为激活函数
    def tanh(self, x):
        return tanh(x)
    # tanh函数的导数.
    # 需要计算梯度.
    def tanh_derivative(self, x):
        return 1.0 - tanh(x) ** 2
    # 前向传播
    def forward_propagation(self, inputs):
        return self.tanh(dot(inputs, self.weight_matrix))
    # 训练神经网络.
    def train(self, train_inputs, train_outputs,
                            num_train_iterations):
        # 我们要针对这组输入执行的迭代次数.
        for iteration in range(num_train_iterations):
            output = self.forward_propagation(train_inputs)
            # 计算输出中的误差.
            error = train_outputs - output
            # 将误差乘以输入,然后乘以正切函数的梯度,以计算出需要对权重进行调整
            adjustment = dot(train_inputs.T, error *
                             self.tanh_derivative(output))
            # 调整权重矩阵
            self.weight_matrix += adjustment
# 驱动程式码
if __name__ == "__main__":
    neural_network = NeuralNetwork()
    print ('训练开始时随机权重')
    print (neural_network.weight_matrix)
    train_inputs = array([[0, 0, 1], [1, 1, 1], [1, 0, 1], [0, 1, 1]])
    train_outputs = array([[0, 1, 1, 0]]).T
    neural_network.train(train_inputs, train_outputs, 10000)
    print ('训练后的新权重')
    print (neural_network.weight_matrix)
    # 在新情况下测试神经网络.
    print ("在新示例上测试网络 ->")
    print (neural_network.forward_propagation(array([1, 0, 0])))

输出:

训练开始时随机权重
[[-0.16595599]
 [ 0.44064899]
 [-0.99977125]]
训练后的新权重
[[5.39428067]
 [0.19482422]
 [0.34317086]]
在新示例上测试网络 ->
[0.99995873]