主要知识点理解

tensor:张量 flow:流
TensorFlow是一个通过计算图的形式表示计算的编程系统,每个计算都是图上的一个节点,节点之间的边描述了计算之间的关系。

(1)TensorFlow编程基础

张量:

一种多维数组的数据结构,零阶张量称为标量,一阶张量为一个向量,n阶张量为一个n维数组;张量并没有真正的保存数据,只是存储的计算过程。不带小数点的张量默认为int32,带小数点的默认为float32。
类型有:实数、整数、布尔、复数。
初始化方式:

name_variable.initializer()
tf.global_variables_initializer()
变量更新语句:
update_op = tf.assign(variable_to_be_updated, new_value)

变量、常量和占位符区别

变量需要进行初始化;常量不需要进行初始化;占位符是一种特殊变量,暂时不知道初始值的变量,只是占位符不需要初始化操作。

TensorBoard使用方法

TensorBoard是TensorFlow的可视化工具, 通过TensorFlow程序运行过程中输出的日志文件可视化TensorFlow程序的运行状态,TensorBoard和TensorFlow程序跑在不同的进程中。

图卷积模型更新权重_图卷积模型更新权重

tensorboard –logdir=path(日志文件坐在的目录)
浏览器输入:http://localhost:6006
tf.summary.FileWriter——用于将汇总数据写入磁盘 
tf.summary.scalar——对标量数据汇总和记录 
tf.summary.histogram——记录数据的直方图 
tf.summary.image——将图像写入summary 
tf.summary.merge——对各类的汇总进行一次合并 
tf.summary.merge_all——合并默认图像中的所有汇总

(2)单变量线性回归

线性回归问题

给定数据集D={(x1, y1), (x2, y2), … },我们试图从此数据集中学习得到一个线性模型,这个模型尽可能准确地反应x(i)和y(i)的对应关系。

线性回归中的y变量(标签):是我们要预测的真实事物

线性回归中的{x1,x2,…,xn}变量(特征): 是指用于描述数据的输入变量

样本是指数据的特定实例:x

有标签样本具有{特征,标签}:{x,y}用于训练模型

  无标签样本具有{特征,?}:{x,?}用于对新数据做出预测

模型:将样本映射到预测标签

  训练模型:通过有标签样本来学习(确定)所有权重和偏差的理想值,训练模型的目标是从所有样本中找到一组平均损失“较小”的权重和偏差。

  一元线性回归:预测值和单个特征变量相关 y=w * x + b ;

  多元线性回归:预测值和多个特征变量相关Y = x1 * w1 + x2 * w2 + … + b;

损失:损失是对糟糕预测的惩罚:损失是一个数值,表示对于单个样本而言模型

预测的准确程度;

  L1损失:基于模型预测的值与标签的实际值之差的绝对值

  平方损失:一种常见的损失函数,又称为 L2 损失

  均方误差 (MSE) 指的是每个样本的平均平方损失(均方差)

模型训练:首先对权重w和偏差b进行初始猜测,然后反复调整这些猜测,直到获得损失可能最低的权重和偏差为止。

图卷积模型更新权重_图卷积模型更新权重_02

使用Tensorflow解决单变量线性回归问题的主要步骤

数据准备:生成数据或者导入数据,接着进行数据预处理;
模型构建:定义占位符,模型函数,模型结构;
训练模型:设置超参数,损失函数,优化器,创建会话,初始化,迭代训练;
进行预测:训练结果可视化,进行预测;

(3)多元线性回归

特征数据进行归一化

目的是让大的输入,大的信号映射到小范围里面
(特征值 - 特征值最小值)/ (特征值最大值 - 特征值最小值)

(4)卷积神经网络

卷积层与全连接层的区别

卷积层:卷积运算的主要目的是使原信号特征增强,并降低噪音。
全连接层:对生成的特征进行加权。
区别:卷积层的权重矩阵(卷积核)与输入矩阵尺寸不一致,而全连接层的权重举证和输入时意义对应的。

卷积核、多通道卷积及池化操作

卷积核:他是一个权值矩阵,卷积核对输入矩阵通过滑动窗口进行特征值提取生成特征图。
多通道卷积:一个卷积核提取一种特征,每个通道使用一个卷积核进行卷积操作,然后将这些特征图相同位置上的值相加,生成一张特征图。
池化:在卷积层之后使用,用于较少矩阵的长和宽从而达到减少参数的目的。分为均值池化和最大池化,前者对数据背景更敏感,后者对纹理特征更敏感。

