Точность обучения нейронной сети остается неизменной. - PullRequest
0 голосов
/ 04 августа 2020

Когда я запускал модель тензорного потока на python, точность моей модели не могла быть улучшена обучением. Даже если я изменил свои тренировочные данные на вполне обычные, модель все равно не сработала. В чем проблема?

Код:

train_x = np.array([1] * 1000 + [2] * 1000 + [3] * 1000)
train_y = np.zeros((3000, 3))
train_y[:1000,0] = 1
train_y[1000:2000,1] = 1
train_y[2000:3000,2] = 1
val_x = train_x
val_y = train_y

model = tf.keras.Sequential()
model.add(layers.Dense(3, activation='relu'))
model.add(layers.Dense(3, activation='relu'))
model.compile(optimizer=tf.keras.optimizers.Adam(0.1),
             loss=tf.keras.losses.categorical_crossentropy,
             metrics=[tf.keras.metrics.categorical_accuracy])

model.fit(train_x, train_y, epochs = 10, batch_size = 32, verbose = 1,
          shuffle = False,
          validation_data=(val_x, val_y))

И результат тренировки

Epoch 1/10
94/94 [==============================] - 0s 2ms/step - loss: 10.7836 - categorical_accuracy: 0.3120 - val_loss: 10.7454 - val_categorical_accuracy: 0.3333

Epoch 2/10
94/94 [==============================] - 0s 1ms/step - loss: 10.7454 - categorical_accuracy: 0.3333 - val_loss: 10.7454 - val_categorical_accuracy: 0.3333

Epoch 3/10
94/94 [==============================] - 0s 1ms/step - loss: 10.7454 - categorical_accuracy: 0.3333 - val_loss: 10.7454 - val_categorical_accuracy: 0.3333

Epoch 4/10
94/94 [==============================] - 0s 1ms/step - loss: 10.7454 - categorical_accuracy: 0.3333 - val_loss: 10.7454 - val_categorical_accuracy: 0.3333

Epoch 5/10
94/94 [==============================] - 0s 2ms/step - loss: 10.7454 - categorical_accuracy: 0.3333 - val_loss: 10.7454 - val_categorical_accuracy: 0.3333

Итак, где мне нужно отрегулировать, чтобы получить лучшую производительность, и что я сделал не так ?

1 Ответ

1 голос
/ 04 августа 2020
  1. Проблема в том, что с 3 входными нейронами и 1 функцией (т. Е. 1 столбец) нейронная сеть не имеет достаточного количества комбинаций if... then для изучения паттерна, которому вы пытаетесь ее научить. Если вы быстро закодируете свой ввод, он эффективно научится умножать каждый входной столбец на один и даст правильный ответ.
  2. У вас неправильная функция активации. Для задач с несколькими классами используйте 'softmax'.
  3. Скорость обучения вашего оптимизатора слишком высока, поэтому шаг слишком велик и перепрыгивает через функцию стоимости. Используйте не более 0.01.

Полнофункциональный пример:

import numpy as np
import tensorflow as tf

train_x = np.array([1] * 1000 + [2] * 1000 + [3] * 1000)
train_x = tf.keras.utils.to_categorical(train_x - 1)
train_y = np.zeros((3000, 3))
train_y[:1000,0] = 1
train_y[1000:2000,1] = 1
train_y[2000:3000,2] = 1
val_x = train_x
val_y = train_y

model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(3, activation='relu'))
model.add(tf.keras.layers.Dense(3, activation='softmax'))
model.compile(optimizer=tf.keras.optimizers.Adam(0.01),
             loss=tf.keras.losses.categorical_crossentropy,
             metrics=[tf.keras.metrics.categorical_accuracy])

model.fit(train_x, train_y, epochs = 10, batch_size = 32, verbose = 1,
          shuffle = False,
          validation_data=(val_x, val_y))
Epoch 9/10
  32/3000 [..............................] - ETA: 0s - loss: 0.0067 - cat_acc: 1.0000
 608/3000 [=====>........................] - ETA: 0s - loss: 0.0063 - cat_acc: 1.0000
1184/3000 [==========>...................] - ETA: 0s - loss: 0.0244 - cat_acc: 1.0000
1760/3000 [================>.............] - ETA: 0s - loss: 0.0553 - cat_acc: 1.0000
2272/3000 [=====================>........] - ETA: 0s - loss: 0.0550 - cat_acc: 1.0000
2848/3000 [===========================>..] - ETA: 0s - loss: 0.0447 - cat_acc: 1.0000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...