Tensorflow 突发奇想地总结
你学的这些知识,将来工作又不用得到,那你学这个有什么意义?
1、可以把tensorflow 想象成汇编,即:
汇编拥有DataSegment 、 CodeSegment 、StackSegment等汇编运行的机制是 程序运行前,在DataSegment之中定义好,然后,在CodeSegment中写要执行的代码,mov AX ,0x333…之类。
2、而Tensor flow的机制如下:
可以理解为有: 数据段、计算关系段、执行(会话)
- 第一,先定义好 数据如 tf.get_variable 或者tf.placeholder 、tf.constant等等,
- 第二,其次定义他们之间的计算关系,如:
train_step = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss, global_step)
with tf.control_dependencies([train_step, variable_averages_op]):
# 先执行 train_step,再执行variable_averages_op
# 最后执行train_op
train_op = tf.no_op(name='train')
或者
layer2 = tf.matmul(layer1, weights) + biases
layer1 = tf.nn.relu(tf.matmul(input_tensor, weights) + biases)
等等。。。。。
- 第三,建立Session 上下文本管理空间,
在其中运行
with tf.Session() as see:
with tf.Session() as sess:
tf.global_variables_initializer().run()
for i in range(TRAINING_STEPS):
# 一次取100个数据,利用mnist内部func
xs, ys = mnist.train.next_batch(BATCH_SIZE)
# 列表[]中的是要计算的东西,feed_dict 是给其中用到的变量赋值
_, loss_value, step = sess.run([train_op, loss, global_step], feed_dict={x: xs, y_: ys})
3、Tensor flow的机制决定了其运行也与众不同:
cnt =tf.Variable(tf.zeros([2,2]))
x = tf.constant([[2.0,2.0],[1.0,1.0]],name='a')
y = tf.add(x,cnt)
y2 = tf.assign(cnt,y)
with tf.Session() as ses:
ses.run(tf.global_variables_initializer())
print(ses.run(y2))
for i in range(3):
print("~~~~~~~~")
ses.run(y2)
print(ses.run(cnt))
结果:
[[ 2. 2.]
[ 1. 1.]]
~~~~~~~~
[[ 4. 4.]
[ 2. 2.]]
~~~~~~~~
[[ 6. 6.]
[ 3. 3.]]
~~~~~~~~
[[ 8. 8.]
[ 4. 4.]]
所有定义的所谓的变量,都是代表了一种计算关系。比如:
-
y 代表的是 x和cnt相加这个运算
-
y2 代表的是把 y 幅值给 cnt 这个变量的操作
-
以上所说的计算关系,都是未发生的,如果想成真,那么就要在Session的run()方法来操作,如code所示。
-
此外,再调用运行y2的同时,也会调用到y,那么y2其实也包含着y的计算过程,如CODE所示,for i in range(3)中,运行了三次y2
-
那么就意味着,运行三次把 y 幅值给cnt 这个变量的操作,
-
而同时,y代表的是 x和cnt相加这个运算 ,
-
所以就是说把x和cnt相加这个运算 运行三次,每次都赋值给cnt
-
3、所以我有个想法就是:
我们不要把,y2和y看作变量,而是应该将他们看作是一个计算关系
而cnt 和x 才应该被看作变量或者常量,而对变量的幅值,是利用assign这个函数进行的。并不是直接等于。
以上的代码还可以,这么来看
cnt =tf.Variable(tf.zeros([2,2]))
x = tf.constant([[2.0,2.0],[1.0,1.0]],name='a')
y = tf.add(x,cnt)
y2 = tf.assign(cnt,y)
with tf.Session() as ses:
ses.run(tf.global_variables_initializer())
print(ses.run(y2))
print('~~~~~~~~~~')
print(ses.run(y2))
print('~~~~~~~~~~')
print(ses.run(y2))
结果:
[[ 2. 2.]
[ 1. 1.]]
~~~~~~~~~~
[[ 4. 4.]
[ 2. 2.]]
~~~~~~~~~~
[[ 6. 6.]
[ 3. 3.]]
每次ses.run(y2),都是代表执行了y2这个计算关系,即把y赋值给cnt,
cnt是常量,而y是计算关系,所以y这个计算关系也被执行。
4、另一个例子就是在模型训练的时候:
with tf.name_scope('train'):
y_ = tf.multiply(w,x,name='output_y')
y = tf.constant(0.0,name='True_y')
loss =tf.pow(y_-y,2,name='loss')
train_step = tf.train.GradientDescentOptimizer(LearningRate).minimize(loss)
with tf.Session() as ses:
ses.run(tf.global_variables_initializer())
for i in range(100):
temp = ses.run(train_step)
print("loss: ",ses.run(loss))
print("w: ",ses.run(w))
结果:
loss: 1.06228e-19
w: 1.62963e-10
可以看到在整个Session的for循环当中,只调用了run(train_step)这个计算关系,然而,却能可以在最后读取到训练完毕的 loss损失和W权重。