tensorflow中softmax函数的反向传播
Backpropagation of softmax function in tensorflow
我试图找出 tensorflow 中 tf.nn.softmax() 函数的反向传播是如何工作的,以便在我的项目中使用它。因此,为此我实现了以下简单网络来验证来自张量流网络的 softmax 层的导数类似于数学推导的导数。
x=tf.placeholder(tf.float32,[5])
y_true = tf.placeholder(tf.float32,[5])
w=tf.Variable(tf.zeros([5]))
logits = tf.multiply(x,w)
y = tf.nn.softmax(logits)
loss = tf.pow(y - y_true,2)
cost = tf.reduce_mean(loss)
train_x = [1.0,2.0,3.0,4.0,5.0]
train_y = [3.0,4.0,5.0,6.0,7.0]
sess = tf.Session()
sess.run(tf.initialize_all_variables())
# Following function is to print essential layer values required.
def get_val():
print('LOSS : ', sess.run(loss,feed_dict={x:train_x,y_true:train_y}))
print('COST : ', sess.run(cost,feed_dict={x:train_x,y_true:train_y}))
print('Y : ', sess.run(y,feed_dict={x:train_x,y_true:train_y}))
print('LOGITS: ', sess.run(logits,feed_dict={x:train_x,y_true:train_y}))
print('W : ', sess.run(w,feed_dict={x:train_x,y_true:train_y}))
# before training
get_val()
# normal gradient decent optimizer used to calculate weight values
optimizer=tf.train.GradientDescentOptimizer(learning_rate=1).minimize(cost)
# train only for one time
sess.run(optimizer,feed_dict={x:train_x,y_true:train_y})
#after training
get_val()
在这里你可以看到我使用 get_val() 函数得到的值。
**Before Training**
LOSS : [ 7.8399997, 14.44, 23.04, 33.640003, 46.24 ]
COST : 25.040003
Y : [0.2, 0.2, 0.2, 0.2, 0.2]
LOGITS: [0., 0., 0., 0., 0.]
W : [0., 0., 0., 0., 0.]
**After Training**
LOSS : [ 8.916067, 15.904554, 24.835724, 35.293324, 37.2296 ]
COST : 24.435854
Y : [0.01402173, 0.01194853, 0.01645466, 0.0591815, 0.8983936 ]
LOGITS: [-0.16000001, -0.32000008 0., 1.2800003, 3.9999998 ]
W : [-0.16000001, -0.16000004, 0., 0.32000008, 0.79999995]
y_true = train_y
m = 5
alpha = 1 # learning rate
x = train_x
使用这个函数,我将在第一次训练后计算权重。
这些是我使用这个函数得到的权重值。
[-0.1792, -0.4864, -0.9216, -1.4848, -2.176]
但是和我训练tensorflow网络后得到的权重值不太相似。
这些是训练后的权重值。
[-0.16000001, -0.16000004, 0., 0.32000008, 0.79999995]
谁能解释一下为什么我的函数没有按照我的预期给出权重值。
上式是权重导数的导出方程。并且可以在梯度下降优化器的帮助下相应地进行权重更新。
我试图找出 tensorflow 中 tf.nn.softmax() 函数的反向传播是如何工作的,以便在我的项目中使用它。因此,为此我实现了以下简单网络来验证来自张量流网络的 softmax 层的导数类似于数学推导的导数。
x=tf.placeholder(tf.float32,[5])
y_true = tf.placeholder(tf.float32,[5])
w=tf.Variable(tf.zeros([5]))
logits = tf.multiply(x,w)
y = tf.nn.softmax(logits)
loss = tf.pow(y - y_true,2)
cost = tf.reduce_mean(loss)
train_x = [1.0,2.0,3.0,4.0,5.0]
train_y = [3.0,4.0,5.0,6.0,7.0]
sess = tf.Session()
sess.run(tf.initialize_all_variables())
# Following function is to print essential layer values required.
def get_val():
print('LOSS : ', sess.run(loss,feed_dict={x:train_x,y_true:train_y}))
print('COST : ', sess.run(cost,feed_dict={x:train_x,y_true:train_y}))
print('Y : ', sess.run(y,feed_dict={x:train_x,y_true:train_y}))
print('LOGITS: ', sess.run(logits,feed_dict={x:train_x,y_true:train_y}))
print('W : ', sess.run(w,feed_dict={x:train_x,y_true:train_y}))
# before training
get_val()
# normal gradient decent optimizer used to calculate weight values
optimizer=tf.train.GradientDescentOptimizer(learning_rate=1).minimize(cost)
# train only for one time
sess.run(optimizer,feed_dict={x:train_x,y_true:train_y})
#after training
get_val()
在这里你可以看到我使用 get_val() 函数得到的值。
**Before Training**
LOSS : [ 7.8399997, 14.44, 23.04, 33.640003, 46.24 ]
COST : 25.040003
Y : [0.2, 0.2, 0.2, 0.2, 0.2]
LOGITS: [0., 0., 0., 0., 0.]
W : [0., 0., 0., 0., 0.]
**After Training**
LOSS : [ 8.916067, 15.904554, 24.835724, 35.293324, 37.2296 ]
COST : 24.435854
Y : [0.01402173, 0.01194853, 0.01645466, 0.0591815, 0.8983936 ]
LOGITS: [-0.16000001, -0.32000008 0., 1.2800003, 3.9999998 ]
W : [-0.16000001, -0.16000004, 0., 0.32000008, 0.79999995]
y_true = train_y
m = 5
alpha = 1 # learning rate
x = train_x
使用这个函数,我将在第一次训练后计算权重。
这些是我使用这个函数得到的权重值。 [-0.1792, -0.4864, -0.9216, -1.4848, -2.176]
但是和我训练tensorflow网络后得到的权重值不太相似。 这些是训练后的权重值。 [-0.16000001, -0.16000004, 0., 0.32000008, 0.79999995]
谁能解释一下为什么我的函数没有按照我的预期给出权重值。
上式是权重导数的导出方程。并且可以在梯度下降优化器的帮助下相应地进行权重更新。