深度学习实战()启动并运行TensorFlow

本文主要记录《Sklearn与TensorFlow 机器学习实用指南》中的理论知识拓展和实践问题中解决方案的总结

大纲

TensorFlow概念

TensorFlow是一款用于数值计算的强大的开源软件库,特别适用于大规模机器学习的微调,基本原理是在python中定义要执行的计算图,然后TensorFlow使用该图并使用优化的C++代码高效运行,最主要的是TensorFlow可以分布式计算,因而可以训练一个拥有数百万个参数的网络,是一个十分强大的工具

安装TensorFlow

执行命令

1
$ pip3 install --upgrade tensorflow

显示Successfully installed 后面就有安装好的包的名称和版本号

测试安装命令
1
$ python -c 'import tensorflow; print(tensorflow.__version__)'

构建计算图谱并运行

首先先构建一个简单的计算图谱

1
2
3
4
5
6
import tensorflow as tf
if __name__ == '__main__':
# 创建一个图谱
x = tf.Variable(3, name="x")
y = tf.Variable(4, name="y")
f = x*x*y + y + 2

运行图谱在tf中是以会话的方式,在会话中需要初始化变量,运行图谱,关闭会话
会话类型有常规会话默认会话,一般采取默认会话
创建默认会话有两种方式:模块化创建非模块创建

  • 模块化创建会话是使用with as结构创建会话
    1
    2
    3
    4
    5
    6
    7
    8
    9
    # 默认会话创建 自动创建会话 自动关闭会话
    # 将全部需要初始化的变量集合
    init = tf.global_variables_initializer()
    with tf.Session() as sess:
    # 初始化变量
    init.run()
    # 当于执行 tf.get_default_session().run(f)
    result = f.eval()
    print(result)
  • 非模块化创建会话是使用InteractiveSession(),需要手动关闭对话
    1
    2
    3
    4
    5
    6
    7
    # 非模块创建默认会话 需手动关闭回话
    init = tf.global_variables_initializer()
    sess = tf.InteractiveSession()
    init.run()
    result = f.eval()
    print(result)
    sess.close()

管理图谱

所有创建的节点都会添加到默认图中,如

1
2
3
x = tf.Variable(3, name="x")
# 默认图
print(x.graph is tf.get_default_graph())

也可以创建一个新的图作为一个块中的默认图,如

1
2
3
4
5
6
7
# 新图作为块的默认图
graph = tf.Graph()
with graph.as_default():
z=tf.Variable(2)

print(z.graph is tf.get_default_graph())
print(z.graph is graph)

节点值的声明周期

tf中节点值初始化时会启动其生命周期,在会话结束时关闭
在会话中每一条语句执行都会重新初始化变量,因此相互执行的会话语句中的中间变量计算结果不能共享,若需要共享需要在一条语句(一个图形)中运行

1
2
3
4
5
6
7
8
9
10
11
w = tf.constant(3)  
x = w + 2
y = x + 5
z = x * 3

with tf.Session() as sess:
# 同一图形中运行计算 共享中间计算变量结果
y_val, z_val = sess.run([y, z])
# 若直接执行print操作 会计算两次w和x变量结果
print(y.eval())
print(z.eval())

TF正则方程实现线性回归

1.获取数据:我们首先需要导入sklearn库来导入数据,这里使用california_housing的数据
2.创建图谱:利用tf创建图谱,由于这里使用正则方程求解线性回归,因此需要四个变量,X,Y,X的转置和参数theta
3.创建会话计算结果:创建一个会话来执行图谱进行计算thera并打印出来

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import tensorflow as tf
import numpy as np
from sklearn.datasets import fetch_california_housing

if __name__ == '__main__':
# 1.获取数据
housing = fetch_california_housing()
# print(housing.data.shape) # (20640, 8)
m,n = housing.data.shape
# np.c_()函数将重排数据 增加了一项feature为1
housing_data_plus_bias = np.c_[np.ones((m, 1)), housing.data]
# print(housing_data_plus_bias.shape) # (20640, 9)

# 2.创建图谱 四个变量
X = tf.constant(housing_data_plus_bias, dtype=tf.float32, name="X")
y = tf.constant(housing.target.reshape(-1, 1), dtype=tf.float32, name="y")
# XT为X的转置
XT = tf.transpose(X)
# tf.matmul(A,B)表示A和B的点乘
# tf.matrix_inverse(X) 表示矩阵X的逆
theta = tf.matmul(tf.matmul(tf.matrix_inverse(tf.matmul(XT, X)), XT), y)

# 3.创建会话运行图谱
with tf.Session() as sess:
theta_value = theta.eval()
print(theta_value)

运行结果如下