【问题标题】:Unknown bug in neural network. Is the because matrices are not commutative?神经网络中的未知错误。因为矩阵不是可交换的吗?
【发布时间】:2017-04-30 11:58:54
【问题描述】:

我的第一个神经网络出现问题。我根本找不到错误的根源。

问题

阅读了 Tariq Rashid 的书 "Make your own neural network",我尝试使用 NN 来实现手写识别,它可以对图像进行分类并确定写下从 0 到 9 的哪个数字。

在训练 NN 后,测试表明每个字母都有约 99% 的匹配,这显然是错误的。

怀疑

在本书中,作者对 NN 矩阵的处理与我相比有所不同。例如,他将输入隐藏层的权重与输入相乘,而我则通过将输入与输入隐藏的权重相乘来实现这一点。

这是我在查询 NN(前馈)时进行矩阵乘法的方式的说明:

我知道矩阵不具有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。我使用的是从本书作者网页The MNIST Dataset of Handwitten Digits下载的CSV版本。

这是我目前用于训练和测试的代码:

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)

【问题讨论】:

    标签: python matrix machine-learning neural-network


    【解决方案1】:

    这是那些捂脸的时刻之一。神经网络一直在按预期工作。事实是,我现在注意到我忽略了测试结果并错误地读取了以科学计数法书写的数字

    根据来自 MNIST 数据库的 10000 个测试数据进行测量,此 NN 的准确度为 94.01%。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-25
      • 1970-01-01
      • 2017-02-19
      • 2023-01-27
      • 2015-05-01
      • 1970-01-01
      • 2023-03-24
      相关资源
      最近更新 更多