Форум программистов, компьютерный форум, киберфорум
Python: ИИ, нейросети, ML, агенты
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 27.12.2018
Сообщений: 3

Не работает программа по распознаванию цифр (машинное обучение, numpy)

03.10.2019, 00:14. Показов 1423. Ответов 0

Студворк — интернет-сервис помощи студентам
Всем привет. Я только начал изучать машинное обучение, и успешно написал однослойную нейросеть для распознавания цифр. Захотел обобщить программу на n слоев, но уже на втором увяз -- ничего не работает. Если быть точным, то обобщенная программа корректно отрабатывает на частном случае, когда слой 1 (примерно 80% распознавания выдает) и абсолютно не работает на 2+ слоях. Я совершенно замучался искать ошибку, мне все время кажется, что нужно просто поправить коэффиценты/первичное присваивание весов и все начнет работать, но это не помогает (первичное присваивание весов делал и рандомом, и например 0.1 присваивал). По крайней мере у меня не получилось.

Для обучения и последующей проверки использую данные MNIST с этого сайта: http://yann.lecun.com/exdb/mnist/

Заранее огромное спасибо, всем, кто хоть что-то сможет подсказать по этому поводу.

Первый файл: хелпер, который я сам написал для себя. Тут нет машинного обучения, просто вспомогательные функции:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
import numpy as np
 
 
def parse_labels(filename):
    with open(filename, 'rb') as f:
        text = f.read()
        barr = bytearray(text)
        array = []
        for byte in barr[8:]:
            array.append(byte)
        return np.array(array)
 
 
# Возвращает матрицу картинок
# Картинка это одномерный список, с которым при этом работать нужно как с двумерным
def parse_img(filename, num_of_imgs):
    with open(filename, 'rb') as f:
        text = f.read()
        barr = bytearray(text)[16:]
        array = []
        for z in range(num_of_imgs):
            array.append([])
            for i in range(28):
                for k in range(28):
                    array[z].append(barr[784 * z + i * 28 + k])
        return np.array(array)
 
 
def write_weigth_to_file(filename, weight):
    with open(filename, 'w') as f:
        weight = list(weight)
        for i in range(len(weight)):
            weight[i] = list(weight[i])
            for k in range(len(weight[i])):
                weight[i][k] = str(weight[i][k])
        print(weight)
        weight = [' '.join(w) for w in weight]
        weight = '\n'.join(weight)
        f.write(weight)
 
 
def get_weight(filename, r1, r2):
    if filename is not None:
        with open(filename, 'r') as f:
            text = f.read()
            text = text.split('\n')
            weights = [i.split() for i in text]
 
        for i in range(len(weights)):
            for k in range(len(weights[i])):
                weights[i][k] = float(weights[i][k])
 
        return np.array(weights)
    else:
        # Это плохо, но нам нужны детерменированные веса!
        return np.array([[0.0 for i in range(r2)] for k in range(r1)])
        # Тут надо настроить чтобы рандомились небольшие числа. Иначе корректировки просто их не могут победить
        # return np.random.random((r1, r2))
