Аппроксимация функции с многомерным выходом с использованием керальной нейронной сети - PullRequest
1 голос
/ 26 июня 2019

В рамках проекта для моей учебы я хочу попытаться аппроксимировать функцию f:R^m -> R^n с помощью нейронной сети Keras (к которой я совершенно новичок).Сеть, кажется, учится до некоторой (действительно неудовлетворительной) точки.Но прогнозы сети совсем не похожи на ожидаемые результаты.

У меня есть два numpy-массива, содержащих обучающие данные (m-мерный вход для функции) и обучающие метки (n-мерный ожидаемый выходной сигнал функции).Я использую их для обучения моей модели Keras (см. Ниже), которая, кажется, учится на предоставленных данных.

inputs = Input(shape=(m,))
hidden = Dense(100, activation='sigmoid')(inputs)
hidden = Dense(80, activation='sigmoid')(hidden)
outputs = Dense(n, activation='softmax')(hidden)

opti = tf.keras.optimizers.Adam(lr=0.001)

model = Model(inputs=inputs, outputs=outputs)
model.compile(optimizer=opti,
             loss='poisson',
             metrics=['accuracy'])

model.fit(training_data, training_labels, verbose = 2, batch_size=32, epochs=30)

Когда я вызываю метод оценки для моей модели с набором тестовых данных иЗа набор тестовых меток я получаю очевидную точность более 50%.Тем не менее, когда я использую метод прогнозирования, прогнозы сети не похожи на ожидаемые результаты в малейшей степени.Например, первые десять записей ожидаемого результата:

[0, 0,08193582, 0,13141066, 0,13495408, 0,16852582, 0,2154705, 0,30517559, 0,32567417, 0,34073457, 0,37453226]

, тогда как первые десять записей прогнозируемых результатов:

[3.09514281e-09, 2.20849714e-03, 3.84095078e-03, 4.99367528e-03,
6.06226595e-03, 7.18442770e-03, 8.96730460e-03, 1.03423093e-02, 1.16029680e-02, 1.31887039e-02]

Имеет ли это какое-то отношение к используемым метрикам?Могут ли результаты быть нормализованы Керасом каким-то непрозрачным способом?Я только что использовал неправильную модель для решения проблемы, которую хочу решить?Что означает «точность» в любом случае?Заранее благодарю за помощь, я новичок в нейронных сетях и застрял с этой проблемой в течение нескольких дней.

1 Ответ

2 голосов
/ 26 июня 2019

Проблема с этой строкой

outputs = Dense(n, activation='softmax')(hidden)

Мы используем активацию softmax только в задаче классификации, где нам нужно распределение вероятностей по классам в качестве выходных данных сети.Таким образом, softmax делает так, чтобы выходная сумма была равна единице и отлична от нуля (что верно в вашем случае).Но я не думаю, что проблема для вас - это задача классификации, вы просто пытаетесь предсказать десять непрерывных целевых переменных, поэтому вместо этого используйте функцию активации linear.Так что измените вышеприведенную строку примерно так:

outputs = Dense(n, activation='linear')(hidden)

Надеюсь, это поможет!

...