【问题标题】:MNIST handwritten digitMNIST 手写数字
【发布时间】:2019-01-15 14:18:27
【问题描述】:

我尝试使用以下数据集在 python 中制作一个能够识别手写数字的脚本:http://deeplearning.net/data/mnist/mnist.pkl.gz

关于这个问题和我正在尝试实现的算法的更多信息可以在这个链接中找到:http://neuralnetworksanddeeplearning.com/chap1.html

我已经为每个数字使用感知器实现了一个分类算法。

import cPickle, gzip
import numpy as np

f = gzip.open('mnist.pkl.gz', 'rb')
train_set, valid_set, test_set = cPickle.load(f)
f.close()

def activation(x):
    if x > 0:
        return 1
    return 0

bias = 0.5
learningRate = 0.01

images = train_set[0]
targets = train_set[1]

weights = np.random.uniform(0,1,(10,784))
for nr in range(0,10):
    for i in range(0,49999):
        x = images[i]
        t = targets[i]
        z = np.dot(weights[nr],x) + bias
        output = activation(z)
        weights[nr] = weights[nr] + (t - output) * x * learningRate
        bias = bias + (t - output) * learningRate

images = test_set[0]
targets = test_set[1]

OK = 0

for i in range range(0, 10000):
    vec = []
    for j in range(0,10):
        vec.append(np.dot(weights[j],images[i]))
    if np.argmax(vec) == targets[i]:
        OK = OK + 1

print("The network recognized " + str(OK) +'/'+ "10000")

我通常识别10%的数字,这意味着我的算法什么都不做,和随机算法一样。

即使我知道这个问题很流行,我也可以很容易地在网上找到另一个解决方案,但我仍然要求您帮助我识别代码中的错误。

也许我错误地初始化了 learningRate、bias 和 weights 的值。

【问题讨论】:

  • 您具体要问什么?您是否要求我们检查您的代码的质量?如果是这样,您可能应该在这里询问:codereview.stackexchange.com
  • @JordanSinger 我不是要求代码的质量,我想改进这段代码的逻辑部分,我想获得更高的准确性。
  • 单个隐藏的 NN 层显然不足以进行图像分类。尝试阅读 CNN(卷积神经网络)架构...
  • 你的损失计算在哪里?通常这是通过交叉熵损失来完成的。为了做到这一点,您的网络输出必须是概率分布,即所有值都在 0 和 1 之间,并且总和为 1。您的 relu 激活不会这样做。看起来你减去(t - 输出)?你还需要通过你的激活函数做 back prop。
  • @Kevinj22 谢谢。现在我知道我的逻辑出了什么问题。我需要引入损失计算

标签: python algorithm neural-network mnist


【解决方案1】:

感谢@Kevinj22 和其他人,我终于能够解决这个问题。

import cPickle, gzip
import numpy as np

f = gzip.open('mnist.pkl.gz', 'rb')
train_set, valid_set, test_set = cPickle.load(f)
f.close()

def activation(x):
    if x > 0:
        return 1
    return 0

learningRate = 0.01

images = train_set[0]
targets = train_set[1]

weights = np.random.uniform(0,1,(10,784))

for nr in range(0,10):
    for i in range(0,50000):
        x = images[i]
        t = targets[i]
        z = np.dot(weights[nr],x)
        output = activation(z)
        if nr == t:
            target = 1
        else:
            target = 0
        adjust = np.multiply((target - output) * learningRate, x)
        weights[nr] = np.add(weights[nr], adjust)

images = test_set[0]
targets = test_set[1]

OK = 0

for i in range(0, 10000):
    vec = []
    for j in range(0,10):
        vec.append(np.dot(weights[j],images[i]))
    if np.argmax(vec) == targets[i]:
        OK = OK + 1

print("The network recognized " + str(OK) +'/'+ "10000")

这是我更新的代码。我没有在我的第一次尝试中引入损失计算。我也摆脱了偏见,因为我发现它在我的实现中没有用。

我运行这段代码 10 次,平均准确率为 88%

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-01
    • 1970-01-01
    • 2021-10-05
    • 2018-07-04
    • 2015-04-29
    • 2017-03-02
    • 2020-10-02
    • 1970-01-01
    相关资源
    最近更新 更多