Получение плохой производительности с простой моделью TensorFlow - PullRequest
2 голосов
/ 05 июня 2019

Я пытаюсь поэкспериментировать с простой моделью TensorFlow, построенной с использованием керас, но не могу понять, почему у меня такие плохие прогнозы. Вот модель:

x_train = np.asarray([[.5], [1.0], [.4], [5], [25]])
y_train = np.asarray([.25, .5, .2, 2.5, 12.5])

opt = keras.optimizers.Adam(lr=0.01)

model = Sequential()
model.add(Dense(1, activation="relu", input_shape=(x_train.shape[1:])))
model.add(Dense(9, activation="relu"))
model.add(Dense(1, activation="relu"))

model.compile(loss='mean_squared_error', optimizer=opt, metrics=['mean_squared_error'])
model.fit(x_train, y_train, shuffle=True, epochs=10)

print(model.predict(np.asarray([[5]])))

Как видите, он должен научиться делить ввод на два. Однако потеря составляет 32.5705, и в течение нескольких эпох она отказывается что-либо менять (даже если я делаю что-то сумасшедшее, например, 100 эпох, это всегда потеря). Есть ли что-нибудь, что вы можете видеть, что я делаю ужасно неправильно здесь? Прогноз для любого значения кажется 0..

Кажется также, что происходит случайное переключение между выполнением, как ожидалось, и странным поведением, описанным выше. Я перезапустил его и получил потерю 0.0019 после 200 эпох, но если я перезапущу его с теми же параметрами через секунду, потеря останется равной 30, как и раньше. Что здесь происходит?

1 Ответ

1 голос
/ 05 июня 2019

Некоторые причины, по которым я могу придумать,

  1. тренировочный набор слишком мал
  2. высокая скорость обучения
  3. последний слой должен быть просто линейным
  4. для некоторых запусков блоки ReLU умирают (см. Проблему с неработающим ReLU), и вес вашей сети после этого не меняется, поэтому вы видите то же значение потерь.
  5. В этом случае, возможно, активация tanh обеспечит лучшее кондиционирование для оптимизации

Я сделал несколько изменений в вашем коде на основе того, что я прокомментировал, и я получил приличные результаты.

import keras
import numpy as np
from keras.models import Sequential
from keras.layers import Dense, Activation

x_train = np.random.random((50000, 1))#np.asarray([[.5], [1.0], [.4], [5], [25]])

y_train = x_train /2. #TODO: add small amount of noise to y #np.asarray([.25, .5, .2, 2.5, 12.5])

opt = keras.optimizers.Adam(lr=0.0005, clipvalue=0.5)

model = Sequential()
model.add(Dense(1, activation="tanh", input_shape=x_train.shape[1:]))
model.add(Dense(9, activation="tanh"))
model.add(Dense(1, activation=None))

model.compile(loss='mean_squared_error', optimizer=opt, metrics=['mean_squared_error'])
model.fit(x_train, y_train, shuffle=True, epochs=10)

print(model.predict(np.asarray([.4322])))

Выход:

[[0.21410337]]
...