一: 基本概念
-
使用图 (graph) 来表示计算任务.
-
在被称之为 会话 (Session) 的上下文 (context) 中执行图.
-
使用 tensor 表示数据.
-
通过 变量 (Variable) 维护状态.
-
使用 feed 和 fetch 可以为任意的操作(arbitrary operation) 赋值或者从其中获取数据.
二:创建图和启动图
import tensorflow as tf
#首先是构造节点
#创建一个常量op
m1 = tf.constant([[3,3]])
#创建另一个常量op
m2 = tf.constant([[2],[4]])
#创建一个矩阵乘法的op
product = tf.matmul(m1,m2)
print(product) #此时product依然是一个op,还没有被运算
Tensor(“MatMul_1:0”, shape=(1, 1), dtype=int32)
# 创建一个会话,启动默认图
sess = tf.Session()
#调用run方法,进行运算,触发了3个op.
result = sess.run(product)
print(result)
sess.close() #最后要关闭session.
创建会话的另外一种方法(常用):
#另一种方法调用session,执行会话,不用关闭sess.
with tf.Session() as sess:
result = sess.run(product)#运行着一个节点,与之相关的节点都会被运行
print(result)
三:变量
最重要的一步是在进行session运算之前,进行变量初始化!!
import tensorflow as tf
#添加一个变量op
x = tf.Variable([[3,8]])
#添加一个常量op
a = tf.constant([[1,5]])
#增加一个减法op
sub = tf.subtract(x,a)
#增加一个加法op
add = tf.add(x,sub)
#变量初始化,很重要!!
init = tf.global_variables_initializer()
#构建一个session
with tf.Session() as sess:
sess.run(init)#在会话中先进行初始化
print(sess.run(add))
print(sess.run(sub))
输出结果:
[[2 3]]
[[5 11]]
下边的代码是在tensorflow中进行循环。
state = tf.Variable(0,name = "counter")
new_value = tf.add(state,1)
update = tf.assign(state,new_value)#变量赋值
init = tf.global_variables_initializer()#变量初始化,重要!!
# print(type(state))
#构建会话
with tf.Session() as sess:
sess.run(init)
# print(sess.run(new_value))
for _ in range(5):
sess.run(new_value)
print(sess.run(update))
输出结果:
1
2
3
4
5
四:fetch和feed方法
import tensorflow as tf
#fetch
#定义三个常量op
input1 = tf.constant(2.0)
input2 = tf.constant(3.0)
input3 = tf.constant(4.0)
#定义一个加法op和一个乘法op
add = tf.add(input1,input2)
mul = tf.multiply(add,input3)
with tf.Session() as sess:
print(sess.run([add,mul]))#fetch方法的特点就是可以同时run多个op
输出结果:
[5.0, 20.0]
#feed
#准备两个占位符
input1 = tf.placeholder(tf.float32)
input2 = tf.placeholder(tf.float32)
add = tf.add(input1,input2)
with tf.Session() as sess:
print(sess.run(add,feed_dict = {input1 : 3.0,input2:4.0}))#在run时传入参数,以字典的形式传入参数
输出结果:
7.0
五:tensorflow简单实例
import tensorflow as tf
import numpy as np
#生成100个随机数
x_data = np.random.randn(100)#生成100个符合正态分布的随机数
t_data = np.random.rand(100)#生成100个0-1之间均匀分布的随机数
#构造一个多元线性方程
y_data = x_data * 1.5 + 0.5 * t_data + 0.8
#构造一个多元线性模型
#定义三个变量
b = tf.Variable(0.)
k = tf.Variable(0.)
m = tf.Variable(0.) #0后边有一个小数点表示变量初始值为浮点型
#构造一个模拟的函数
y = x_data * b + k * t_data + m
#构造一个损失函数(二次代价函数)
loss = tf.reduce_mean(tf.square(y_data-y))#先求差值的平方,然后求平均
#构造一个优化器
optimizer = tf.train.GradientDescentOptimizer(0.2)#梯度下降法优化,学习率为0.2
#最小化代价函数
train = optimizer.minimize(loss)
#变量初始化
init = tf.global_variables_initializer()
#构建一个会话
with tf.Session() as sess:
sess.run(init)
for i in range(501):
sess.run(train)
if i%50 == 0:
print(i,sess.run([b,k,m]))
输出结果:
0 [0.54393262, 0.31414878, 0.53052932]
50 [1.4995866, 0.50569946, 0.79704297]
100 [1.499871, 0.50177789, 0.79907757]
150 [1.4999597, 0.50055462, 0.79971224]
200 [1.4999874, 0.50017303, 0.79991019]
250 [1.4999961, 0.50005412, 0.79997194]
300 [1.4999987, 0.50001693, 0.79999119]
350 [1.4999995, 0.50000542, 0.79999721]
400 [1.4999998, 0.50000167, 0.79999918]
450 [1.4999998, 0.50000155, 0.79999918]
500 [1.4999998, 0.50000155, 0.79999918]
可以看出经过500次迭代之后,b,k,m均已经收敛到了真实值附近。