#python #keras
Вопрос:
я использую нейронную сеть для классификации последовательностей ДНК, где входные данные кодируются в одной горячей кодировке.
Я начал использовать очень простую сеть, просто для некоторого теста.
ishape = (None,4)
ksize = 18
model.add(Conv1D(16, ksize, activation='relu', input_shape=ishape))
model.add(GlobalAvgPool1D(data_format="channels_last"))
model.add(Dense(2, activation='sigmoid'))
Проблема заключалась в том, что он возвращает всегда одни и те же результаты, которые меняются каждый раз, когда я тренирую сети.
Поэтому я пытаюсь увидеть выходные данные глобального усредняющего слоя.. и я обнаружил, что выходные данные почти одинаковы, например, с учетом только одного значения они варьируются от 0,17484 до 0,17424. ( Это также происходит, если я пытаюсь предсказать поддельный ввод со всеми 0 или всеми 1)
Я не знаю, как это решить … какое-нибудь предложение?
P.S. эта проблема не зависит от обучения, потому что я обнаружил, что это то же самое, если я попытаюсь предсказать ввод после инициализации, но до обучения.
Обновить—
Я обнаружил, что вес сверточного слоя невелик, в диапазоне 0,1 или 0,01.. учитывая, что я работаю только со значениями 0 и 1, возможно ли, что в этом проблема? Как я могу это исправить?
Комментарии:
1. Я попытался воспроизвести вашу модель в colab.research.google.com/drive/. … Я не вижу проблемы с одинаковыми выходными значениями. кстати: вы хотите предсказать 2 независимых условия ? или 2 взаимоисключающих класса. Если это произойдет позже, используйте «softmax» в качестве функции активации выходного слоя.
2. Спасибо за ответ! Я новичок в нейронных сетях.. поэтому я просто предполагаю, что это была проблема. Читая что-то еще, я нахожу, что изначально вес действительно невелик, и я начинаю думать, что это причина аналогичных выходных значений. Вместо этого, отвечая на ваш второй вопрос, я хочу предсказать 2 исключительных класса, я где-то нахожу, что сигмоид предназначен для двоичной классификации, softmax используется более чем для 2 классов.
Ответ №1:
Я считаю, что это ожидаемое поведение от keras/tensorflow. Один и тот же код может дать вам разные результаты из-за случайности, которая присутствует во время подгонки модели и обучения..
Может быть, вы можете попробовать это и импортировать нижеприведенную строку в верхней части вашего кода
from numpy.random import seed
seed(1)
from tensorflow import set_random_seed
set_random_seed(2)
для справки вы можете проверить этот URL-адрес, и это совершенно нормально, чтобы получить такие результаты
Комментарии:
1. Я думаю, что я оговорился… проблема прямо противоположна: если после ( или до) обучения я использую модель для прогнозирования N значений, я получу N одинаковых выходных данных. Я думаю, что по некоторым причинам сеть возвращает вывод, основанный только на весе, а не на вводе