神经网络中的未知错误。是因为矩阵是不可交换的吗?

2024-06-26 14:50:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我的第一个神经网络有问题。我根本找不到错误的根源。你知道吗

问题

在读塔里克·拉希德的书"Make your own neural network"时,我试图用神经网络实现手写识别,神经网络可以对图像进行分类,并确定从0到9的哪个数字被写下来。你知道吗

训练神经网络后的测试结果表明,每个字母都有99%的匹配率,这显然是错误的。你知道吗

怀疑

在这本书中,作者和我有点不同。例如,他将输入隐藏层权重与输入相乘,而我则通过将输入与输入隐藏权重相乘来实现。你知道吗

下面是我在查询NN(前馈)时执行矩阵乘法的示例:

Illustration

我知道矩阵不具有commutative property for dot product,但我没有注意到我在那里犯了错误。你知道吗

  1. 我是否应该采取不同的方法,即将所有矩阵转置并按不同的顺序相乘?你知道吗
  2. 输入和输出矩阵的尺寸是否有事实上的标准,即它们的形状是1×n还是n×1?你知道吗

如果这是一种错误的方法,那么它肯定表现在反向传播中,使用梯度下降进行训练。你知道吗

源代码

import numpy as np
import matplotlib.pyplot
from matplotlib.pyplot import imshow
import scipy.special as scipy
from PIL import Image

class NeuralNetwork(object):
    def __init__(self):
        self.input_neuron_count = 28*28 # One for each pixel, 28*28 = 784 in total.
        self.hidden_neuron_count = 100 # Arbitraty.
        self.output_neuron_count = 10 # One for each digit from 0 to 9.
        self.learning_rate = 0.1 # Arbitraty.

        # Sampling the weights from a normal probability distribution
        # centered around zero and with standard deviation 
        # that is related to the number of incoming links into a node,
        # 1/√(number of incoming links).
        generate_random_weight_matrix = lambda input_neuron_count, output_neuron_count: ( 
            np.random.normal(0.0,  pow(input_neuron_count, -0.5), (input_neuron_count, output_neuron_count))
        )

        self.input_x_hidden_weights = generate_random_weight_matrix(self.input_neuron_count, self.hidden_neuron_count)
        self.hidden_x_output_weights = generate_random_weight_matrix(self.hidden_neuron_count, self.output_neuron_count)

        self.activation_function = lambda value: scipy.expit(value) # Sigmoid function

    def train(self, input_array, target_array):
        inputs = np.array(input_array, ndmin=2)
        targets = np.array(target_array, ndmin=2)

        hidden_layer_input = np.dot(inputs, self.input_x_hidden_weights)
        hidden_layer_output = self.activation_function(hidden_layer_input)

        output_layer_input = np.dot(hidden_layer_output, self.hidden_x_output_weights)
        output_layer_output = self.activation_function(output_layer_input)

        output_errors = targets - output_layer_output
        self.hidden_x_output_weights += self.learning_rate * np.dot(hidden_layer_output.T, (output_errors * output_layer_output * (1 - output_layer_output)))

        hidden_errors = np.dot(output_errors, self.hidden_x_output_weights.T)
        self.input_x_hidden_weights += self.learning_rate * np.dot(inputs.T, (hidden_errors * hidden_layer_output * (1 - hidden_layer_output)))

    def query(self, input_array):
        inputs = np.array(input_array, ndmin=2)

        hidden_layer_input = np.dot(inputs, self.input_x_hidden_weights)
        hidden_layer_output = self.activation_function(hidden_layer_input)

        output_layer_input = np.dot(hidden_layer_output, self.hidden_x_output_weights)
        output_layer_output = self.activation_function(output_layer_input)

        return output_layer_output

复制(培训和测试)

培训和测试数据的原始来源是The MNIST Database。我使用的是CSV版本,我是从图书作者网页The MNIST Dataset of Handwitten Digits下载的。你知道吗

以下是我迄今为止用于培训和测试的代码:

def prepare_data(handwritten_digit_array):
    return ((handwritten_digit_array / 255.0 * 0.99) + 0.0001).flatten()

def create_target(digit_target):
    target = np.zeros(10) + 0.01
    target[digit_target] = target[digit_target] + 0.98
    return target

# Training
neural_network = NeuralNetwork()
training_data_file = open('mnist_train.csv', 'r')
training_data = training_data_file.readlines()
training_data_file.close()

for data in training_data:
    handwritten_digit_raw = data.split(',')
    handwritten_digit_array = np.asfarray(handwritten_digit_raw[1:]).reshape((28, 28))
    handwritten_digit_target = int(handwritten_digit_raw[0])
    neural_network.train(prepare_data(handwritten_digit_array), create_target(handwritten_digit_target))

# Testing
test_data_file = open('mnist_test_10.csv', 'r')
test_data = test_data_file.readlines()
test_data_file.close()

for data in test_data:
    handwritten_digit_raw = data.split(',')
    handwritten_digit_array = np.asfarray(handwritten_digit_raw[1:]).reshape((28, 28))
    handwritten_digit_target = int(handwritten_digit_raw[0])
    output = neural_network.query(handwritten_digit_array.flatten())
    print('target', handwritten_digit_target)
    print('output', output)

Tags: selflayertargetinputoutputdatacountnp
1条回答
网友
1楼 · 发布于 2024-06-26 14:50:32

这是一个脸掌时刻。神经网络一直在按预期工作。事实上,我现在注意到我忽略了测试结果,错误地阅读了用科学记数法写的数字。你知道吗

enter image description here

在MNIST数据库的10000个测试数据上进行了测试,该神经网络的准确率为94.01%。你知道吗

相关问题 更多 >