我正在寻找一种方法,在Keras中创建一个神经网络模型,用于一个对其输入的交换具有对称性的函数。为了简化,让我们假设这个函数依赖于两个变量x,y
,并返回一个标量f=f(x,y)
。此外,我们知道f(x,y)=f(y,x)
对于任何x,y
都成立。为了确保我的Keras神经网络模型精确地重现这种对称性,应该选择什么方法?
显然,我可以用对称数据来训练模型,但我想寻找的是一种将这种对称性“硬编码”进模型的方法。
我知道这个问题看似非常基础。如果这个问题有一个显而易见的答案是我忽略了,请原谅我,并提前感谢您的帮助!
回答:
从你的问题来看,你似乎是在寻找一种方便的方法来使用一层或一组共享权重的层,分别按正序和逆序应用到输入上。
即类似于卷积如何通过一组时间步来识别模式,但考虑到输入缓冲区是循环的。
实现这一目标的一个便捷方法是将你特殊的“卷积”层放入一个可重用的辅助模型中,然后对结果进行最大池化。类似于以下代码:
from tensorflow import kerasfrom tensorflow.keras.layers import *from tensorflow.keras.models import Modelfrom tensorflow.keras import backend as Kdef make_inner_model(): inp = Input(shape=(2,)) h1 = Dense(8, activation='relu')(inp) out = Dense(1)(h1) model = Model(inp, out) return modeldef 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 modelinner = make_inner_model()model = make_model(inner)model.summary()