深度学习Python笔记

文章目录

  • TensorFlow中的数据类型
    • 一、数值类型
      • 用TensorFlow创建张量
    • 字符串类型
    • bool类型
  • 张量切片(Tensor slicing)
  • 现实中的数据张量
  • 张量的运算
  • 目标(损失)函数
  • Keras
  • 对标签向量化
  • 机器学习的分类
  • 神经网络的数据预处理
  • 编码
    • Embedding层
  • 如何利用keras的延展性
  • 几种激活函数的比较
  • PS:

TensorFlow中的数据类型

一、数值类型

1、标量(scalar)单个的实数,dimension为0,shape为[ ]
2、向量(vector)n的实数的有序集合,eg:[1,2,3,4] dimension为1.shape为[n]
3、矩阵(matrix)m行n列实数的有序集合eg:[[1,2],[3,4]]dimension为2,shape为[m,n]
4、张量(tensor)维度数>2的向量成为张量,张量的维度也称为轴(axis)
当前所有的机器学习系统均使用张量作为基本的数据结构。

用TensorFlow创建张量

import numpy as np
tf.constant(1.2)
<tf.Tensor: shape=(), dtype=float32, numpy=1.2>
tf.constant([1,2,3,4])
<tf.Tensor: shape=(4,), dtype=int32, numpy=array([1, 2, 3, 4])>
tf.constant([[1,2],[3,4]])
<tf.Tensor: shape=(2, 2), dtype=int32, numpy=
array([[1, 2],
       [3, 4]])>
# 若想转化为numpy类型,可采用如下方法
a = tf.constant([[1,2],[3,4]])
a.numpy()

可以使用ndim属性来查看一个张量轴的个数

import numpy as np
a = tf.constant([[1,2],[3,4]])
a.numpy()
a.ndim

字符串类型

tf.constant('hello,world')
<tf.Tensor: shape=(), dtype=string, numpy=b'hello world!'>

bool类型

tf.constant([True,False])
<tf.Tensor: shape=(2,), dtype=bool, numpy=array([ True, False])>

由于深度学习还是以数值类型为主,所以字符串类型和bool类型不过多叙述。

张量切片(Tensor slicing)

选择张量的特定元素称为张量切片。冒号等同于选择了整个轴。

现实中的数据张量

  • 向量数据:2D张量。形状为(samples,features)举例:有1000个人,每个人的个人信息包括姓名、年龄、性别。则可以表示为(1000,3)通常用全连接层来实现
  • 时间序列数据:3D张量。形状为(samples,time steps,features),通常用循环层来实现
  • 图像:4D张量。形状为(samples,height,width,channels)或(samples,channels,height,width)取决于使用Theano模式还是Tensorflow模式。Tensorflow模式下是前者。通常用二维卷积层来实现。
  • 视频:5D张量。形状为(samples,frames,height,width,channels)或(samples,frames,channels,height,width)frames表示视频中的帧。

张量的运算

keras.layers.Dense(512,activation='relu')
out = relu(dot(W,input)+b)

上面的那一个式子具体可以表示为下面的运算,dot代表矩阵(张量)的点积。其中relu和加法运算都是逐元素的运算,就是会对张量中的每一个元素都进行应用。

目标(损失)函数

选择正确的目标(损失)函数对于解决问题是非常重要的,好在对于一些常见问题,可以遵循一些简单的指导原则来选择目标函数,只有在面对真正全新的研究问题时,才需要自主开发目标函数。

  1. 对于二分类,可以使用二元交叉熵损失函数(binary crossentropy)
  2. 对于多分类,可以使用分类交叉熵损失函数(categorical crossentropy)
  3. 对于回归问题,可以使用均方差损失函数(mean squared error)
  4. 对于序列学习问题,可以使用联结主义时序分类(connectionist temporal classification)

Keras

1、Keras具有用户友好的API,便于快速开发深度学习的模型。可以支持多种网络架构,多输入多输出、层共享、模型共享等。它不处理张量操作、求微分等低层次的操作。相反,它依赖于一个专门的、高度优化的张量库来完成这些运算。
2、keras有三个后端实现:tensorflow后端、Theano后端、CNTK后端(微软认知工具包)。用keras写的每一段代码都可以在这三个后端上实现,无需做任何修改。
3、利用keras进行开发的步骤
①、加载训练数据 不能将列表直接送入网络,需要转化为张量。第一种方法是填充列表成相同长度,然后网络第一层为Embedding;第二种方法是one-hot编码,将其转化为0和1组成的向量,然后网络第一层可以使用Dense层。
②、定义网络模型
③、配置训练方法
④、执行训练过程
4、定义模型的方法有两种
①、Sequential类:用于层的线性堆叠,网络只有一个输入、一个输出
②、函数式API:用于层组成的有向无环图,还有多输入多输出的场景。