(5)深度神经网络

数据增强的主要方式

旋转、翻转、平移、缩放、尺度变换、对比度变换、噪声扰动、颜色变换、人工增大训练集样本。

Deep Dream的技术原理

图卷积模型更新权重_tensorflow_03

Deep Dream就和名字一样,然机器做梦,比如通过指定标签为“海星”,然后更具预测结果调整输入图像的像素值(CNN调整的是卷积神经网络),使得预测结果更像“海星”。
方法:最大化输出层输出的某一类别概率,最大化卷积层某一通道激活值。

(6)NumPy/Pandas/Scipy的区别

NumPy

基础的数学计算模块,以矩阵为主,纯数学。

Pandas

提供了一套名为DataFrame的数据结构,适合统计分析中的表结构,在上层做数据分析。

Scipy

基于Numpy,提供方法(函数库)直接计算结果,封装了一些高阶抽象和物理模型。

零零散散

机器学习

机器学习是人工智能的一个分支,深度学习是机器学习的一种方法。
机器学习包括:
  1).有监督学习(事先准备好输入与正确的输出,需要大量训练数据);
    预测:线性回归/神经网络/AdaBoost/Gradient Boost
    分类:逻辑回归/决策树/随机森林/支持向量机/朴素贝叶斯/神经网络
  2).半监督学习(训练数据部分有标记):
  3).无监督学习(仅仅输入数据,数据没有标记,计算机自己找出数据内在结构):
    K-means 关联规则抽取
  4).强化学习(训练数据没有标记,但是有一个延迟的奖励与惩罚);

深度学习发展历程

1943提出数学上的神经元模型——1958提出感知机模型——1969数学证明单层盛景网络感知机无法对异或逻辑做出判断——1986反向传播的方法解决两层神经网络的算粒问题——1995支持向量机SVM诞生——1998卷积神经网络LeNet——2006深层次神经网络出现——2012AlexNet赢得挑战赛挂军——2016AlphaGo

计算图(数据流图)的概念

计算图是一个有向图,其包含一组节点(每个节点都代表一个操作,是一种运算)一组有向边(每条边代表节点之间的关系(数据传递和控制依赖))。
TensorFlow的边:
  常规边(实线):代表数据依赖关系。
  特殊边(虚线):不携带值,表示两个节点之间的控制相关性。

张量的属性

Tensor(“Add:2”, shape=(), dtype=float32),名字(节点名字)、形状(维度信息,层、行、列)、类型(每一个张量会有一个唯一的类型)

图卷积模型更新权重_图卷积模型更新权重_04

会话(session)

会话拥有并管理TensorFlow程序运行时的所有资源,当所有计算完成之后需要关闭会话帮助系统回收资源。为了防止忘记close,可以使用with语句块。TensorFlow不会自动生成默认的会话,需要手动指定。

梯度下降法

梯度:一个向量(矢量),具有大小和方向,表示某一函数在该点处的方向导数沿着 该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向) 变化最快,变化率最大;
批量:指的是用于在单次迭代中计算梯度的样本总数随机梯度下降法 (SGD) :每次迭代只使用一个样本(批量大小为 1),如果 进行足够的迭代,SGD 也可以发挥作用。“随机”这一术语表示构成各个批量的一个样本都是随机选择的小批量随机梯度下降法(小批量 SGD)是介于全批量迭代与SGD 之间的折衷方案。小批量通常包含10-1000个随机选择的样本。小批量SGD可以减少SGD中的杂乱样本数量,但仍然比全批量更高效。

学习率(经验值0.1-0.01)

用梯度乘以一个称为学习速率 (有时也称为步长)的标量, 以确定下一个点的位置。低学习率导致迭代过程太久,若太高导致越过最低点,并在最优点来回摆动。

超参数

在机器学习中,超参数是在开始学习过程之前设置值的参数,而不是通过训练得到的参数数据,是编程人员在机器学习算法中用于调整的旋钮。

常用的优化器

