在张量流中,似乎整个反向传播算法是通过在特定成本函数上单次运行优化器来执行的,该成本函数是某些MLP或CNN的输出.
我不完全理解张量流如何从成本中知道它确实是某个NN的输出?可以为任何模型定义成本函数.我该如何"告诉"某个成本函数来自NN?
Pan*_*hin 24
我该如何"告诉"某个成本函数来自NN?
只需配置优化程序以最小化(或最大化)张量即可完成此操作.例如,如果我有这样的损失函数
loss = tf.reduce_sum( tf.square( y0 - y_out ) )
Run Code Online (Sandbox Code Playgroud)
其中y0是基础事实(或期望输出),y_out是计算输出,那么我可以通过定义我的训练函数来最小化损失
train = tf.train.GradientDescentOptimizer(1.0).minimize(loss)
Run Code Online (Sandbox Code Playgroud)
这告诉Tensorflow,当计算列车时,应用梯度下降对损失进行最小化,并使用y0和y_out计算损失,因此梯度下降也会影响那些(如果它们是可训练的变量),依此类推.
变量y0,y_out,loss和train不是标准的python变量,而是计算图的描述.Tensorflow使用有关该计算图的信息在应用梯度下降时展开它.
具体如何,这超出了这个答案的范围. 这里和这里有两个很好的起点,可以获得更多有关更多细节的信息.
让我们来看一个代码示例.首先是代码.
### imports
import tensorflow as tf
### constant data
x = [[0.,0.],[1.,1.],[1.,0.],[0.,1.]]
y_ = [[0.],[0.],[1.],[1.]]
### induction
# 1x2 input -> 2x3 hidden sigmoid -> 3x1 sigmoid output
# Layer 0 = the x2 inputs
x0 = tf.constant( x , dtype=tf.float32 )
y0 = tf.constant( y_ , dtype=tf.float32 )
# Layer 1 = the 2x3 hidden sigmoid
m1 = tf.Variable( tf.random_uniform( [2,3] , minval=0.1 , maxval=0.9 , dtype=tf.float32 ))
b1 = tf.Variable( tf.random_uniform( [3] , minval=0.1 , maxval=0.9 , dtype=tf.float32 ))
h1 = tf.sigmoid( tf.matmul( x0,m1 ) + b1 )
# Layer 2 = the 3x1 sigmoid output
m2 = tf.Variable( tf.random_uniform( [3,1] , minval=0.1 , maxval=0.9 , dtype=tf.float32 ))
b2 = tf.Variable( tf.random_uniform( [1] , minval=0.1 , maxval=0.9 , dtype=tf.float32 ))
y_out = tf.sigmoid( tf.matmul( h1,m2 ) + b2 )
### loss
# loss : sum of the squares of y0 - y_out
loss = tf.reduce_sum( tf.square( y0 - y_out ) )
# training step : gradient decent (1.0) to minimize loss
train = tf.train.GradientDescentOptimizer(1.0).minimize(loss)
### training
# run 500 times using all the X and Y
# print out the loss and any other interesting info
with tf.Session() as sess:
sess.run( tf.global_variables_initializer() )
for step in range(500) :
sess.run(train)
results = sess.run([m1,b1,m2,b2,y_out,loss])
labels = "m1,b1,m2,b2,y_out,loss".split(",")
for label,result in zip(*(labels,results)) :
print ""
print label
print result
print ""
Run Code Online (Sandbox Code Playgroud)
让我们来看看,但是以相反的顺序开始
sess.run(train)
Run Code Online (Sandbox Code Playgroud)
这告诉tensorflow查找由train定义的图节点并计算它. 火车被定义为
train = tf.train.GradientDescentOptimizer(1.0).minimize(loss)
Run Code Online (Sandbox Code Playgroud)
为了计算此tensorflow必须计算自动分化为损失,这意味着步行图形. 损失定义为
loss = tf.reduce_sum( tf.square( y0 - y_out ) )
Run Code Online (Sandbox Code Playgroud)
这是真正的张量流应用自动微分来展开第一个tf.reduce_sum,然后是tf.square,然后是y0 - y_out,这导致必须走y0和y_out的图形.
y0 = tf.constant( y_ , dtype=tf.float32 )
Run Code Online (Sandbox Code Playgroud)
y0是常量,不会更新.
y_out = tf.sigmoid( tf.matmul( h1,m2 ) + b2 )
Run Code Online (Sandbox Code Playgroud)
y_out将被处理类似于丢失,首先将处理tf.sigmoid等...
总而言之,每个操作(例如tf.sigmoid,tf.square)不仅定义了正向操作(应用sigmoid或square),还定义了自动区分所需的信息.这与标准的python数学不同,例如
x = 7 + 9
Run Code Online (Sandbox Code Playgroud)
上面的等式除了如何更新x之外什么也没有编码,其中as
z = y0 - y_out
Run Code Online (Sandbox Code Playgroud)
编码从y0减去y_out的图形并存储正向操作并足以在z中进行自动微分
归档时间: |
|
查看次数: |
13414 次 |
最近记录: |