MNIST рукописная цифра - PullRequest
0 голосов
/ 15 января 2019

Я пытался сделать скрипт на 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 и weight.

1 Ответ

0 голосов
/ 15 января 2019

благодаря @ 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%

...