Какая потеря между обучением и тестированием может быть терпимой - PullRequest
0 голосов
/ 14 июля 2020

Я обучаю модель, которая классифицирует 3 класса. У меня 120 изображений только на класс, а всего 3 класса. Я обучил модель, но разница между точностью обучения и тестирования велика. Что он указывает, находится ли модель в переобучении или что-то еще.

Разница между точностью данных поезда и теста различается. Итак, теперь я получил:

  • Оценка модели на данных поезда [0,29664946870370346, 0,91636366]
  • Оценка модели на тестовых данных [0,4278888224678881, 0,8088235]

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

Я разделяю 120 изображений в поезд и тест. 100 для поезда и 20 для теста. Достаточно?

import time
import numpy as np
import tensorflow as tf
from tensorflow.keras.callbacks import TensorBoard
from sklearn.model_selection import cross_val_score
from keras.wrappers.scikit_learn import KerasClassifier
data = np.load('E:\Python Telusko\OpenCv\desc_feat.npy', allow_pickle=True)
from sklearn.model_selection import train_test_split

NAME="ITA MLP-{}".format(int(time.time()))
tensorboard=TensorBoard(log_dir="E:\\ITA MLP\\logs\\{}".format(NAME))

training_data = np.asarray([i[0] for i in data])  
train_labels = data[:, -1]  
print("Shape of training data", training_data.shape)
print("Labels of training data", train_labels.shape)

data = training_data.astype('float32')
data = data / 255
from tensorflow.keras import utils as np_utils
from sklearn.model_selection import KFold

one_hot_train_labels = np_utils.to_categorical(train_labels)

def create_model():
    model = tf.keras.models.Sequential()
    model.add(tf.keras.layers.Dense(64, input_shape=(128,) , activation = 'relu'))
    model.add(tf.keras.layers.Dense(3, activation = 'softmax')) 
    model.compile(loss = 'categorical_crossentropy' , optimizer = 'adam' , metrics = ['accuracy'] ) 
    return model

n_split=5
 
for train_index,test_index in KFold(n_split).split(data):
    x_train,x_test=data[train_index],data[test_index]
    y_train,y_test=one_hot_train_labels[train_index],one_hot_train_labels[test_index]
    model=create_model()
    model.fit(x_train, y_train,epochs=30,batch_size=32,callbacks=[tensorboard])
    print('Model evaluation on train data ',model.evaluate(x_train,y_train))
    print('Model evaluation on test data',model.evaluate(x_test,y_test))


model.save('SuperClassPredictions1.model')

1 Ответ

0 голосов
/ 15 июля 2020

Я бы посоветовал вам расширить набор данных. Обучение нейронной сети с использованием 100 изображений вызывает проблемы с переобучением. Нейронные сети всегда требуют огромных данных.

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

2. Для идеального вопроса о потерях нет конкретных c показателей. Вы настраиваете свою модель в зависимости от потери обучения и проверки

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