我正在尝试为对称输入建立回归模型,希望使用f(x,y)= f(y,x)= F建模函数。突然,我发现训练有素的神经网络将为f(x,y)和f(y,x)提供不同的输出。
我正在使用具有Adagrad多层结构的密集神经网络来学习整个训练集。
部分问题是由于随机(非对称)权重初始化引起的。
但是看起来在每个神经元上进行对称权重将失去使用DNN的好处。
是否可以使用DNN解决此问题,或者采用什么方法
示例:
from __future__ import absolute_import, division, print_function
import pathlib
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
import tensorflow as tf
from tensorflow.keras import layers
print(tf.__version__)
train = pd.DataFrame([[0, 0], [0, 1], [1, 0], [1, 1]])
labels = pd.DataFrame([[0], [1], [1], [3]])
def build_model4():
model4 = tf.keras.Sequential([
layers.Dense(4, activation=tf.nn.elu, input_shape=(2,)),
layers.Dense(4, activation=tf.nn.elu),
layers.Dense(4, activation=tf.nn.elu),
layers.Dense(1, activation=tf.nn.relu)
])
optimizer = tf.keras.optimizers.Adagrad(lr=0.05, epsilon=None, decay=0.0)
model4.compile(loss='mean_squared_error',
optimizer=optimizer,
metrics=['mean_absolute_error', 'mean_squared_error'])
return model4
model4 = build_model4()
model4.summary()
EPOCHS = 500
history = model4.fit(
train, labels, epochs=EPOCHS, batch_size=4, verbose=0)
hist = pd.DataFrame(history.history)
hist['epoch'] = history.epoch
hist.tail()
plt.plot(history.history['mean_squared_error'], label='train')
test=pd.DataFrame([[1, 2], [2, 1]])
o=model4.predict(test)
print(o)
答案 0 :(得分:0)
如果您的模型本质上是非对称的,则有一种简单的方法可以明确地强制对称:
g(x, y) = g(y, x) = 1/2 * (f(x, y) + f(y, x))