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)
当前所有的机器学习系统均使用张量作为基本的数据结构。
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!'>
tf.constant([True,False])
<tf.Tensor: shape=(2,), dtype=bool, numpy=array([ True, False])>
由于深度学习还是以数值类型为主,所以字符串类型和bool类型不过多叙述。
选择张量的特定元素称为张量切片。冒号等同于选择了整个轴。
keras.layers.Dense(512,activation='relu')
out = relu(dot(W,input)+b)
上面的那一个式子具体可以表示为下面的运算,dot代表矩阵(张量)的点积。其中relu和加法运算都是逐元素的运算,就是会对张量中的每一个元素都进行应用。
选择正确的目标(损失)函数对于解决问题是非常重要的,好在对于一些常见问题,可以遵循一些简单的指导原则来选择目标函数,只有在面对真正全新的研究问题时,才需要自主开发目标函数。
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层的输入是一个二维的整数张量,其shape为(samples,sequence_length)
将一个embedding层实例化的时候,一开始的权重也是随机的,在训练过程中,利用反向传播来调节这些词向量。
获取词嵌入有两种方法:
1)在完成任务的同时学习词嵌入
2)预训练词嵌入:在不同于待解决的任务上预计算好词嵌入,然后将其加载到模型中。在NLP领域预先加载训练好的词嵌入其背后的原理与在图像分类领域使用预训练的CNN网络一样。
有许多预计算的词嵌入数据库一个就是word2vec,另一个常用的是GloVe
总结:使用预训练词嵌入对训练数据很少的情况下适用,否则针对具体任务的词嵌入会更好。
如果想在keras中自定义各种层和函数,最常用的就是backend,导入方法如下:
from keras import backend as K
由于keras有多个后端,使用backend可以更好的处理兼容性
如果只是想对流经该层的数据做个变换,而该层本身没有什么需要学习的参数时,可以使用Lambda层。Lambda函数有两个参数,一个是输入张量到输出张量的映射函数,另一个是输入shape到输出shape的映射函数。