TensorFlow学习笔记——概述、安装、常用函数
- Google Brain 团队为深度神经网络(DNN)开发的功能强大的开源软件库
- 开源深度学习库 TensorFlow 允许将深度神经网络的计算部署到任意数量的 CPU 或 GPU 的服务器、PC 或移动设备上,且只利用一个 TensorFlow API。
- 学习网站:http://c.biancheng.net/tensorflow/
- 学习视频:
- 一.概述
- 什么是机器学习:
- 机器学习是一种统计学方法,计算机利用已有数据,得出某种模型,再利用此模型预测结果。随着经验的增加,效果会变化。是人工智能的子集
- 三要素:数据,算法,算力
- 机器学习是一种统计学方法,计算机利用已有数据,得出某种模型,再利用此模型预测结果。随着经验的增加,效果会变化。是人工智能的子集
- 什么是深度学习:
- 是深层次神经网络,是机器学习的一种实现方法,是机器学习的子集。
- 是深层次神经网络,是机器学习的一种实现方法,是机器学习的子集。
- 什么是机器学习:
- 二. tensorflow神经网络基础
- 基于Tensorflo的NN: 用张量表示数据,用计算图搭建神经网络,用绘画执行计算图,优化线上的权重(参数),得到模型。
- 张量(tensor): 多维数组, 阶 : 张量的维数 (张量可以表示0阶到n阶数组)
- 维数 阶 名字 例子
- 0-D 0 标量 scalar s=1 2 3
- 1-D 1 向量 vector v=[1,2, 3]
- 2-D 2 矩阵 matrlx m=[[1, 2 , 3],[4,5,6]]
- n-D n 张量 tensor t=[[[...]]]
- 维数 阶 名字 例子
- 计算图(Graph): 搭建神经网络的计算过程,只搭建,不运算。
- 会话(Session): 执行计算图中的节点运算
- 神经网络的实现过程:
- 1. 准备数据集,提取特征,作为输入喂给神经网络
- 2. 搭建NN结构,从输入到输出(先搭建计算图,再用会话执行)
- (NN前向传播算法--> 计算输出)
- (NN前向传播算法--> 计算输出)
- 3. 大量特征数据为给NN,迭代优化NN参数
- (NN反向传播算法 --> 优化参数训练模型)
- (NN反向传播算法 --> 优化参数训练模型)
- 4. 使用训练好的模型预测和分类
- 1. 准备数据集,提取特征,作为输入喂给神经网络
- 前向传播:搭建模型,实现推理(以全连接网络为例 )
- eg. 生成一批零件将体积x1和重量x2为特征输入NN, 通过NN后输出一个数值。
- eg. 生成一批零件将体积x1和重量x2为特征输入NN, 通过NN后输出一个数值。
- 反向传播: 训练模型参数,在所有参数上用梯度下降,使NN模型再训练数据上的损失函数最小
- 损失函数(loss): 预测值(y)与已知答案(y_)的差距
- 均方误差MSE:MSE(y_,y)=
- loss=tf.reduce_mean(tf.square(y_-y))
- loss=tf.reduce_mean(tf.square(y_-y))
- 反向传播训练方法:以减小loss值为优化目标
- 学习率:决定参数每次更新的幅度
- 学习率:决定参数每次更新的幅度
- 基于Tensorflo的NN: 用张量表示数据,用计算图搭建神经网络,用绘画执行计算图,优化线上的权重(参数),得到模型。
- 三、安装
- 前提是系统安装了 Python 2.5 或更高版本
- 最好装在虚拟环境:下载安装Anaconda: https://www.continuum.io/downloads
- 前提是系统安装了 Python 2.5 或更高版本
- 四、Tensorflow 结构
- tf程序通常 被组织成一个构建图阶段和一个执行图阶段。
- 在构建阶段,数据与操作的执行步骤被描述成一个图。
- 在执行阶段,使用会话执行构建好的图中的操作。
- 图和会话:
- 图:这是tf将计算表示为指令之间的依赖关系的一种表示法
- 会话: tf跨一个或多个本地或远程设备运行数据流图的机制
- 图:这是tf将计算表示为指令之间的依赖关系的一种表示法
- 张量:tf中的基本数据对象
- 节点:提供图当中执行的操作
- 4.1 数据流图:
- TensorFlow是一个采用数据流图,用于数值计算的开源框架
- 节点(Operation)在途中表示数学操作,线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)
- 4.1.1 什么是图结构:
- 图包含了一组tf.Operation的操作
- 图包含了一组tf.Operation的操作
- 4.1.2 图操作
- 默认图
- 查看图:tf.get_default_graph()或 .graph直接查看属性
- 查看图:tf.get_default_graph()或 .graph直接查看属性
- 创建图
- new_g = tf.Graph()自定义创建图
- 定义数据和操作
- with new_g.as_default():
- a_new = tf.constant(20)
- b_new = tf.constant(20)
- print(a_new + b_new)
- a_new = tf.constant(20)
- with new_g.as_default():
- new_g = tf.Graph()自定义创建图
- 默认图
- 4.1.3 TensorBoard可视化
- 1. 数据序列化 -events文件
- TensorBoard通过读取TensorFlow的事件文件来运行,需要将数据生产一个序列化的summery protouf对象。
- tf.summary.FileWriter("./tmp/summary", graph=sess.graph)
- tf.summary.FileWriter("./tmp/summary", graph=sess.graph)
- TensorBoard通过读取TensorFlow的事件文件来运行,需要将数据生产一个序列化的summery protouf对象。
- 2. 启动TensorBoard
- tensorboard --logdirs"./tmp/summary"
- tensorboard --logdirs"./tmp/summary"
- 1. 数据序列化 -events文件
- TensorFlow是一个采用数据流图,用于数值计算的开源框架
- 5. Operation的介绍
- 定义操作
- 定义操作
- tf程序通常 被组织成一个构建图阶段和一个执行图阶段。
- 五、定义张量
- 张量的形状
- shape=(3, 3, 3) # shape中,隔开了几个数字就是几维
- shape=(3, 3, 3) # shape中,隔开了几个数字就是几维
- 定义一个张量
- tf.constant([[1,2]], dtype=tf.int64)
- tf.constant([[1,2]], dtype=tf.int64)
- 将numpy数据类型转为Tensor
- b = np.arange(0,5)
- tf.convert_to_tensor(b, dtype=tf.int64)
- b = np.arange(0,5)
- 创建全为0的张量
- tf.zeros(维度) # tf.zeros([3,2]) 创建一个二维的张量,每维里3个元素,元素全为0
- tf.zeros(维度) # tf.zeros([3,2]) 创建一个二维的张量,每维里3个元素,元素全为0
- 创建全为1的张量
- tf.ones(维度)
- tf.ones(维度)
- 创建全为指定值的张量
- tf.fill(维度, 指定值)
- tf.fill(维度, 指定值)
- 生成正态分布的随机数,默认均值为0,标准差为1
- tf.random.normal(维度, mean=均值, stddev=标准差)
- tf.random.normal(维度, mean=均值, stddev=标准差)
- 生成截断式正态分布的随机数
- tf.random.truncated_normal(维度, mean=均值, stddev=标准差)
- tf.random.truncated_normal(维度, mean=均值, stddev=标准差)
- 生成均匀分布随机数[minval, maxval]
- tf.random.uniform(维度, minval=最小值, maxval=最大值)
- tf.random.uniform(维度, minval=最小值, maxval=最大值)
- 张量的形状
- 六、常用函数
- 强制tensor转换为该数据类型
- tf.cast(张量名, dfype=数据类型)
- 例:
- x1 = tf.constant([1.,2.,3.], dtype=tf.float64)
- tf.cast(x1, tf.int32)
- x1 = tf.constant([1.,2.,3.], dtype=tf.float64)
- tf.cast(张量名, dfype=数据类型)
- 计算张量维度上元素的最小值
- tf.reduce_min(张量名)
- tf.reduce_min(张量名)
- 计算张量维度上元素的最大值
- tf.reduce_max(张量名)
- tf.reduce_max(张量名)
- 理解axis
- 在一个二维张量或数组中,可以通过调整axis等于0或1控制执行维度。
- axis=0代表跨行(经度, down),而axis=1代表跨列(纬度,across)
- 如果不指定axis,则所有元素参与计算。
- 比如:
- tf.reduce_mean(张量名, axis=操作轴) # 通过axis控制操作的维度求均值
- tf.reduce_mean(张量名, axis=操作轴) # 通过axis控制操作的维度求均值
- 在一个二维张量或数组中,可以通过调整axis等于0或1控制执行维度。
- tf.Variable()
- 将变量标记为“可训练”,被标记的变量会在反向传播中记录梯度信息。神经网络训练中,常用该函数标记待训练参数。
- tf.Variable(初始值)
- w= tf.Variable(tf.random.normal([2,2],mean=0,stddev=1)) # 将随机生成的符合正态分布的张量标记为“可训练”
- w= tf.Variable(tf.random.normal([2,2],mean=0,stddev=1)) # 将随机生成的符合正态分布的张量标记为“可训练”
- 将变量标记为“可训练”,被标记的变量会在反向传播中记录梯度信息。神经网络训练中,常用该函数标记待训练参数。
- 数学运算
- 四则运算tf.add, tf.subtract, tf.multiply, tf.divide
- 只有维度相同的张量才可以进行四则运算
- 只有维度相同的张量才可以进行四则运算
- 平方、次方、开方 tf.square, tf.pow(张量, n次方) , tf.sqrt
- 矩阵乘:tf.matmul(矩阵1, 矩阵2)
- 四则运算tf.add, tf.subtract, tf.multiply, tf.divide
- 把标签和特征进行配对的函数
- data = tf.data.Dataset.from_tensor_slices((输入特征, 标签))
- features = tf.constant([1,2])
- labels = tf.constant([0,1])
- data = tf.data.Dataset.from_tensor_slices((features,labels))
- print(data)
- for e in data:
- print(e)
- features = tf.constant([1,2])
- Numpy 和Tensor格式都可以用该语句读入数据
- data = tf.data.Dataset.from_tensor_slices((输入特征, 标签))
- tf.GradientTape
- with结构记录计算过程,gradient求出张量的梯度
- with tf.GradientTape() as tape:
- 计算过程
- 计算过程
- grad=tape.gradient(函数, 对谁求导)
- with tf.GradientTape() as tape:
- with结构记录计算过程,gradient求出张量的梯度
- tf.one_hot 独热编码
- 在分类问题中,常用独热码做标签,
- 标记类别:1 是,0 非
- 标记类别:1 是,0 非
- tf.one_hot(待转换数据, depth=几分类)
- 在分类问题中,常用独热码做标签,
- tf.nn.softmax(x)
- 使n分类的n个输出符合概率分布
- 使n分类的n个输出符合概率分布
- assign_sub
- 赋值操作,更新参数的值并返回。
- 调用assign_sub前,先用tf.Variable定义变量w为可训练(可自更新)
- w.assign_sub(w要自减的内容)
- w = tf.Variable(4)
- w.assign_sub(1) # w-=1
- w = tf.Variable(4)
- 赋值操作,更新参数的值并返回。
- tf.argmax(张量, axis=操作轴)
- 返回沿指定维度最大值的索引
- 返回沿指定维度最大值的索引
- 强制tensor转换为该数据类型