1.概述
TensorFlow是一种图计算框架,所有的计算操作被声明图(graph)中的节点(Node)。声明变量或者常量的过程并不执行实际的操作,而是向图中增加节点
a=tf.constant(1,name='one')#增加节点的操作,声明一个变量,同时指定该变量名字
b=tf.constant(2,name='two')#Graph中所有的数据均以tensor来存储和表达
print(a)#Tensor("Const:0", shape=(), dtype=int32)节点信息
c=tf.add(a,b)#或者c=a+b
print(c)#Tensor("add:0", shape=(), dtype=int32)
mat_a=tf.constant([[1,1,1],[2,2,2]])
mat_b=tf.constant([[3,3,3],[4,4,4]])
mul_a_b=mat_a*mat_b#相当于tf.multiply==点乘==操作
tf_matmul_a_b=tf.matmul(mat_a,tf.transpose(mat_b),name='matmul_with_name')
##显示图结构操作:【三步曲】
this_graph=tf.get_default_graph()
this_graph_def=this_graph.as_graph_def()
print(this_graph_def)#显示出每个节点的:节点名称【节点名称可以在声明中指定】、节点操作、属性
##显示结果:也就是进程,执行程序的过程:【三步曲】
sess=tf.Session()
mul_value,tf_mul_value=sess.run([mul_a_b,tf_matmul_a_b])
print(mul_value,tf_mul_value)
注意1:一个进程就是程序一次运行,而Session就是一个
注意2:不知道自己的output,不关心自己的输出去了哪,逐层递推到constant或者placeholder找到input
计算单元:Tensor、Constant、Variable、placeholder
#【placeholder的应用】:placeholder是一个占位符,通常代表着从外界的输入值,None表示尚不确定的维度
x=tf.placeholder(dtype=tf.float,shape=[None,2])#指定类型和维度
y=tf.placeholder(dtype=tf.float32,shape=[None,2])
#【Variable的应用】:声明一个变量,变量的含义是在后面优化过程中需要更新的权重偏置等参数,==它的维度是需要指定确定==,需要更新的都需要声明为variable
w=tf.Variable(tf.zeros([2,1]))
b=tf.Variable(tf.zeros([2,1]))
#【前向计算】
logits = tf.matmul(x, w) + b
output = tf.nn.sigmoid(logits)
cross_entropy = tf.losses.sigmoid_cross_entropy(multi_class_labels=y, logits=logits)
#【反向计算】
"这里我们创建了一个GradientDescentOptimizer类,并调用了minimize方法作为一个训练的step。
minimize中包含两个操作compute_gradients和apply_gradients。
注意我们并不在这里循环"
train_step = tf.train.GradientDescentOptimizer(0.3).minimize(cross_entropy)
#train_step是一个op,并不会产生一个tensor(数值)
#【定义输入值】
x_value = np.array(
[[1,1],
[1,0],
[0,1],
[0,0]])
y_value = np.array(
[[1],
[1],
[1],
[0]])
#【变量的整个操作:声明-->初始化节点-->加载】
init_op = tf.global_variables_initializer()#添加用于初始化的节点
sess = tf.Session()#加载,真正初始化相关的Variables
sess.run(init_op)
"#在session.run里进行迭代循环【更新节点】,而不是在graph里迭代循环【增加节点】,run里包含要执行的变量"
for current_step in range(100):
cross_entropy_value, output_value, _ = sess.run(
[cross_entropy, output, train_step],
feed_dict={x:x_value,
y:y_value} )
cross_entropy_value, logits_value, output_value, w_value, b_value = sess.run(
[cross_entropy, logits, output, w, b],
feed_dict={x:x_value,
y:y_value} )
print(cross_entropy_value)
print(logits_value)
print(output_value)
print(w_value)
print(b_value)
2. 总结
- Op/Node/ProtoBuf
- Graph/Session
- Tensor/Constant/Variable/placeholder
- Control Flow
- 所有tf.的操作均不是实际计算动作,而是生成节点Node
- Node属性包括name/op/input/Device/Attr
- Graph通过ProtoBuf持久化,Graph的一次运行表现为Session
- ProtuBuf:Google protocol buffers,是用于协议编码的工具库,是一种二进制的数据格式
- Tensor属性[1]
- device:表示tensor将被产生的设备名称
dtype:tensor元素类型
graph:这个tensor被哪个图所有
name:这个tensor的名称
op:产生这个tensor作为输出的操作(Operation)
shape:tensor的形状(返回的是tf.TensorShape这个表示tensor形状的类)
value_index:表示这个tensor在其操作结果中的索引
- device:表示tensor将被产生的设备名称