from keras.models import Model,Sequential
from keras import Input
from keras import layers
# sequential模型实现
seq_model = Sequential()
seq_model.add(layers.Dense(32,activation='relu',input_shape=(64,)))
seq_model.add(layers.Dense(32,activation='relu'))
seq_model.add(layers.Dense(10,activation='softmax'))
#函数API实现
input_tensor = Input(shape=(64,))
x = layers.Dense(32,activation='relu')(input_tensor)
x = layers.Dense(32,activation='relu')(x)
output_tensor = layers.Dense(10,activation='softmax')(x)
model = Model(input_tensor,output_tensor)
model.summary()

用函数API形式可以构建多输入的场景,通常需要keras.layers.add或者keras.layers.concatenate来合并。

对标签向量化

可以使用one-hot编码,利用keras内置的函数,代码如下

from keras.utils.np_utils import to_categorical
one_hot_train_labels = to_categorical(train_labels)
one_hot_test_labels = to_categorical(test_labels)

另外一种处理标签的方法就是将其转化为整数张量

import numpy as np
y_train = np.array(train_labels)
y_test = np.array(test_labels)

与上面独热码的区别是损失函数需要修改一下
原先是categorical_crossentropy,现变为sparse_categorical_crossentropy。两者在数学上一致,只不过是接口不同而已。

机器学习的分类

机器学习可以分为四大类:监督学习、无监督学习、自监督学习、强化学习。

  • 无监督学习:没有目标的情况下寻找寻找输入数据的有效变化。是数据分析的必备技能。常见的无监督学习方法是降维和聚类。

神经网络的数据预处理

数据预处理的目的是使原始数据更适合于神经网络处理。包括向量化、标准化、处理缺失值和特征提取。
1)向量化:送入神经网络的数据和标签都必须是浮点型张量(在特定情况下可以是整数张量)。
2)标准化:一般来说,将取值比较大的数据或者异质数据(各组数据取值范围差别比较大)送入神经网络,会导致比较大的梯度更新,导致网络无法收敛。所以送入神经网络的数据应该取值较小,并且具有同质性

编码

需要将文本数据进行处理成神经网络可以处理的张量
一种方法是one-hot编码,是一种硬编码,高维稀疏。
另外一种是词嵌入(word embedding),词嵌入是从数据中学习到的,常见的词向量维度是256,512,1024。不同的任务,词向量空间也有所不同。

Embedding层

Embedding层的输入是一个二维的整数张量,其shape为(samples,sequence_length)
将一个embedding层实例化的时候,一开始的权重也是随机的,在训练过程中,利用反向传播来调节这些词向量。
获取词嵌入有两种方法:
1)在完成任务的同时学习词嵌入
2)预训练词嵌入:在不同于待解决的任务上预计算好词嵌入,然后将其加载到模型中。在NLP领域预先加载训练好的词嵌入其背后的原理与在图像分类领域使用预训练的CNN网络一样。
有许多预计算的词嵌入数据库一个就是word2vec,另一个常用的是GloVe
总结:使用预训练词嵌入对训练数据很少的情况下适用,否则针对具体任务的词嵌入会更好。

如何利用keras的延展性

如果想在keras中自定义各种层和函数,最常用的就是backend,导入方法如下:

from keras import backend as K

由于keras有多个后端,使用backend可以更好的处理兼容性
如果只是想对流经该层的数据做个变换,而该层本身没有什么需要学习的参数时,可以使用Lambda层。Lambda函数有两个参数,一个是输入张量到输出张量的映射函数,另一个是输入shape到输出shape的映射函数。

几种激活函数的比较

PS:

  • 深度学习:深度是指学习的层数(layers)多,一般要5层以上;学习是指找到一组模型参数,使得在给定的训练数据样本和对应目标值上的损失函数最小化。
  • 神经网络最常见的三个使用场景:二分类问题,多分类问题和标量回归问题。
  • 所谓的人工智能,就是让计算机能像人一样思考。之前的人工智能都是“假智能”,由一个复杂的程序组成。直至人工神经网络的出现,才出现了“真智能”
  • 损失函数:在训练过程需要将其最小化,用来衡量当前任务是否已经成功完成。
  • 优化器:决定如何基于损失函数对网络进行更新。
  • 如果想买GPU,一定要买NVIDIA GPU,现在深度学习框架只能在NVIDIA显卡上运行。
  • 隐藏单元越多,网络能够学习到越复杂的表示,但是网络的计算代价也就越大,有时也可能造成过拟合的产生。
  • 机器学习的目的是得到可以泛化的模型,就是在没有遇到的数据集上也能表现很好。所以其核心难题是过拟合
  • 用于处理序列的两种基本的深度学习常用算法是循环神经网络一维卷积神经网络
  • simpleRNN并不是keras唯一可以使用的循环层,还有两个是LSTMGRU,simpleRNN并不适合处理长序列,像文本。

你可能感兴趣的