Какая функция активации подходит для диапазона ввода (0,1) и диапазона вывода (-∞, ∞) для работы регрессии в Keras - PullRequest
1 голос
/ 05 мая 2020

входные изображения упорядочены до (0, 1), а выход - это значения с плавающей запятой 32, имеющие псевдогауссовское распределение (-∞, ∞)

при установке, точность обучения и проверки составляет более 0,999, но при прогнозировании с использованием поезда и установленная проверка, он не воспроизводится.

прогнозируемые выходные данные показывают только отрицательные значения (и несколько положительных идентичных значений)

вызвана ли эта проблема неправильным выбором функции активации?

Я пробовал вместо relu, linear, sigmoid. результаты были такими же.

model = Sequential()
model.add(Convolution1D(filters=64, kernel_size=2, input_shape=(img_width, img_height)))
model.add(Activation("relu"))
model.add(MaxPooling1D(pool_size=(2)))

model.add(Convolution1D(filters=32, kernel_size=2))
model.add(Activation("relu"))
model.add(MaxPooling1D(pool_size=(2)))

model.add(Flatten())
model.add(Dense(256))
model.add(Activation("relu"))
model.add(Dense(1, activation='linear'))

model.compile(loss='mse', optimizer=optimizers.RMSprop(lr=0.0001), metrics=['accuracy'])

Прогноз, сделанный следующим образом,

model.fit(x_train, y_train, epochs=2,
          validation_data=(x_valid, y_valid),
          batch_size=2048,
          shuffle='batch',
          use_multiprocessing=True)
# right after fitting 
result = model.predict(x_train, use_multiprocessing=True)

Ответы [ 3 ]

1 голос
/ 05 мая 2020

при установке, точность обучения и проверки составляет более 0,999, но при прогнозировании с использованием набора параметров обучения и проверки он не воспроизводится. код, который вы не включили. Либо что-то не так с вашими данными тестирования, либо с тем, как вы прогнозируете (не загружаете веса?)

1 голос
/ 05 мая 2020

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

  1. Я предлагаю вам нормализовать ваши выходные данные в диапазоне (0., 1.) и используйте сигмоид в последнем слое.

Вы всегда можете использовать обратное преобразование для восстановления исходных выходных данных.

mn = np.min(y_train)
mx = np.max(y_train)
y_train = (y_train - mn)/(mx - mn)

# ... train

# inverse transform
y_train_original = y_train*(mx-mn) + mn

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

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

, чтобы избежать:

  • используйте нормализацию вывода.

  • model.add(Dense(256)) - уменьшите количество нейронов здесь, попробуйте с помощью 32->64->128

  • использование отсева

1 голос
/ 05 мая 2020

Convolution1D не является стандартным выбором для работы с изображениями, я предлагаю вам Convolution2D

Во-вторых, «точность» не является правильным показателем c для задачи регрессии, хорошим выбором является среднеквадратичная ошибка (mse) , средняя абсолютная ошибка (mae), root среднеквадратическая ошибка (rmse)

...