- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在构建一个神经网络来学习识别 MNIST 中的手写数字。我已经确认反向传播可以完美地计算梯度(梯度检查给出错误 < 10 ^ -10)。
看来,无论我如何训练权重,成本函数总是趋向于 3.24-3.25 左右(永远不会低于该值,只是从上方接近),并且训练/测试集的准确度非常低(对于测试集)。看来最终的 h 值都非常接近 0.1 并且彼此非常接近。
我不知道为什么我的程序不能产生更好的结果。我想知道是否有人可以看一下我的代码,并请告诉我发生这种情况的任何原因。非常感谢您的帮助,我真的很感激!
这是我的 Python 代码:
import numpy as np
import math
from tensorflow.examples.tutorials.mnist import input_data
# Neural network has four layers
# The input layer has 784 nodes
# The two hidden layers each have 5 nodes
# The output layer has 10 nodes
num_layer = 4
num_node = [784,5,5,10]
num_output_node = 10
# 30000 training sets are used
# 10000 test sets are used
# Can be adjusted
Ntrain = 30000
Ntest = 10000
# Sigmoid Function
def g(X):
return 1/(1 + np.exp(-X))
# Forwardpropagation
def h(W,X):
a = X
for l in range(num_layer - 1):
a = np.insert(a,0,1)
z = np.dot(a,W[l])
a = g(z)
return a
# Cost Function
def J(y, W, X, Lambda):
cost = 0
for i in range(Ntrain):
H = h(W,X[i])
for k in range(num_output_node):
cost = cost + y[i][k] * math.log(H[k]) + (1-y[i][k]) * math.log(1-H[k])
regularization = 0
for l in range(num_layer - 1):
for i in range(num_node[l]):
for j in range(num_node[l+1]):
regularization = regularization + W[l][i+1][j] ** 2
return (-1/Ntrain * cost + Lambda / (2*Ntrain) * regularization)
# Backpropagation - confirmed to be correct
# Algorithm based on https://www.coursera.org/learn/machine-learning/lecture/1z9WW/backpropagation-algorithm
# Returns D, the value of the gradient
def BackPropagation(y, W, X, Lambda):
delta = np.empty(num_layer-1, dtype = object)
for l in range(num_layer - 1):
delta[l] = np.zeros((num_node[l]+1,num_node[l+1]))
for i in range(Ntrain):
A = np.empty(num_layer-1, dtype = object)
a = X[i]
for l in range(num_layer - 1):
A[l] = a
a = np.insert(a,0,1)
z = np.dot(a,W[l])
a = g(z)
diff = a - y[i]
delta[num_layer-2] = delta[num_layer-2] + np.outer(np.insert(A[num_layer-2],0,1),diff)
for l in range(num_layer-2):
index = num_layer-2-l
diff = np.multiply(np.dot(np.array([W[index][k+1] for k in range(num_node[index])]), diff), np.multiply(A[index], 1-A[index]))
delta[index-1] = delta[index-1] + np.outer(np.insert(A[index-1],0,1),diff)
D = np.empty(num_layer-1, dtype = object)
for l in range(num_layer - 1):
D[l] = np.zeros((num_node[l]+1,num_node[l+1]))
for l in range(num_layer-1):
for i in range(num_node[l]+1):
if i == 0:
for j in range(num_node[l+1]):
D[l][i][j] = 1/Ntrain * delta[l][i][j]
else:
for j in range(num_node[l+1]):
D[l][i][j] = 1/Ntrain * (delta[l][i][j] + Lambda * W[l][i][j])
return D
# Neural network - this is where the learning/adjusting of weights occur
# W is the weights
# learn is the learning rate
# iterations is the number of iterations we pass over the training set
# Lambda is the regularization parameter
def NeuralNetwork(y, X, learn, iterations, Lambda):
W = np.empty(num_layer-1, dtype = object)
for l in range(num_layer - 1):
W[l] = np.random.rand(num_node[l]+1,num_node[l+1])/100
for k in range(iterations):
print(J(y, W, X, Lambda))
D = BackPropagation(y, W, X, Lambda)
for l in range(num_layer-1):
W[l] = W[l] - learn * D[l]
print(J(y, W, X, Lambda))
return W
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
# Training data, read from MNIST
inputpix = []
output = []
for i in range(Ntrain):
inputpix.append(2 * np.array(mnist.train.images[i]) - 1)
output.append(np.array(mnist.train.labels[i]))
np.savetxt('input.txt', inputpix, delimiter=' ')
np.savetxt('output.txt', output, delimiter=' ')
# Train the weights
finalweights = NeuralNetwork(output, inputpix, 2, 5, 1)
# Test data
inputtestpix = []
outputtest = []
for i in range(Ntest):
inputtestpix.append(2 * np.array(mnist.test.images[i]) - 1)
outputtest.append(np.array(mnist.test.labels[i]))
np.savetxt('inputtest.txt', inputtestpix, delimiter=' ')
np.savetxt('outputtest.txt', outputtest, delimiter=' ')
# Determine the accuracy of the training data
count = 0
for i in range(Ntrain):
H = h(finalweights,inputpix[i])
print(H)
for j in range(num_output_node):
if H[j] == np.amax(H) and output[i][j] == 1:
count = count + 1
print(count/Ntrain)
# Determine the accuracy of the test data
count = 0
for i in range(Ntest):
H = h(finalweights,inputtestpix[i])
print(H)
for j in range(num_output_node):
if H[j] == np.amax(H) and outputtest[i][j] == 1:
count = count + 1
print(count/Ntest)
最佳答案
你的网络很小,5 个神经元使它基本上是一个线性模型。将其增加到每层 256 个。
请注意,这个简单的线性模型有 768 * 10 + 10(偏差)参数,总计 7690 个 float 。另一方面,你的神经网络有 768 * 5 + 5 + 5 * 5 + 5 + 5 * 10 + 10 = 3845 + 30 + 60 = 3935。换句话说,尽管是非线性神经网络,但它实际上是一个比一个简单的逻辑回归应用于这个问题。逻辑回归本身会产生大约 11% 的误差,因此你不能真正指望能打败它。当然,这不是一个严格的论据,但应该让您对为什么它不起作用有一些直觉。
第二个问题与其他超参数有关,您似乎正在使用:
关于machine-learning - 神经网络 MNIST : Backpropagation is correct, 但训练/测试精度非常低,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45447740/
我正在尝试使用反向传播实现两层感知器来解决奇偶校验问题。该网络有 4 个二进制输入,第一层有 4 个隐藏单元,第二层有 1 个输出。我正在使用 this供引用,但在收敛方面有问题。 首先,我会注意到我
我正在创建一个工具,用于根据过去的数据预测软件项目的时间和成本。该工具使用神经网络来做到这一点,到目前为止,结果很有希望,但我认为我可以通过改变网络的属性来做更多的优化。当涉及到这些设置时,似乎没有任
我已经实现了如本视频中所述的反向传播。 https://class.coursera.org/ml-005/lecture/51 这似乎已经成功完成,通过了梯度检查,并允许我训练MNIST数字。 但是
假设我想拥有通用的神经网络架构: ---> BinaryOutput_A / Input --> nnLayer -
出于学术目的,我正在尝试使用递归实现反向传播,但似乎我在某处出错了。已经修改它一段时间了,但要么根本没有学习到第二种模式,要么没有学习到第二种模式。 请让我知道哪里出错了。 (这是 javascrip
我正在编写一个带有单个输出单元(二进制分类)的简单 MLP 实现。我需要它用于教学目的,所以我不能使用现有的实现:( 我设法创建了一个工作虚拟模型并实现了训练功能,但 MLP 没有收敛。事实上,输出单
我在通过神经网络进行机器学习的一些概念上遇到了困难。其中之一是backpropagation 。权重更新方程中, delta_w = a*(t - y)*g'(h)*x t 是“目标输出”,在监督学习
我必须为学校项目创建一个 OCR 程序,因此我开始在维基百科的帮助下创建一个反向传播算法。为了训练我的网络,我使用了几天前提取的 MNIST 数据库,这样我就有了真实的图像文件。但现在误差始终约为 2
我正在尝试用 Java 实现前馈神经网络。我创建了三个类 NNeuron、NLayer 和 NNetwork。 “简单”的计算似乎很好(我得到了正确的总和/激活/输出),但在训练过程中,我似乎没有得到
我正在搞乱 Accord.NET 中的不同深度学习算法。我决定用我手边的光谱数据来做这件事。我使用 Accord 的统计工具箱对数据进行 PCA 转换,使其减少到 10 个数据点。然后严格按照教程进行
我正在构建一个神经网络来学习识别 MNIST 中的手写数字。我已经确认反向传播可以完美地计算梯度(梯度检查给出错误 < 10 ^ -10)。 看来,无论我如何训练权重,成本函数总是趋向于 3.24-3
这个问题与Neuroph有关Java 库。 我有以下程序创建一个多层感知器,其中包含一个包含 20 个节点的隐藏层。正在学习的函数是 x^2。使用反向传播学习规则。但是,从输出中可以明显看出,该程序似
作为项目的一部分,我在使用tensorflow_probability处理正态分布的梯度时遇到问题。为此,我创建了一个正态分布并从中抽取了样本。然后,该样本的 log_prob 将被输入优化器以更新网
我是一名优秀的程序员,十分优秀!