tf.train.GradientDescentOptimize
tf.train.AdadeltaOptimizer
tf.train.AdagradOptimizer
tf.train.AdagradDAOptimizer
tf.train.MomentumOptimizer
tf.train.AdamOptimizer
tf.train.FtrlOptimizer
tf.train.ProximalGradientDescentOptimizer
tf.train.ProximalAdagradOptimizer tf.train.RMSPropOptimizer

one_hot编码

一种稀疏向量,其中: 一个元素设为1所有其他元素均设为0,独热编码常用于表示拥有有限个可能值的字符串或标识符。将离散型特征使用one-hot编码,会让特征之间的距离计算更加合理。

数据集划分

构建和训练机器学习模型是希望对新的数据做出良好预测;

一种方法是将数据集分成两个子集:

  训练集 - 用于训练模型的子集

  测试集 - 用于测试模型的子集

图卷积模型更新权重_图卷积模型更新权重_05


一种方法是将数据集分成三个子集:

  训练集 - 用于训练模型的子集

  验证集 - 用于验证模型的子集

  测试集 - 用于测试模型的子集

图卷积模型更新权重_卷积_06

softmax思想

逻辑回归可生成介于0和1.0之间的小数。例如,某电子邮件分类器的逻辑回归输出值为0.8,表明电子邮件是垃圾邮件的概率为80%,不是垃圾邮件的概率为20%很明显,一封电子邮件是垃圾邮件或非垃圾邮件的概率之和为1.0。Softmax将这一想法延伸到多类别领域。在多类别问题中,Softmax会为每个类别分配一个用小数表示的概率。这些用小数表示的 概率相加之和必须是 1.0。

tensorflow游乐场

TensorFlow游乐场是一个通过网页浏览器就可以训练的简单神经网络 并实现了可视化训练过程 网址:http://playground.tensorflow.org

卷积神经网络(Convolutional Neural Network)

图卷积模型更新权重_机器学习_07

输入层、卷积层、降采样层、全连接层;

输入层:将每个像素代表一个特征节点输入到网络中。
卷积层:卷积运算的主要目的是使原信号特征增强,并降低噪音。
降采样层:降低网络训练参数及模型的过拟合程度,其中一种方法是池化。
全连接层:对生成的特征进行加权。

卷积

卷积核在 2 维输入数据上“滑动”,对当前输入部分的元素进行矩阵乘法,然后将结果汇为单个输出像素值,重复这个过程直到遍历整张图像,这个过程就叫做卷积。这个权值矩阵就是卷积核。卷积操作后的图像称为特征图(feature map)

图卷积模型更新权重_图卷积模型更新权重_08

多通道卷积

每个卷积核都会将图像生成为另一幅特征映射图,即:一个卷积核提取一种特征。为了使特征提取更充分,可以添加多个卷积核以提取不同的特征,也就是,多通道卷积。每个通道使用一个卷积核进行卷积操作,然后将这些特征图相同位置上的值相加,生成一张特征图。

池化

在卷积层之后常常紧接着一个降采样层,通过减小矩阵的长和宽,从而达到减少参数的目的。降采样是降低特定信号的采样率的过程。计算图像一个区域上的某个特定特征的平均值或最大值,这种聚合操作就叫做池化(pooling)。
附:除了通过池化降维,还可以通过步长为1的卷积降维。

卷积函数

tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None,name=None)
tf.nn.depthwise_conv2d(input, filter, strides, padding, name=None)
tf.nn.separable_conv2d(input, depthwise_filter, pointwise_filter, strides, padding, name=None)
tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None, name=None)
•input:需要做卷积的输入数据。注意:这是一个4维的张量([batch, in_height, in_width, in_channels]),要求类型为float32或float64其中之一。
•filter卷积核。[filter_height, filter_width, in_channels, out_channels]
•strides:图像每一维的步长,是一个一维向量,长度为4
•padding:定义元素边框与元素内容之间的空间。"SAME"或"VALID",这个值 决定了不同的卷积方式。当为"SAME"时,表示边缘填充,适用于全尺寸操作; 当为"VALID"时,表示边缘不填充。
•use_cudnn_on_gpu:bool类型,是否使用cudnn加速
•name:该操作的名称
• 返回值:返回一个tensor,即feature map

池化函数

最大池化:tf.nn.max_pool(value, ksize, strides, padding, name=None)
平均池化:tf.nn.avg_pool(value, ksize, strides, padding, name=None)

