创建图和启动图
import tensorflow as tf
# 创建一个常亮op 1行2列
m1 = tf.constant([[3,3]]) # 注意矩阵的表示方法([])
# 创建一个常亮op 2行1列
m2 = tf.constant([[2], [3]]) # 注意矩阵的表示方法
# 创建一个矩阵乘法op,把m1和m2传入
product = tf.matmul(m1, m2)
# print(product) err
# 定义一个会话 启动默认图
sess = tf.Session()
# 调用sess的run方法来执行矩阵乘法op
# run(product)触发了图中3个op
result = sess.run(product)
print(result)
sess.close()
运行结果:
上面的改进:
import tensorflow as tf
# 创建一个常亮op 1行2列
m1 = tf.constant([[3,3]]) # 注意矩阵的表示方法([])
# 创建一个常亮op 2行1列
m2 = tf.constant([[2], [3]]) # 注意矩阵的表示方法
# 创建一个矩阵乘法op,把m1和m2传入
product = tf.matmul(m1, m2)
# 方法2:不需要关闭了,自动关闭
with tf.Session() as sess:
# 调用sess的run方法来执行矩阵乘法op
# run(product)触发了图中3个op
result = sess.run(product)
print(result)
变量介绍
import tensorflow as tf
# 定义一个变量,需要初始化
x = tf.Variable([1, 2])
# 定义一个常量
a = tf.constant([3, 3])
# 增加一个减法op
sub = tf.subtract(x, a)
# 增加一个加法op
add = tf.add(x, sub)
# 全局变量初始化
init = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
print(sess.run(sub))
print(sess.run(add))
# 创建一个变量初始化为0 name以后有用
state = tf.Variable(0, name='counter')
# 创建一个op作用作用是使state+1
new_value = tf.add(state, 1)
# 赋值op: tf中不能用=赋值
update = tf.assign(state, new_value)
# 变量初始化
init = tf.global_variables_initializer()
# 函数原型:range(start, end, scan):
# 参数含义:start:计数从start开始。默认是从0开始。例如range(5)等价于range(0, 5);
# end:技术到end结束,但不包括end 。例如:range(0, 5)是[0, 1, 2, 3, 4]没有5
# scan:每次跳跃的间距,默认为1。例如:range(0, 5) 等价于 range(0, 5, 1)
# for num in range(10,20): # 迭代 10 到 20 之间的数字
with tf.Session() as sess:
sess.run(init)
print(sess.run(state))
for _ in range(5):
sess.run(update)
print(sess.run(state))
运行结果:
[-2 -1]
[-1 1]
0
1
2
3
4
5
Fetch和Feed
import tensorflow as tf
# Fetch 在会话中可以同时运行多个op
input1 = tf.constant(3.0)
input2 = tf.constant(2.0)
input3 = tf.constant(5.0)
add = tf.add(input2, input3)
mul = tf.multiply(input1,add)
with tf.Session() as sess:
result = sess.run([mul, add]) # Fetch: [mul, add]
print(result)
# Feed: 先创建占位符,运行的时候再把值传入
# 创建占位符
input1 = tf.placeholder(tf.float32) # 占位符placeholder
input2 = tf.placeholder(tf.float32)
output = tf.multiply(input1, input2)
with tf.Session() as sess:
# Feed数据以{}字典形式传入
print(sess.run(output, feed_dict={input1:[7.], input2:[2.]}))
运行结果:
[21.0, 7.0]
[14.]
直线拟合
import tensorflow as tf
import numpy as np
# 使用numpy生成100个随机点
x_data = np.random.rand(100)
y_data = x_data*0.1 + 0.2 # y = 0.1x + 0.2
# 构造一个线性模型
b = tf.Variable(1.1) # 0. 浮点型
k = tf.Variable(0.5)
y = k*x_data + b
# 优化b,k使y接近y_data
# 二次代价函数
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 step in range(201):
sess.run(train)
if step % 20 == 0: # 每训练20次打印一次k,b
print(step,sess.run([k, b]))
运行结果:
0 [0.2603341, 0.65777206]
20 [0.057515964, 0.22323903]
40 [0.07396434, 0.21424147]
60 [0.08404451, 0.20872763]
80 [0.09022198, 0.20534857]
100 [0.09400769, 0.20327778]
120 [0.09632771, 0.20200874]
140 [0.0977495, 0.20123102]
160 [0.09862083, 0.2007544]
180 [0.0991548, 0.20046233]
200 [0.099482045, 0.20028332]