Функция потери не улучшается - PullRequest
0 голосов
/ 05 февраля 2020

Я делал классификатор, используя набор данных mnist, следуя онлайн-учебнику. Однако после тренировки данных моя функция потерь и точность не меняются с каждой эпохой. Тем не менее, я не получаю сообщение об ошибке. Может кто-нибудь, пожалуйста, помогите мне с тем, что я делаю неправильно? Для справки, моя IDE - это Jupyter Notebook, и я использую Windows 10.

Код:

from PIL import Image
import os
import numpy as np
from keras.layers import Conv2D, MaxPooling2D, Flatten,Dense
from keras.models import Sequential
from keras.datasets import mnist
from keras.utils import to_categorical

import matplotlib.pyplot as plt
%matplotlib inline

(x_train, y_train),(x_test, y_test) = mnist.load_data()

image_height, image_width = 28, 28
x_train = x_train.reshape(60000, image_height*image_width)
x_test = x_test.reshape(10000, image_height*image_width)

y_train = to_categorical(y_train, 10)
y_test = to_categorical(y_test, 10)

model = Sequential()
model.add(Dense(512, activation = 'relu', input_shape = (784, )))
model.add(Dense(512, activation = 'relu'))
model.add(Dense(10, activation = 'softmax'))
model.compile(optimizer = 'adam', loss = 'categorical_crossentropy', metrics = ['accuracy'])
model.summary()

history = model.fit(x_train, y_train, epochs = 10, validation_data=(x_test, y_test))

Вывод:

WARNING:tensorflow:From C:\Users\akash\Anaconda3\lib\site-packages\tensorflow_core\python\ops\math_grad.py:1424: where (from tensorflow.python.ops.array_ops) is deprecated and will be removed in a future version.
Instructions for updating:
Use tf.where in 2.0, which has the same broadcast rule as np.where
WARNING:tensorflow:From C:\Users\akash\Anaconda3\lib\site-packages\keras\backend\tensorflow_backend.py:986: The name tf.assign_add is deprecated. Please use tf.compat.v1.assign_add instead.

WARNING:tensorflow:From C:\Users\akash\Anaconda3\lib\site-packages\keras\backend\tensorflow_backend.py:973: The name tf.assign is deprecated. Please use tf.compat.v1.assign instead.

WARNING:tensorflow:From C:\Users\akash\Anaconda3\lib\site-packages\keras\backend\tensorflow_backend.py:2741: The name tf.Session is deprecated. Please use tf.compat.v1.Session instead.

Train on 60000 samples, validate on 10000 samples
Epoch 1/10
WARNING:tensorflow:From C:\Users\akash\Anaconda3\lib\site-packages\keras\backend\tensorflow_backend.py:174: The name tf.get_default_session is deprecated. Please use tf.compat.v1.get_default_session instead.

WARNING:tensorflow:From C:\Users\akash\Anaconda3\lib\site-packages\keras\backend\tensorflow_backend.py:181: The name tf.ConfigProto is deprecated. Please use tf.compat.v1.ConfigProto instead.

WARNING:tensorflow:From C:\Users\akash\Anaconda3\lib\site-packages\keras\backend\tensorflow_backend.py:190: The name tf.global_variables is deprecated. Please use tf.compat.v1.global_variables instead.

WARNING:tensorflow:From C:\Users\akash\Anaconda3\lib\site-packages\keras\backend\tensorflow_backend.py:199: The name tf.is_variable_initialized is deprecated. Please use tf.compat.v1.is_variable_initialized instead.

WARNING:tensorflow:From C:\Users\akash\Anaconda3\lib\site-packages\keras\backend\tensorflow_backend.py:206: The name tf.variables_initializer is deprecated. Please use tf.compat.v1.variables_initializer instead.

60000/60000 [==============================] - 13s 222us/step - loss: 14.4960 - acc: 0.1006 - val_loss: 14.4918 - val_acc: 0.1009
Epoch 2/10
60000/60000 [==============================] - 15s 246us/step - loss: 14.5200 - acc: 0.0992 - val_loss: 14.4918 - val_acc: 0.1009
Epoch 3/10
60000/60000 [==============================] - 15s 248us/step - loss: 14.5200 - acc: 0.0992 - val_loss: 14.4918 - val_acc: 0.1009
Epoch 4/10
60000/60000 [==============================] - 14s 226us/step - loss: 14.5200 - acc: 0.0992 - val_loss: 14.4918 - val_acc: 0.1009
Epoch 5/10
60000/60000 [==============================] - 14s 238us/step - loss: 14.5200 - acc: 0.0992 - val_loss: 14.4918 - val_acc: 0.1009
Epoch 6/10
60000/60000 [==============================] - 15s 250us/step - loss: 14.5200 - acc: 0.0992 - val_loss: 14.4918 - val_acc: 0.1009
Epoch 7/10
60000/60000 [==============================] - 14s 236us/step - loss: 14.5200 - acc: 0.0992 - val_loss: 14.4918 - val_acc: 0.1009
Epoch 8/10
60000/60000 [==============================] - 13s 214us/step - loss: 14.5200 - acc: 0.0992 - val_loss: 14.4918 - val_acc: 0.1009
Epoch 9/10
60000/60000 [==============================] - 14s 235us/step - loss: 14.5200 - acc: 0.0992 - val_loss: 14.4918 - val_acc: 0.1009
Epoch 10/10
60000/60000 [==============================] - 15s 251us/step - loss: 14.5200 - acc: 0.0992 - val_loss: 14.4918 - val_acc: 0.1009

1 Ответ

0 голосов
/ 05 февраля 2020

Вы просто выбрали субоптимальные гиперпараметры. Попробуйте еще раз с 2 или 1 слоем из 128 скрытых нейронов, и поскольку классы являются взаимоисключающими, вы должны использовать sparse_categorical_crossentropy.

Кроме того, выровненный слой может изменить вашу форму. Функция подгонки принимает параметр разделения проверки. Просто передайте разделение валидации 0,2 в функцию подбора, вместо того, чтобы неправильно использовать тестовые данные в качестве набора валидации.

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

import tensorflow as tf

mnist = tf.keras.datasets.mnist

(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0

model = tf.keras.models.Sequential([
  tf.keras.layers.Flatten(input_shape=(28, 28)),
  tf.keras.layers.Dense(128, activation='relu'),
  tf.keras.layers.Dropout(0.2),
  tf.keras.layers.Dense(10, activation='softmax')
])


model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

es = tf.keras.callbacks.EarlyStopping(monitor='val_loss',
                              min_delta=0.01,
                              patience=10,
                              verbose=2, mode='min')

model.fit(x_train, y_train, epochs=100, validation_split=0.1, callbacks=[es])

model.evaluate(x_test,  y_test, verbose=2)


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