本文主要记录《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
6import 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
3x = 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
11w = 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
26import 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)
运行结果如下