Обучение полностью подключенной функции XOR нейронной сети прямой связи

Я пытаюсь научить мою многослойную нейронную сеть функции XOR. У меня есть сеть с архитектурой [2, 2, 1]. Я определяю потерю как сумму квадратичных ошибок (я знаю, что она не идеальна, но она мне нужна). Если я устанавливаю функцию активации для всех слоев как сигмовидную функцию, я всегда застреваю в локальном оптимуме (где-то около 0,25, все выходы около 0,5). Если я изменяю функцию активации скрытого слоя на ReLU, я иногда застреваю в том же оптимуме, но иногда я решаю его. Может ли это быть потому, что я использую среднеквадратическую ошибку вместо кросс-энтропии? На всякий случай вот мой код для нейронной сети:

import tensorflow as tf

def weight_variable(shape):
    initial = tf.truncated_normal(shape, stddev=0.5)
    return tf.Variable(initial)

def bias_variable(shape):
    initial = tf.constant(0.1, shape=shape)
    return tf.Variable(initial)

class FCLayer():
    def __init__(self, inputs, outputs, activation):
        self.W = weight_variable([inputs, outputs])
        self.b = bias_variable([outputs])
        self.activation = activation

    def forward(self, X):
        s = tf.matmul(X, self.W) + self.b
        return self.activation(s)

class Network:
    def __init__(self, architecture, activations=None):

        self.layers = []

        for i in range(len(architecture)-1):
            self.layers.append(FCLayer(architecture[i], architecture[i+1],
                                       tf.nn.sigmoid if activations==None else activations[i]))

        self.x = tf.placeholder(tf.float32, shape=[None, architecture[0]])

        self.out = self.x
        for l in self.layers:
            self.out = l.forward(self.out)

        self.session = tf.Session();
        self.session.run(tf.initialize_all_variables())

    def train(self, X, Y_, lr, niter):

        y = tf.placeholder(tf.float32, shape=[None, Y_.shape[1]])
        loss = tf.reduce_mean((self.out - y)**2)
        #loss = tf.reduce_sum(tf.nn.sigmoid_cross_entropy_with_logits(self.out, y))

        train_step = tf.train.GradientDescentOptimizer(lr).minimize(loss)

        errs = [];
        for i in range(niter):
            train_step.run(feed_dict={self.x: X, y: Y_},session=self.session)
            errs.append(loss.eval(feed_dict={self.x: X, y: Y_},session=self.session))

        return errs;

    def predict(self, X):
        return self.out.eval(feed_dict={self.x: X}, session = self.session)

Обновление: я пробовал более сложную архитектуру ([2,2,2,1]), но все равно безуспешно.

1 ответ

Решение

Решено это, скорость обучения 0,1 была слишком мала по какой-то причине. Я хочу сказать, что эта проблема решена, мне нужно было только увеличить скорость обучения.

Другие вопросы по тегам