一、介绍
Tensorflow是一个通过计算图的形式来表述计算的编程系统,计算图也叫数据流图,可以把计算图看做是一种有向图,Tensorflow中的每一个计算都是计算图上的一个节点,而节点之间的边描述了计算之间的依赖关系。
概念:
2015.11 Google开源
Tensor是张量,表示N维数组;Flow是流,表示基于数据流图计算。TensorFlow运行过程就是张量从图的一端运行到另一端的过程。数据流图:TensorFlow的核心所在,黑盒子;节点:数学操作(加减乘除等);线:连接各节点,节点之间相互联系的多维线型数组,就是张量。
特点:
灵活:只要有数据流图就能用TensorFlow
可移植性:支持CPU和GPU,适于台式机、服务器、手机移动端
自动求微分:内部实现了自动对于各种给定目标函数求导的公式
语言:Python,C++,Java,Go
性能高度优化
为啥选TensorFlow:
TensorFlow(最多)、Torch、Theano、Caffe、None、others
二、基础语法
数据属性:
其中用的最多的还是前几种数值型的:
tf.float32、tf.float64;
tf.int8、tf.int16、tf.int32、tf.int64;
tf.uint8;
tf.string;
节点:
基本用法:
程序结构:
TensorFlow图:
TensorFlow会话:
TensorFlow张量:
TensorFlow变量:
TensorFlow feed:
TensorFlow控制依赖:
TensorFlow设备:
TensorFlow变量作用域:
TensorFlow变量作用域:
TensorFlow可视化:
出错解决:tensorboard 报错OSError: [Errno 22] Invalid argument
TensorFlow线程和队列:
本质是异步计算的
TensorFlow 数据读取:
TensorFlow模型保存和提取:
TensorFlow分布式训练:
三、实例
TensorFlow实现逻辑回归:
# -- encoding:utf-8 --
"""
complicated by DingJing at 2019.8.8
用TensorFlow实现线性回归函数
"""
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
# 1. 构造数据
np.random.seed(28)
N = 100
x_data = np.linspace(0, 6, N) + np.random.normal(loc=0.0, scale=2, size=N)
y_data = 14 * x_data - 7 + np.random.normal(loc=0.0, scale=5.0, size=N)
# 将x和y设置成为矩阵
x_data.shape = -1, 1
y_data.shape = -1, 1
# 2. 定义两个placeholder存放输入数据
x = tf.placeholder(tf.float32, [None, 1])
y = tf.placeholder(tf.float32, [None, 1])
# 3. 模型构建
# 定义一个变量w和变量b
w = tf.Variable(initial_value=tf.random_uniform(shape=[1], minval=-1.0, maxval=1.0), name='w')
b = tf.Variable(initial_value=tf.zeros([1]), name='b')
# 构建一个预测值
y_hat = w * x + b
# 构建一个损失函数:以MSE作为损失函数(预测值和实际值之间的平方和)
loss = tf.reduce_mean(tf.square(y_hat - y), name='loss')
# 实现反向传播算法(以随机梯度下降的方式优化损失函数;在优化的过程中,是让loss函数最小化)
train = tf.train.GradientDescentOptimizer(0.05).minimize(loss)
# 4.运行
with tf.Session() as sess:
# 初始化:全局变量更新
sess.run(tf.global_variables_initializer())
# 进行训练(n次)
for step in range(100):
# 模型训练
sess.run(train, feed_dict={x: x_data, y: y_data})
# 获得预测值
prediction_value = sess.run(y_hat, feed_dict={x: x_data})
# 画图显示拟合结果
plt.figure()
plt.scatter(x_data, y_data) # 散点是真实值
plt.plot(x_data, prediction_value, 'r-', lw=5) # 曲线是预测值
plt.show()
方法二:
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
# 使用numpy生成200个随机点
x_data = np.linspace(-0.5, 0.5, 200)[:, np.newaxis]
noise = np.random.normal(0, 0.02, x_data.shape)
y_data = np.square(x_data) + noise
# 定义两个placeholder存放输入数据
x = tf.placeholder(tf.float32, [None, 1])
y = tf.placeholder(tf.float32, [None, 1])
# 定义神经网络中间层
Weights_L1 = tf.Variable(tf.random_normal([1, 10]))
biases_L1 = tf.Variable(tf.zeros([1, 10])) # 加入偏置项
Wx_plus_b_L1 = tf.matmul(x, Weights_L1) + biases_L1
L1 = tf.nn.tanh(Wx_plus_b_L1) # 加入激活函数
# 定义神经网络输出层
Weights_L2 = tf.Variable(tf.random_normal([10, 1]))
biases_L2 = tf.Variable(tf.zeros([1, 1])) # 加入偏置项
Wx_plus_b_L2 = tf.matmul(L1, Weights_L2) + biases_L2
prediction = tf.nn.tanh(Wx_plus_b_L2) # 加入激活函数
# 定义损失函数(均方差函数)
loss = tf.reduce_mean(tf.square(y - prediction))
# 定义反向传播算法(使用梯度下降算法训练)
train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
with tf.Session() as sess:
# 变量初始化
sess.run(tf.global_variables_initializer())
# 训练2000次
for i in range(2000):
sess.run(train_step, feed_dict={x: x_data, y: y_data})
# 获得预测值
prediction_value = sess.run(prediction, feed_dict={x: x_data})
# 画图
plt.figure()
plt.scatter(x_data, y_data) # 散点是真实值
plt.plot(x_data, prediction_value, 'r-', lw=5) # 曲线是预测值
plt.show()