我是Tensorflow的新手,我想训练一个玩具神经网络来解决xor问题。我希望能够传入两位作为输入,并将1位作为输出。我将有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)
Gradiants:
l1_outputs * ol_deltas
更新权重
l1_gradiants*learning_rate + momentum * l1_weight_deltas
TLDR:
总结一下,如何为每个样本运行图表,如何优化权重(将这些函数应用于图表)以进行批量输入?
答案 0 :(得分:0)
在通常的方法中,您使用维度0作为批量维度。您正在为 *{
box-sizing: border-box;
}
body{
background:#92bde7;
color:#485e74;
line-height:1.6;
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
padding:1em;
}
.container{
max-width:1170px;
margin-left:auto;
margin-right:auto;
padding:1em;
}
ul{
list-style: none;
padding:0;
}
.brand{
text-align: center;
}
.brand span{
color:#fff;
}
/* REMOVE */
/*
.wrapper{
box-shadow: 0 0 20px 0 rgba(72,94,116,0.7);
}
*/
.wrapper > *{
padding: 1em;
}
/* REMOVE */
/*
.company-info{
background:#DA00F0;
}
*/
/*
.company-info h3, .company-info ul{
text-align: center;
margin:0 0 1rem 0;
}
*/
.contact{
background:#f9feff;
}
/* FORM STYLES */
.contact form{
display: grid;
grid-template-columns: 1fr 1fr;
grid-gap:20px;
}
.contact form label{
display:block;
}
.contact form p{
margin:0;
}
.contact form .full{
grid-column: 1 / 3;
}
.contact form button, .contact form input, .contact form textarea{
width:100%;
padding:1em;
border:1px solid #c9e6ff;
}
.contact form button{
background:#c9e6ff;
border:0;
text-transform: uppercase;
}
.contact form button:hover,.contact form button:focus{
background:#92bde7;
color:#fff;
outline:0;
transition: background-color 2s ease-out;
}
/* LARGE SCREENS */
/*Once it passes 700px do this */
@media(min-width:700px){
.wrapper{
display: grid;
grid-template-columns: 1fr 2fr;
}
.wrapper > *{
padding:2em;
}
.brand .contact{
text-align: center;
}
}
中的x
执行此操作(假设x_vals = np.array([[1.0, 0.0], [0.0,0.0]])
和(1,0)
是(0,0)
的两个训练示例。您编写图形操作的方式使它们在前向传递期间适用于任何实际值(如果您想要设置小批量大小,这在实践中很有用)。特别是,这意味着前向传递的输出将是预测的向量,而不是一个值。最后,在计算渐变时,您首先要计算小批量中每个示例的渐变,然后平均它们以获得整个小批量的渐变。以下是关于此问题的课程讲座 - https://www.coursera.org/learn/machine-learning/lecture/9zJUs/mini-batch-gradient-descent。