РЕДАКТИРОВАНИЕ Данные обучения не правильно - PullRequest
0 голосов
/ 16 января 2020

Я изучаю глубокое обучение.

Я делаю классификатор фигуры: круг, прямоугольник, треугольник, пятиугольник, звезда. И одно горячее кодирование в label2idx = dict(rectangle=0, circle=1, pentagon=2, star=3, triangle=4)

Но все скорости обучения за эпоху одинаковы, и он не узнает об изображении.

Я создал слой с использованием функции Relu для функции активации , Affine для каждого слоя, Softmax для последнего слоя и использование Adam для оптимизации градиентов.

У меня есть всего 234 изображения RGB для изучения, которые были созданы на 2D-инструменте рисования окон и имеют размер 128 * 128, но не используют весь холст для рисования фигуры.

И картинка выглядит так: Rectangle Triangle circle

Результат поезда. left [] - это прогноз, а справа [] - метка ответа (я выбрал случайные изображения, чтобы напечатать прогнозируемое значение и метку ответа):

epoch:  0.49572649572649574
[ 0.3149641  -0.01454905 -0.23183    -0.2493432   0.11655246] [0 0 0 0 1]
epoch:  0.6837606837606838
[ 1.67341673  0.27887525 -1.09800398 -1.12649948 -0.39533065] [1 0 0 0 0]
epoch:  0.7094017094017094
[ 0.93106499  1.49599772 -0.98549052 -1.20471573 -0.24997779] [0 1 0 0 0]
epoch:  0.7905982905982906
[ 0.48447043 -0.05460748 -0.23526179 -0.22869489  0.05468969] [1 0 0 0 0]

...
epoch:  0.9230769230769231
[14.13835867  0.32432293 -5.01623202 -6.62469261 -3.21594355] [1 0 0 0 0]
epoch:  0.9529914529914529
[ 1.61248239 -0.47768294 -0.41580036 -0.71899219 -0.0901478 ] [1 0 0 0 0]
epoch:  0.9572649572649573
[ 5.93142154 -1.16719891 -1.3656573  -2.19785097 -1.31258801] [1 0 0 0 0]
epoch:  0.9700854700854701
[ 7.42198941 -0.85870225 -2.12027192 -2.81081263 -1.83810873] [1 0 0 0 0]

Я думаю, что чем больше он научится, прогнозу должно понравиться [ 0.00143 0.09357 0.352 0.3 0.253 ] [ 1 0 0 0 0 ], что означает, что индекс ответа должен быть близок к 0, но это не так. Даже точность поезда иногда достигает 1,0 (100%).

Я загружаю и нормализую изображения с помощью следующих кодов.

#data_list = data_list = glob('dataset\\training\\*\\*.jpg')
dataset['train_img'] = _load_img()

def _load_img():
    data = [np.array(Image.open(v)) for v in data_list]
    a = np.array(data)
    a = a.reshape(-1, img_size * 3)

    return a

#normalize
for v in dataset:
   dataset['train_img'] = dataset['train_img'].astype(np.float32)
   dataset['train_img'] /= dataset['train_img'].max()
   dataset['train_img'] -= dataset['train_img'].mean(axis=1).reshape(len(dataset['train_img']), 1)

РЕДАКТИРОВАТЬ

Я разрешаю изображения с серой шкалой с Image.open(v).convert('LA')

и проверкой моего значения прогноза, и это пример:

[-3.98576886e-04  3.41216374e-05] [1 0]
[ 0.00698861 -0.01111879] [1 0]
[-0.42003415  0.42222863] [0 1]

все еще не изучает изображения. Я удалил 3 цифры, чтобы проверить это, поэтому у меня есть только прямоугольник и всего 252 изображения треугольника (я нарисовал больше изображений).

И значение предсказания обычно похоже на противоположное значение (3.1323, -3.1323 или 3.1323, - 3.1303), я не могу выяснить причину.

Не только увеличение числовой точности, когда я использую SGD для оптимизатора, точность не увеличивается. Точно такая же точность.

[ 0.02090227 -0.02085848] [1 0]
epoch:  0.5873015873015873
[ 0.03058879 -0.03086193] [0 1]
epoch:  0.5873015873015873
[ 0.04006064 -0.04004988] [1 0]
[ 0.04545139 -0.04547538] [1 0]
epoch:  0.5873015873015873
[ 0.05605123 -0.05595288] [0 1]
epoch:  0.5873015873015873
[ 0.06495255 -0.06500597] [1 0]
epoch:  0.5873015873015873

1 Ответ

0 голосов
/ 16 января 2020

Да. Ваша модель работает довольно хорошо. Проблема не связана с нормализацией (даже не проблема). Модель фактически прогнозируется за пределами 0,1, что означает, что модель действительно уверена.

Модель не будет пытаться оптимизировать в сторону [1,0,0,0], потому что, когда она вычисляет потери, она будет в первую очередь обрезать значения.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...