•value:需要池化的输入。一般池化层接在卷积层后面,所以输入通常是conv2d 所输出的feature map,依然是4维的张量([batch, height, width, channels])。
•ksize:池化窗口的大小,由于一般不在batch和channel上做池化,所以ksize一般是[1,height, width,1]。
•strides:图像每一维的步长,是一个一维向量,长度为4
•padding:和卷积函数中padding含义一样
•name:该操作的名称
•返回值:返回一个tensor

环境配置

安装

conda install tensorflow       #cpu版本
conda install tensorflow-gpu   #gpu版本,它会同时安装cpu,只是默认gpu,训练速度很可观
(买了个独显的电脑,可是不玩游戏,这下终于有用处了)
# 如果同时安装了两个版本,默认执行GPU版本,如想运行CPU版本,执行下面代码:
with tf.Session() as ses:
    with tf.device("/cpu:0"):
        matrix1=tf.constant([[3.,3.]])
        matrix2=tf.constant([[2.],[2.]])
        product=tf.matmul(matrix1,matrix2)

GPU版本安装后,你执行import tensorflow可能会发现还需要安装:

注意提示,有可能不需要安装,比如我的安装tensorflow时有cuDNN和cuda:

图卷积模型更新权重_机器学习_09

这么愉快地吗?如果你只看了上面,恭喜你被坑了。基本很大概率上你会遇到版本问题,建议按照如下步骤安装GPU版本的tensorflow。

  1. 查看自己的显卡是否支持CUDA,谷歌搜索gpu版本 SPECIFICATION查看是否支持
  2. 查看自己的显卡的驱动器版本
#进入到nividia的安装目录(或者你也可以添加环境变量)
cd C:\Program Files\NVIDIA Corporation\NVSMI
nvidia-smi
  1. CUDA:NVIDIA提供给程序使用GPU的接口,根据上图的驱动器版本选择cuda版本。图片来源:https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html
  2. cuDNN:a GPU-accelerated library of primitives for deep neural networks.根据cuda版本选择cudnn版本
    图片来源:https://developer.nvidia.com/rdp/cudnn-archive
  3. 根据cuda版本选择合适的tensorflow版本。图片来源:https://tensorflow.google.cn/install/source_windows

卸载

# 根据版本选择
conda uninstall tensorflow
conda uninstall tensorflow-gpu

问题

1.Tensorbord启动报错:OSError: [Errno 22] Invalid argument. 谷歌中文搜索半天没合适的结果,后来试了下英文搜索,说是tensorboard1.13和python3.6的一个bug,python需要升级到3.6.7及以上。

图卷积模型更新权重_机器学习_10

解决方案:

  1.conda create –n env_name pythnotallow=xxx

  activate env_name

  deactivate env_name

  conda info –e

  conda remove –n env_name --all

  新建一个env,但是不甘心这么绕过它;

  2.conda update conda

  conda update python

  这样升级直接到3.7了,搜过过程看到不少人回退到3.6的,不建议。

  3.conda install pythnotallow=xxx

  此种方法较好,只是对于这个问题,其他的还是新建一个环境的比较好。2.安装GPU版本后报错

图卷积模型更新权重_图卷积模型更新权重_11


报错显示驱动器版本和运行环境不相符合,看来是它自动安装的版本没有和本机的显卡型号适应,于是卸载cuda和cudnn重新安装相应的版本。tensorflow版本限制cuda版本,cuda版本决定cdnn版本,最后显卡支持哪个版本的cuda。所以先看驱动器版本找到对应的cuda版本,得到tensorflow版本,安装此版本的tensorflow顺带其他的也都安装且符合版本要求的。

显卡型号:NIVIDIA GeForce GTX 960M
显卡驱动版本:385.54
CUDA版本:9.0-----9.0.76
cudnn版本:7.5.0/7.4.2/7.4.1/…
tensorflow版本:1.12

解决问题:

卸载:conda uninstall tensorflow-gpu

安装:conda uninstall tensorflow-gpu=1.12.0

图卷积模型更新权重_tensorflow_12


我们可以发现大部分版本都是符合要求的,只是cudnn版本有点老,可以先安装cudnn-7.5.0,然后再执行上条指令。

解放CPU,开发GPU之后训练速度得到了大幅提升,很清爽!