文件名:【TensorFlow】通过两个简单的例子实现反向传播,主播明星对抗赛
【TensorFlow】通过两个简单的例子实现反向传播
回归算法示例
import tensorflow
as tf
import numpy
as npsess
= tf
.Session
()x_vals
= np
.random
.normal
(1,0.1,100)y_vals
= np
.repeat
(10.,100)x_data
= tf
.placeholder
(shape
=[1],dtype
=tf
.float32
)y_target
= tf
.placeholder
(shape
=[1],dtype
=tf
.float32
)A
= tf
.Variable
(tf
.random_normal
(shape
=[1]))my_output
= tf
.multiply
(x_data
,A
)loss
= tf
.square
(my_output
-y_target
)init
= tf
.global_variables_initializer
()sess
.run
(init
)my_opt
= tf
.train
.GradientDescentOptimizer
(learning_rate
=0.02)train_step
= my_opt
.minimize
(loss
)for i
in range(100):rand_index
= np
.random
.choice
(100)rand_x
= [x_vals
[rand_index
]]rand_y
= [y_vals
[rand_index
]]sess
.run
(train_step
,feed_dict
={x_data
:rand_x
,y_target
:rand_y
})if (i
+1)%25 == 0:print("Step # " + str(i
+1) + ' A = ' + str(sess
.run
(A
)))print("Loss=" + str(sess
.run
(loss
,feed_dict
={x_data
:rand_x
,y_target
:rand_y
}))) 分类算法示例
import tensorflow
as tf
import numpy
as npsess
= tf
.Session
()x_vals
= np
.concatenate
((np
.random
.normal
(-1,1,50),np
.random
.normal
(3,1,50)))y_vals
= np
.concatenate
((np
.repeat
(0.,50),np
.repeat
(1.,50)))x_data
= tf
.placeholder
(shape
=[1],dtype
=tf
.float32
)y_target
= tf
.placeholder
(shape
=[1],dtype
=tf
.float32
)A
= tf
.Variable
(tf
.random_normal
(mean
=10,shape
=[1]))my_output
= tf
.add
(x_data
,A
)my_output_expanded
= tf
.expand_dims
(my_output
,0)y_target_expanded
= tf
.expand_dims
(y_target
,0)init
= tf
.global_variables_initializer
()sess
.run
(init
)xentropy
= tf
.nn
.sigmoid_cross_entropy_with_logits
(logits
=my_output_expanded
,labels
=y_target_expanded
)my_opt
= tf
.train
.GradientDescentOptimizer
(0.05)train_step
= my_opt
.minimize
(xentropy
)for i
in range(1400):rand_index
=np
.random
.choice
(100)rand_x
= [x_vals
[rand_index
]]rand_y
= [y_vals
[rand_index
]]sess
.run
(train_step
, feed_dict
={x_data
:rand_x
,y_target
:rand_y
})if (i
+1)%200 == 0:print('Step # ' + str(i
+1) + ' A = ' + str(sess
.run
(A
)))print('Loss = '+ str(sess
.run
(xentropy
,feed_dict
={x_data
:rand_x
,y_target
:rand_y
}))) 总结
实现反向传播的步骤
生成数据;初始化占位符和变量;创建损失函数;定义一个优化器算法;通过随机数据样本进行迭代,更新变量。
学习率和优化器算法
学习率优点缺点使用场景大结果精确收敛慢算法不稳定,降低学习率小收敛快结果不精确算法收敛慢,提高学习率
问题 有时,标准梯度下降算法会明显卡顿或者收敛变慢,特别是在梯度为0的附近的点。
解决思路 ①TensorFlow的MomentumOptimizer()函数增加了一项势能, 前一次迭代过程的梯度下降值的倒数。
②可以改变的是优化器的步长,理想情况下,对于变化小的变量使用大步长;而变化迅速的变量使用小步长。实现这种优点的常用Adagrad算法。此算法考虑整个历史迭代的变量梯度,TensorFlow中相应功能的实现是AdagradOptimizer()函数。
问题 有时,由于Adagrad算法计算整个历史迭代的梯度,导致梯度迅速变为0。
解决思路 可以用Adadelta算法解决,它限制使用的迭代次数。TensorFlow中相应功能的实现是AdadeltaOptimizer()函数。