Как моделировать симметричную функцию для регрессии с использованием тензорной нейронной сети - PullRequest
1 голос
/ 11 июня 2019

Я пытаюсь создать регрессионную модель для симметричного ввода, надеясь смоделировать функцию с 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)

1 Ответ

0 голосов
/ 11 июня 2019

Если ваша модель по своей природе асимметрична, существует простой способ явного навязывания симметрии:

g(x, y) = g(y, x) = 1/2 * (f(x, y) + f(y, x))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...