一、tensorflow的处理结构:
1.形象理解:(来自莫烦)
Tensorsflow是采用data flow graphs(数据流图)来计算,首先我们得创建一个数据流图,然后将我们的数据以张量(tensor)的形式放到图中计算,''tensor'' ''flow'' 就是这么来的。可以看到上图就是一个完整的神经网络的图,图中节点代表数学操作,线代表数据tensor的流动,训练模型时tensor会不断的从数据流图中的一个节点flow到另一节点。
所以上图就是,在tensorflow的第一步就是建立一个这样的结构,然后把数据放到这样的一个结构中,让自己去运行,(tensor)向量在里面飞(flow),Input先飞到隐藏层(Relu)再飞到输出层(logit),梯度下降做数据处理,SGD train做数据完善。然后循环进行下一次tensorflow。
2.具体理解:
一个模型可以分为输入、中间节点、输出三大部分,tensorflow框架做的是让这三个部分连通起来学习规则并可以计算。tensorflow将节点和节点间的运算关系定义在‘图’上(图是静态的,只是负责把结构搭起来),然后通过一个sesssion‘会话’进行具体的运算。(会话是动态的,只有启动对话才会将数据流向图中,并按图中关系运算得出结果)
二、Tensorflow开发基本步骤:
1.声明张量:
(1)通过占位符定义(一般使用这个)
import tensorflow as tf
"""placeholder 是 Tensorflow 中的占位符,暂时储存变量.
Tensorflow 如果想要从外部传入data, 那就需要用到 tf.placeholder(),
然后以这种形式传输数据 sess.run(***, feed_dict={input: **})."""
#在 Tensorflow 中需要定义 placeholder 的 type ,一般为 float32 形式
input1= tf.placeholder(tf.float32)
input2= tf.placeholder(tf.float32)
# mul = multiply 是将input1和input2 做乘法运算,并输出为 output
ouput = tf.multiply(input1, input2)
"""接下来, 传值的工作交给了 sess.run() , 需要传入的值放在了feed_dict={}
并一一对应每一个 input. placeholder 与 feed_dict={} 是绑定在一起出现的"""
with tf.Session() as sess:
print(sess.run(ouput, feed_dict={input1: [7.], input2: [2.]}))
#结果:14
使用方法:
占位符只是将数据放入图中,从会话中的feed_dict参数获取数据。 要在图中放置占位符,我们必须对占位符执行至少 一个操作。
比如下面:我们初始化图形,将x声明为占位符,并将y定义为x上的identity操作,它只返回x。 然后,我们创建数据以进入x占位符并运行identity操作。 值得注意的是,TensorFlow不会在feed字典中返回一个自引用的占位符。
sess = tf.Session()
x = tf.placeholder(tf.float32, shape=[2,2])
y = tf.identity(x)
x_vals = np.random.rand(2,2)
sess.run(y, feed_dict={x: x_vals})
# Note that sess.run(x, feed_dict={x: x_vals}) will result in a self-referencing error.
三、最新情况:
这篇博客写到一半,还是觉得tensorflow各种用法好麻烦。查了一下,出了tensorflow2.0版本,1.x版本明年估计也停止维护了。。可能是看自己快被pytorch打败了,不得不做出的改变。所以我还是愉快地去学习一下tensorflow2.0,看看论文看看pytorch吧。。。
附上几个tf2.0的学习链接:
1.tf的改动:
https://www.jianshu.com/p/362a50826268
2.eager execution(让tf代码顺序执行!更加pythonic!)的学习例子:
https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/eager/python/examples