Обеспечение симметрии в Керасе - PullRequest
0 голосов
/ 03 июля 2019

Я ищу способ создать модель нейронной сети в Keras для функции, которая является симметричной относительно обмена ее входами.Для простоты предположим, что интересующая функция зависит от двух переменных x,y и возвращает скаляр f=f(x,y).Кроме того, мы знаем, что f(x,y)=f(y,x) верно для любого x,y.Какой будет метод выбора, чтобы гарантировать, что эта симметрия точно воспроизведена моей моделью нейронной сети Keras?

Ясно, что я мог бы обучить модель симметричными данными, но чтоЯ ищу способ «жестко закодировать» эту симметрию в модели.

Я знаю, этот вопрос кажется очень простым.Извините, если есть очевидный ответ на этот вопрос, который я пропустил, и заранее благодарю за помощь!

1 Ответ

1 голос
/ 04 июля 2019

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

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

from tensorflow import keras
from tensorflow.keras.layers import *
from tensorflow.keras.models import Model
from tensorflow.keras import backend as K

def make_inner_model():
  inp = Input(shape=(2,))
  h1 = Dense(8, activation='relu')(inp)
  out = Dense(1)(h1)
  model = Model(inp, out)
  return model

def make_model(inner_model):
  inp = Input(shape=(2,))
  rev = Lambda(lambda x: K.concatenate([x[:, 1:], x[:, 0:1]], axis=1))(inp)
  r1 = inner_model(inp)
  r2 = inner_model(rev)
  out = Maximum()([r1, r2])
  model = Model(inp, out)
  model.compile('adam', 'mse')
  return model

inner = make_inner_model()
model = make_model(inner)
model.summary()
...