Класс, описывающий само обучение и соответственно предсказание результата:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
import numpy as np
from skimage.io import imread, imsave
from helper import parse_img, parse_labels, write_weigth_to_file, get_weight
 
 
class Neuro2:
 
    # Количество слоев равно количеству имен файлов
    # weights_from_file -- булева переменная, отвечающая за то берем ли мы веса из файла
    # shapes -- кортежи содержащие в себе размерности матриц весов (список кортежей)
    def __init__(self, filenames, weights_from_file, shapes):
        self.filenames = filenames
        self.shapes = shapes
        self.weights = []
        self.get_weights(weights_from_file)
 
    def get_weights(self, from_file):
        if from_file:
            for i, filename in enumerate(self.filenames):
                self.weights.append(get_weight(filename, self.shapes[i][0], self.shapes[i][1]))
        else:
            for i in range(len(self.filenames)):
                self.weights.append(get_weight(None, self.shapes[i][0], self.shapes[i][1]))
 
    def write_weights_to_file(self):
        for i in range(len(self.filenames)):
            write_weigth_to_file(self.filenames[i], self.weights[i])
 
    def learn(self, iterations):
        # Получам пикчи и ожидаемые результаты
        array_imgs = parse_img('train-images-idx3-ubyte', 60000)
        expected = parse_labels('train-labels-idx1-ubyte')
        for something in range(iterations):
            for index, img in enumerate(array_imgs):
                exp = np.array([0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0])
                exp[expected[index]] += 1
                alpha = 0.0000000001
                layers = [np.array(img)]
                for i in range(len(self.weights)):
                    layers.append(np.array(layers[i].dot(self.weights[i])))
                layers = np.array(layers)
                final_res = layers[len(layers) - 1]
                deltas = [(np.array(final_res - exp))]
                # У нас должно в итоге быть 2 дельты. На 0 вес умножать не нужно. Поэтому -1
                for i in range(len(self.weights) - 1):
                    deltas.append(np.array(deltas[i].dot(self.weights[len(self.weights) - 1 - i].T)))
                deltas = np.array(deltas)
                for i in range(len(deltas) // 2):
                    deltas[i], deltas[len(deltas) - 1 - i] = deltas[len(deltas) - 1 - i], deltas[i]
                for i in range(len(self.weights)):
                    self.weights[i] -= alpha * np.matrix(layers[i]).T.dot(np.matrix(deltas[i]))
            print('Итерация номер %s' % something)
            self.write_weights_to_file()
 
    def predict(self, img):
        result = img.dot(self.weights[0])
        for i in range(1, len(self.weights)):
            result = result.dot(self.weights[i])
        m = result[0]
        ind = 0
        for i, res in enumerate(result):
            if res > m:
                m = res
                ind = i
        return ind, m
 
    def predict_by_mnist(self):
        array_imgs = parse_img('t10k-images-idx3-ubyte', 10000)
        expected = parse_labels('t10k-labels-idx1-ubyte')
        error = 0
        for i, img in enumerate(array_imgs):
            ind, m = self.predict(img)
            print('Число на картинке это %s. На самом деле %s' % (ind, expected[i]))
            if ind != expected[i]:
                error += 1
        print('Количество ошибок %s' % error)
        print('Всего чисел было %s' % len(expected))
 
 
# o = Neuro2(['w1.txt', 'w2.txt'], weights_from_file=False, shapes=[(28 * 28, 40), (40, 10)])
o = Neuro2(['w1.txt'], weights_from_file=False, shapes=[(28 * 28, 10)])
o.learn(1)
o.predict_by_mnist()
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.10.2019, 00:14
Ответы с готовыми решениями:

Не работает программа по распознаванию цифр (машинное обучение, numpy)
Всем привет. Я только начал изучать машинное обучение, и успешно написал однослойную нейросеть для распознавания цифр. Захотел обобщить...

Обучение десятинейронного персептрона распознаванию изображений цифр
Нужно написать программу на C#, есть лабораторная работа и реализация одного нейрона. По ходу изучения задания возникли вопросы. Сама...

Машинное обучение
Есть небольшое творческое задание Необходимо найти направление в машинном обучении, которое имеет перспективы на большой спрос ...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.10.2019, 00:14
Помогаю со студенческими работами здесь

Машинное обучение
Здравствуйте. Прочитал на Хабре несколько статей по машинному обучению и решил немного попрактиковаться в этом деле. Есть набор...

Машинное обучение
Всем привет. Мне нужно в реале научить машинку ездить по трассе, для этого сейчас у меня есть нейронка и джойстик. Я считываю показатели...

Машинное обучение
Приветствую всех Делаю проект по биометрической верификации, только начал погружаться в машинное обучение, поэтому в интернете нахватался...

Машинное обучение
Здравствуйте, помогите мне понять! Начал изучение нейронных сетей, после чего мне дали задачу - реализация прогнозной модели...

Машинное обучение
Помогите каким нибудь кодом, и объяснить на пальцах как теоретически ответить на данные вопросы Методы обучения с учителем. Загрузите...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Вывод данных через динамический список в справочнике
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru