首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MNIST手写数字

MNIST手写数字
EN

Stack Overflow用户
提问于 2019-01-15 22:18:28
回答 1查看 275关注 0票数 0

我尝试用python编写一个能够识别手写数字的脚本,使用的数据集是:http://deeplearning.net/data/mnist/mnist.pkl.gz

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

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

代码语言:javascript
复制
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的值。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-16 02:16:20

多亏了@Kevinj22 22和其他人,我终于解决了这个问题。

代码语言:javascript
复制
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%

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54200718

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档