python - 神经网络在第一次迭代后表现奇怪
问题描述
我是神经网络领域的新手,刚刚使用手写数字 MNIST 数据集浏览了我的第一个实际工作样本。我编写了一个代码,据我所知应该可以工作(至少在某种程度上),但我无法弄清楚是什么让它在阅读了第一个训练样本后就卡住了。我的代码如下:
from keras.datasets import mnist
import numpy as np
def relu(x):
return (x > 0) * x
def relu_deriv(x):
return x > 0
(x_train, y_train), (x_test, y_test) = mnist.load_data();
images = x_train[0:1000].reshape(1000, 28*28)
labels = y_train[0:1000]
test_images = x_test[0:1000].reshape(1000, 28*28)
test_labels = y_test[0:1000]
# converting the labels to a matrix
one_hot_labels = np.zeros((len(labels),10))
for i,j in enumerate(labels):
one_hot_labels[i][j] = 1
labels = one_hot_labels
alpha = 0.005
hidden_size = 5 # size of the hidden layer
# initial weight matrixes
w1 = .2 * np.random.random(size=[784, hidden_size]) - .1
w2 = .2 * np.random.random(size=[hidden_size, 10]) - .1
for iteration in range(1000):
error = 0
for i in range(len(images)):
layer_0 = images[i:i+1]
layer_1 = relu(np.dot(layer_0, w1))
layer_2 = np.dot(layer_1, w2)
delta_2 = (labels[i:i+1] - layer_2)
error += np.sum((delta_2) ** 2)
delta_1 = delta_2.dot(w2.T) * relu_deriv(layer_1)
w2 += alpha * np.dot(layer_1.T, delta_2)
w1 += alpha * np.dot(layer_0.T, delta_1)
print("error: {0}".format(error))
发生的情况是,在第一次迭代中显然有一个很大的错误,之后它被纠正为 1000,但是无论再迭代多少次,它都会永远卡在这个错误上。
解决方案
您尚未标准化图像数据。图像数据的值范围从 0 到 255。由于这些值很大,权重的更新变得很大,导致第一次迭代后权重非常大。您可以按如下方式标准化图像数据。
images = x_train[0:1000].reshape(1000, 28*28)
images = images / 255
labels = y_train[0:1000]
test_images = x_test[0:1000].reshape(1000, 28*28)
test_images = test_images / 255
test_labels = y_test[0:1000]
推荐阅读
- windows - 由于路径无效而无法签出新分支?
- oracle - Oracle Reports Builder 12 多页报表
- java - gRPC 连接循环
- node.js - 电子邮件仅在 Node.js 中无法在 Live 中工作
- javascript - 我的 JS 表单验证和验证不起作用
- precision - 在 KQL 中以 2 的精度表示十进制?
- python - 频率大于1的Python常用词表
- fortran - Fortran 科学记数法 1d0 与 1.d0
- docker - 如何为子图像添加从基础 docker 图像覆盖 arg 的能力?
- python - Matplotlib:如何仅对散点图中的指定点进行动画处理?