2016-12-13 12 views
0

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

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]), но до сих пор никакого успеха.

ответ

0

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