gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 09:35:36 24 4
gpt4 key购买 nike

我的第一个神经网络遇到了麻烦。我根本找不到错误的根源。

问题

阅读本书"Make your own neural network"作者:Tariq Rashid 我尝试使用神经网络实现手写识别,它可以对图像进行分类并确定写下 0 到 9 中的哪个数字。

训练神经网络后,测试显示每个字母的匹配度约为 99%,这显然是错误的。

怀疑

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

以下是我在查询 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 。我使用了从书籍作者网页 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)

最佳答案

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

enter image description here

根据 MNIST 数据库的 10000 个测试数据进行测量,该神经网络的准确度为 94.01%。

关于python - 神经网络中的未知错误。是因为矩阵不可交换吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43701542/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com