В настоящее время я работаю над небольшим проектом двоичной классификации, использующим новый API-интерфейс keras в tenorflow.Проблема заключается в упрощенной версии проблемы Хиггса Бозона, опубликованной на Kaggle.com несколько лет назад.Форма набора данных - 2000x14, где первые 13 элементов каждой строки образуют входной вектор, а 14-й элемент - соответствующую метку.Вот пример указанного набора данных:
86.043,52.881,61.231,95.475,0.273,77.169,-0.015,1.856,32.636,202.068, 2.432,-0.419,0.0,0
138.149,69.197,58.607,129.848,0.941,120.276,3.811,1.886,71.435,384.916,2.447,1.408,0.0,1
137.457,3.018,74.670,81.705,5.954,775.772,-8.854,2.625,1.942,157.231,1.193,0.873,0.824,1
Я относительно новичок в машинном обучении и тензорном потоке, но мне знакомы понятия более высокого уровня, такие как функции потерь, оптимизаторы и функции активации.Я пробовал создавать различные модели, вдохновленные примерами проблем с двоичной классификацией, найденными в Интернете, но у меня возникают трудности с обучением модели.Во время обучения потеря некоторых предметов увеличивается в течение одной и той же эпохи, что приводит к нестабильному обучению.Точность достигает плато около 70%.Я пытался изменить скорость обучения и другие гиперпараметры, но безрезультатно.Для сравнения, я жестко закодировал полностью подключенную нейронную сеть с прямой связью, которая достигает примерно 80-85% точности для той же проблемы.
Вот моя текущая модель:
import tensorflow as tf
from tensorflow.python.keras.layers.core import Dense
import numpy as np
import pandas as pd
def normalize(array):
return array/np.linalg.norm(array, ord=2, axis=1, keepdims=True)
x_train = pd.read_csv('data/labeled.csv', sep='\s+').iloc[:1800, :-1].values
y_train = pd.read_csv('data/labeled.csv', sep='\s+').iloc[:1800, -1:].values
x_test = pd.read_csv('data/labeled.csv', sep='\s+').iloc[1800:, :-1].values
y_test = pd.read_csv('data/labeled.csv', sep='\s+').iloc[1800:, -1:].values
x_train = normalize(x_train)
x_test = normalize(x_test)
model = tf.keras.Sequential()
model.add(Dense(9, input_dim=13, activation=tf.nn.sigmoid)
model.add(Dense(6, activation=tf.nn.sigmoid))
model.add(Dense(1, activation=tf.nn.sigmoid))
model.compile(optimizer='adam',
loss='binary_crossentropy',
metrics=['accuracy'])
model.fit(x_train, y_train, epochs=50)
model.evaluate(x_test, y_test)
Как уже упоминалосьнекоторые эпохи начинаются с более высокой точностью, чем заканчиваются, что приводит к нестабильному обучению.
32/1800 [..............................] - ETA: 0s - loss: 0.6830 - acc: 0.5938
1152/1800 [==================>...........] - ETA: 0s - loss: 0.6175 - acc: 0.6727
1800/1800 [==============================] - 0s 52us/step - loss: 0.6098 - acc: 0.6861
Epoch 54/250
32/1800 [..............................] - ETA: 0s - loss: 0.5195 - acc: 0.8125
1376/1800 [=====================>........] - ETA: 0s - loss: 0.6224 - acc: 0.6672
1800/1800 [==============================] - 0s 43us/step - loss: 0.6091 - acc: 0.6850
Epoch 55/250
Что может быть причиной этих колебаний в обучении в такой простой модели?Спасибо
РЕДАКТИРОВАТЬ:
Я последовал некоторым предложениям из комментариев и соответственно изменил модель.Теперь это выглядит примерно так:
model = tf.keras.Sequential()
model.add(Dense(250, input_dim=13, activation=tf.nn.relu))
model.add(Dropout(0.4))
model.add(Dense(200, activation=tf.nn.relu))
model.add(Dropout(0.4))
model.add(Dense(100, activation=tf.nn.relu))
model.add(Dropout(0.3))
model.add(Dense(50, activation=tf.nn.relu))
model.add(Dense(1, activation=tf.nn.sigmoid))
model.compile(optimizer='adadelta',
loss='binary_crossentropy',
metrics=['accuracy'])