Tensor flow临时总结

本文深入解析TensorFlow的工作机制,从数据段、计算关系段到执行(会话),并通过实例演示如何定义变量、计算关系及执行流程,揭示了TensorFlow独特的运行方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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权重。

可见该思路正确可以作为记忆

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值