学习记录-1.4

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使用

pytorch使用

假设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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值