在Keras中加强对称性

时间:2019-07-03 20:04:55

标签: machine-learning keras neural-network symmetry

我正在寻找一种在Keras中为函数创建神经网络模型的方法,该模型相对于其输入的交换是对称的。为了简单起见,假设感兴趣的函数取决于两个变量x,y并返回标量f=f(x,y)。此外,我们知道f(x,y)=f(y,x)适用于任何x,y。为了确保我的Keras神经网络模型精确地再现这种对称性,应该选择什么方法?

很显然,我可以使用对称数据训练模型,但是我正在寻找的是一种将这种对称“硬编码”到模型中的方法。

我知道,这个问题似乎很基本。抱歉,如果您对此问题有一个明显的答案,而我却忽略了这个答案,请先感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

从您的问题来看,您似乎正在寻找一种便捷的方式来将一层或一组具有共享权重的层以正向和反向顺序应用于输入。

即类似于卷积通过一组时间步长识别模式的方式,但是将输入缓冲区视为圆形。

实现此目的的便捷方法是将特殊的“卷积”层放入可重用的aux模型中,然后最大程度地合并结果。类似于以下内容:

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()