2017-07-30 105 views
0

我是Tensorflow的新手,我想训练玩具神经网络来解决异或问题。我希望能够通过两位作为输入,并有1位作为输出。我将有4个训练实例:[0,0], [0,1], [1,0], [1,1]Tensorflow - 通过GD手动训练体重

我了解前馈如何工作,但我不完全知道如何优化权重?

我不希望使用内置的功能,如

train_step = tf.train.GradientDescentOptimizer(0.3).minimize(mse) 

相反,我想为每个节点(相对于计算出增量和梯度多少三角洲和gradiants需要的节点类型)

我可以接受Y_hat并从真Y中减去以得到我的错误。然后我可以计算这个输出的增量,并计算隐藏节点的增量。使用deltas我可以计算我的gradiants。使用这些渐变,我可以计算出需要改变的重量。

我的问题是更新权重,因为我给了session.run 4个输入(训练示例)当我更新权重时,我得到一个维数错误,因为有4个训练例子,权重是针对每个例子的一次不是4个。

我不知道如何分别更新每个样本的权重。

下面是一些代码,我已经写了:

''' 
Simple neural network to solve the xor problem 
2 inputs representing bits of the xor gate 
1 output representing the output bit of the xor gate 
''' 

import tensorflow as tf 
import numpy as np 
# build computational graph 
n_input = 2 
n_hidden = 2 
n_classes = 1 

#weights describing which layer it is affecting 
#ie h1 affects layer 1 
weights = { 
    'h1': tf.Variable(tf.random_normal([n_input, n_hidden])),# inputs x hidden 
    'ol': tf.Variable(tf.random_normal([n_hidden, n_classes])) 
} 
#biases describing which layer it is affecting 
#ie b1 affects layer 1 
biases = { 
    'b1': tf.Variable(tf.random_normal([n_hidden])), 
    'ol': tf.Variable(tf.random_normal([n_classes])) 
     } 

def sigmoid(x, derivative = False): 
    if derivative == True: 
     return (1.0/(1+tf.exp(-x))) * (1.0 - (1.0/(1+tf.exp(-x)))) 
    return 1.0/(1+tf.exp(-x)) 

def forward(x, weights, biases): 
    # 1st hidden layer 
    layer1 = tf.matmul(x, weights['h1']) + biases['b1'] #w*x + b 
    layer1 = sigmoid(layer1, False)#sigmoid activation 

    output = tf.add(tf.matmul(layer1, weights['ol']), biases['ol']) #w*x + b 
    output = sigmoid(output, False)#sigmoid activation 
    return output 

def optimizer(out): 
    return tf.trainable_variables() 

x = tf.placeholder('float', None, name='X_value_placeholder') 

pred = forward(x, weights, biases) 

opt = optimizer(pred) 

x_vals = np.array([[1.0, 0.0], [0.0,0.0]]) 
# initialize variables 
init = tf.global_variables_initializer() 

# create session and run the graph 
with tf.Session() as sess: 
    sess.run(init) 
    for i in range(1): 
     print 'epoch {}'.format(i) 
     print (sess.run(opt, feed_dict={x: x_vals})) 

从我的理解,我需要做下面的优化权重:

三角洲:

隐藏节点(以第1层为例):

  • sigmoid(l1_sums, True) * ol_deltas * weights['h1']

输出节点:

  • -E * sigmoid(self.sums, True)

Gradiants:

  • l1_outputs * ol_deltas

更新权重

  • l1_gradiants*learning_rate + momentum * l1_weight_deltas

TLDR:

概括起来,如何可以优化的权重(应用这些函数)的曲线对于批量输入而不是对每个样品运行图表?

回答

0

在通常的方法中,使用维度0作为批次维度。你在xx_vals = np.array([[1.0, 0.0], [0.0,0.0]])(假设(1,0)(0,0)是你的两个训练样例x)。你以这样的方式编写你的图表操作,使它们能够在正向传递期间用于任何实际值(如果你想要设置最小批量大小,这在实践中很有用)。特别是,这意味着你从正向传球的输出将是一个预测向量,而不是一个值。最后,在计算梯度时,首先计算最小批处理中每个示例的梯度,然后平均它们以获得整个小批量的梯度。这是关于这个的课程讲座 - https://www.coursera.org/learn/machine-learning/lecture/9zJUs/mini-batch-gradient-descent