Как эффективно обрабатывать повторяющиеся общие слои в Keras

Я новичок в глубоком обучении Keras. Я настраиваю модель нейронной сети в Keras, чьи входы xi (каждый вход имеет пару переменных) предварительно обрабатываются меньшими плотными слоями сети. После этого меньший плотный слой выдает две новые переменные xf (например, кодировщик), которые объединяются и затем служат входными данными для более крупной плотной сети.

На уровнях предварительной обработки, поскольку это один и тот же слой, работающий с каждым входом xi, мне было интересно, можно ли его эффективно закодировать с помощью цикла.

Я пробовал с циклом for, но, похоже, он не работает, поскольку такие тензорные объекты не поддерживают назначение элементов. Итак, я написал это следующим простым способом, и код работает нормально. Однако это написано для 5 входов; на практике количество входных данных — это большая переменная, которая может доходить до 500. Поэтому я ищу эффективный метод.

shared_dense_lvl1 = Dense(4, activation='sigmoid')
shared_dense_lvl2 = Dense(4, activation='sigmoid')
shared_dense_lvl3 = Dense(2, activation='sigmoid')

x1i = Input(shape=(2,))
x11 = shared_dense_lvl1(x1i)
x12 = shared_dense_lvl2(x11)
x1f = shared_dense_lvl3(x12)

x2i = Input(shape=(2,))
x21 = shared_dense_lvl1(x2i)
x22 = shared_dense_lvl2(x21)
x2f = shared_dense_lvl3(x22)

x3i = Input(shape=(2,))
x31 = shared_dense_lvl1(x3i)
x32 = shared_dense_lvl2(x31)
x3f = shared_dense_lvl3(x32)

x4i = Input(shape=(2,))
x41 = shared_dense_lvl1(x4i)
x42 = shared_dense_lvl2(x41)
x4f = shared_dense_lvl3(x42)

x5i = Input(shape=(2,))
x51 = shared_dense_lvl1(x5i)
x52 = shared_dense_lvl2(x51)
x5f = shared_dense_lvl3(x52)

xy0 = concatenate([x1f, x2f, x3f, x4f, x5f])
xy  = Dense(2, activation='relu',name='xy')(xy0)

y1  = Dense(50, activation='sigmoid',name='y1')(xy)
y2  = Dense(50, activation='sigmoid',name='y2')(y1)
y3  = Dense(250, activation='sigmoid',name='y3')(y2)

merged = Model(inputs=[x1i,x2i,x3i,x4i,x5i],outputs=[y3])

person Bahauddin Omar    schedule 21.07.2019    source источник


Ответы (1)


Модель, которую вы написали, эквивалентна:

inp = Input(shape=(5, 2,))
l1 = Dense(4, ...)(inp)
l2 = Dense(4, ...)(l1)
l3 = Dense(2, ...)(l2)
xy0 = Flatten()(l3)

т. е. если у вас есть входная форма с более чем двумя измерениями, например такая форма, как (batch_size, time_steps, n_features), плотные слои применяются с общими весами ко всем time_steps.

Ваши данные что-то вроде временного ряда? в этом случае вы можете рассмотреть возможность использования рекуррентной или сверточной сети.

Вы также, кажется, используете много сигмовидных активаций. Остерегайтесь исчезающих градиентов. Если вы обнаружите, что сеть не обучается, проверьте, исчезают ли градиенты, распечатав градиенты для конкретной обучающей партии. Например, может помочь этот пакет: https://github.com/philipperemy/keract

person Pedro Marques    schedule 21.07.2019
comment
Большое спасибо. Это решило мою проблему. Мои данные не являются временным рядом. Это 2 столбца чисел, которые сохраняют температуру и скорость атмосферы. Я пытаюсь построить аппроксиматор функций, который может быстро вычислить распространение электромагнитных волн через атмосферу. Это можно смоделировать с помощью физической модели, но для решения этих сложных моделей в кластере обычно требуется несколько дней. Большое спасибо за совет по активации сигмовидной. Я очень ценю это. - person Bahauddin Omar; 21.07.2019