Нейронная сеть Tensorflow не обучается - PullRequest
0 голосов
/ 09 июля 2020

Я построил нейронную сеть для университетского проекта. Цель состоит в том, чтобы выяснить, могут ли данные датчика (температура, влажность и свет) предсказать, случился ли восход солнца в течение заданного периода времени. Итак, это бинарная классификация. Проблема в том, что сеть не узнает. Точность приближается к 0,8 и не меняется примерно через 5 эпох. То же самое с потерей, которая через несколько эпох составляет около 0,4921. Я пробовал несколько вещей, например, изменить функцию активации или количество скрытых слоев, но ничего не помогло.

Я также создал набор данных с равным количеством точек данных «sunrise = 1» и «sunrise = 0». Точность оказалась ровно 0,5. Поэтому я думаю, что что-то не так с самой настройкой сети.

У вас есть идеи, что может быть не так?

Вот мой код:

def build_network():
input = keras.Input(shape=(4,25), name="input")
hidden = layers.Dense(1000, activation="sigmoid", name="dense1")(input)
hidden = layers.Dense(1000, activation="sigmoid", name="dense2")(hidden)
hidden = layers.Flatten()(hidden)
hidden = layers.Dense(500, activation="sigmoid", name="dense3")(hidden)
hidden = layers.Dense(500, activation="sigmoid", name="dense4")(hidden)
hidden = layers.Dense(10, activation="sigmoid", name="dense5")(hidden)
output = layers.Dense(1, activation="sigmoid", name="output")(hidden)
model = keras.Model(inputs=input, outputs=output, name="sunrise_model")
return model

 def train_model():
training_files = r'data/training'
test_files = r'data/test'

print('reding files...')
train_x, train_y = load_data(training_files)
test_x, test_y = load_data(test_files)

print("training network")

# compile model
model = build_network()
model.compile(
    loss=keras.losses.BinaryCrossentropy(from_logits=False),
    optimizer=keras.optimizers.RMSprop(),
    metrics=["accuracy"],
)

# Train / fit
model.fit(train_x, train_y, batch_size=100, epochs=200)

# evaluate
test_scores = model.evaluate(test_x, test_y, verbose=2)
print("Test loss:", test_scores[0])
print("Test accuracy:", test_scores[1])

Вот вывод: потеря: 0,4921 - точность: 0,8225

Потеря теста: 0,4921109309196472, точность теста: 0,8225

А вот пример данных: https://hastebin.com/hazipagija.json

1 Ответ

1 голос
/ 09 июля 2020

Я бы использовал RELU вместо сигмоида в качестве функции активации. Какую скорость обучения вы использовали? Попробуйте меньшую скорость обучения. На самом деле я считаю, что получаю наилучшие результаты, используя переменную скорость обучения. Обратный вызов Keras ReduceLROnPlateau позволяет легко это сделать. Документация здесь . Я также рекомендую вам использовать обратный вызов Keras ModelCheckpoint, чтобы сохранить модель с наименьшими потерями при проверке, а затем использовать эту модель для прогнозирования на тестовом наборе. Документация здесь. Я также думаю, что ваша модель имеет много параметров и подойдет. Добавьте в модель выпадающие слои, чтобы уменьшить эту проблему. Я бы попробовал уменьшить сложность модели в качестве хорошей альтернативы. Возьмите слои с 1000 узлами и один из слоев с 500 узлами и посмотрите, какие результаты вы получите. Я также предпочитаю использовать оптимизатор Adamax. Документация здесь. . Используйте значения по умолчанию.

...