Сверточный слой возвращает один и тот же результат для разных входных данных

#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 одинаковых выходных данных. Я думаю, что по некоторым причинам сеть возвращает вывод, основанный только на весе, а не на вводе