文章目录
numpy增加减少维度
np.expand_dims()扩展维度
np.expand_dims(a, axis)
- a : array_like
- axis : int
该函数的作用是在指定轴axis上增加数组a的一个维度,即,在第“axis”维,加一个维度出来,原先在“axis”左边的维度保持位置不变,在“axis”右边的维度整体右移
注意:不改变原来的数组!!!
,所以要有一个变量来接收改变后的数组。
np.squeeze()删减维度
np.squeeze(a, axis=None)
- a : array_like
- axis : None or int or tuple of ints, optional
该函数的作用是:删除输入数组a中维度为1的维度,并返回新的数组,新数组的元素与原数组a完全相同。(Remove single-dimensional entries from the shape of an array.)
返回一个新的数组
注意,如果要指定删除的维度,这时要删除的维度必须是1才行,不然会报错ValueError: cannot select an axis to squeeze out which has size not equal to one
python 读取词向量文件 .vec文件
这里只尝试了第一种方法,但是有问题,读取出来的是空,修改了一下
# 读取verb文件
vec_path = 'ids.vec'
vec_data = {}
with open(vec_path) as f:
line = f.readline().strip().split(" ")
word_count,dim = int(line[0]),int(line[1])
line = f.readline()
while line:
line = line.strip().split(" ")
if len(line) < 2:
line = f.readline()
continue
word = int(line[0])
vec = [float(item) for item in line[1:]]
vec_data[word] = vec
line = f.readline()
f.close()
文件内容如下,这里是全部读入,没有像他一样对数据进行取三位。
KL散度理解
KL散度可以用来衡量两个概率分布之间的相似性
,两个概率分布越相近
,KL散度越小
。
概率分布的相似性?
tensorflow使用
假设y为真实分布,x为预测分布。
import torch.nn.functional as F
kl = F.kl_div(x.softmax(dim=-1).log(), y.softmax(dim=-1), reduction='sum')
其中kl_div接收三个参数,第一个为预测分布,第二个为真实分布,第三个为reduction。(其实还有其他参数,只是基本用不到)
这里有一些细节需要注意,第一个参数与第二个参数都要进行softmax(dim=-1),目的是使两个概率分布的所有值之和都为1,若不进行此操作,如果x或y概率分布所有值的和大于1,则可能会使计算的KL为负数。softmax接收一个参数dim,dim=-1表示在最后一维进行softmax操作。除此之外,第一个参数还要进行log()操作(至于为什么,大概是为了方便pytorch的代码组织,pytorch定义的损失函数都调用handle_torch_function函数,方便权重控制等),才能得到正确结果。
第三个参数reduction有三种取值,为 none 时,各点的损失单独计算,输出损失与输入(x)形状相同;为 mean 时,输出为所有损失的平均值;为 sum 时,输出为所有损失的总和。
keras划分验证集
- 自动切分的验证集,在
model.fit()
训练模型时,可通过validation_split参数
来指定从数据集中切分出验证集的比例, 但是首先要打乱数据顺序 - 手动切分的验证集,用sklearn库中的train_test_split()函数将数据集进行切分,然后在keras的
model.fit()
的时候通过validation_data参数
指定前面切分出来的验证集
keras 训练神经网络的一般过程
准备数据
构建模型
- 使用Sequential按层顺序构建模型
- 使用函数式API构建任意结构模型
- 继承Model基类构建自定义模型
构建完模型后,需要用compile方法
来编译模型,指定优化器,目标函数,评估指标,以及回调函数
可以用summary方法
来查看模型的结构和参数数量。也可以用plot_model方法`来可视化模型的结构图
如果需要使用tensorboard
来对模型结构图及训练过程进行可视化,可以调用tensorboard回调函数
from keras import models,layers
model = models.Sequential()
model.add(layers.Dense(512,activation = 'relu',input_shape=(28 * 28,)))
model.add(layers.Dense(10,activation = 'softmax' ))
model.compile(optimizer='adam',
loss='categorical_crossentropy',
metrics=['accuracy'])
model.summary()
训练模型
一般情况下可以用模型的fit方法
训练模型,当数据集较大时,应当使用内存友好的fit_generator方法
训练模型,如果需要细粒度的自定义训练过程,可以用train_on_batch
逐批次地训练模型
如果需要使用多个GPU训练模型,可以使用keras.utils.multi_gpu_model
创建支持多个GPU同时训练的模型
history = model.fit(x_train,y_train,
epochs = 5,
batch_size = 128,
validation_data =(x_test,y_test))
评估模型
在通常情况下,训练模型时候指定验证集
就可以在训练过程中输出模型的在训练集和验证集的损失和评估指标。然后可以用matplotlib将结果可视化,也可以利用回调函数在tensorboard中进行可视化。如果需要自定义评估指标,可以利用backend接口进行编写
在模型训练完成后,可以用evaluate方法
对模型进行评估,当数据集较大时,使用对内存友好的evaluate_generator方法
评估模型,如果需要细粒度的评估,可以用test_on_batch
在一个批次上评估模型
import matplotlib.pyplot as plt
%matplotlib inline
%config InlineBackend.figure_format = 'svg'
acc = history.history['acc']
val_acc = history.history['val_acc']
epochs = range(1, len(acc) + 1)
plt.plot(epochs, acc, 'bo', label='Training accuracy')
plt.plot(epochs, val_acc, 'b', label='Validation accuracy')
plt.title('Training and validation accuracy')
plt.xlabel('Epochs')
plt.ylabel('Accuracy')
plt.legend()
plt.show()
使用模型
一般情况下使用模型的predict方法
进行预测,当数据集较大时,使用predict_generator方法
进行预测
model.predict(x_test)
保存模型
keras可以用模型的save方法
保存模型的结构和权重到.h5文件,也可以用save_weight方法只保存模型的权重到.h5文件,也可以用to_json或者to_yaml方法只保存模型的结构到json或者yaml文件
# 保存模型结构及权重
model.save('my_model.h5')
del model
# 恢复模型结构及权重
model = models.load_model('my_model.h5')
model.evaluate(x_test,y_test)