【问题标题】:Tensorflow - training weights via GD by handTensorflow - 通过 GD 手动训练权重
【发布时间】:2017-08-22 07:02:34
【问题描述】:

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

我了解前馈的工作原理,但我不知道如何优化权重?

我不想使用内置函数,例如

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

相反,我想为每个单独的节点计算增量和梯度(关于节点类型需要多少增量和梯度)

我可以接受 Y_hat 并从真正的 Y 中减去来得到我的错误。然后我可以计算这个输出的增量并计算隐藏节点的增量。使用增量我可以计算我的梯度。使用这些梯度,我可以计算出我需要将每个重量改变多少。

我的问题是更新权重,因为我给 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)

渐变:

  • l1_outputs * ol_deltas

更新权重

  • l1_gradiants*learning_rate + momentum * l1_weight_deltas

TLDR:

总而言之,如何优化权重(应用这些函数)到批量输入的图形,而不是为每个样本运行图形?

【问题讨论】:

    标签: tensorflow


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-02
      • 2016-03-09
      • 1970-01-01
      相关资源
      最近更新 更多