华为云在线课堂AI技术领域课程“深度学习”学习心得体会---第四周
第8章 深度置信网络
8.1 深度置信网络介绍
深度置信网络是神经网络的一种,既可以用于非监督学习,类似于一个自编码机;也可以用于监督学习,作为分类器使用。
非监督学习:尽可能保留原始特征特点,降低特征维度;
监督学习:使得分类错误率尽可能地小;
玻尔兹曼机:
特点:①随机变量都是二值的({0,1})②所有节点是全连接的 ③两个节点之间的相互影响是对称的
用能量衡量整个模型的稳定性
能量收敛到最小,热平衡趋于稳定,能量最少时,最稳定,网络最优。
训练时间非常长。
受限玻尔兹曼机:
层内的神经元没有连接关系,计算量大大减小。
两层:
受限玻尔兹曼机传播过程-正向
受限玻尔兹曼机传播过程-反向
深度置信网络:
多层受限玻尔兹曼机组成的神经网络,生成模型,也可以被看做是监督模型。
训练法则是逐层进行,每一层都用户数向量来推断隐层,再把这个隐层作为数据向量来推断下一个隐层。
深度信念网络
第9章 卷积神经网络
9.1卷积神经网络回顾
网络层:卷积、池化和全连接层
作用:卷积-特征提取;池化-降低特征图参数量和解决图像不变性。全连接-将特征图映射为向量。
核心思想:参数共享和局部感知
卷积计算:
信号与系统:
矩阵论:
深度学习:
时域卷积=频域相乘
CNN-特征提取
卷积神经网络的主要作用是提取特征,主要包括图像和语音的特征。
提取特征是为了去除冗余信息量,保留显著特征。
人是通过图像的局部特征来理解图像:特征+认知
卷积神经网络的优点是精确度高,自动提取特征。
9.2 经典的CNN结构
深度学习和卷积神经网络的发展离不开ILSVRC;
ImageNet拥有1500万张标注过得高清图片,总共有22000类,其中约有100万张标注了图片中主要物体的定位边框。
ILSVRC历年成绩
主要包括3个比赛项目:图像分类,单物体定位,物体检测;
AlexNet
闪光点:ReLU,重叠Pooling,数据增强,Dropout
ReLU
使用ReLU代替Sigmoid激活函数,快速收敛
重叠Pooling
实现:stride<kernel size;目的:池化能减轻过拟合
数据增强
实现原始图像(256*256)随机剪裁为224*224的图像;图像水平单转,随机增加光照
Dropout
每个隐藏层神经元的输入以0.5的概率输出为0,防止过拟合。
VGGNet
研究深度对卷积网络的影响。使用简单的3*3卷积核,不断重复卷积层,池化,最后经过全连接,softmax,得到输出类别概率。
小卷积核优于大卷积核
GoogLeNet
用更多的卷积更深的层次得到更好的结构,有好几个Inception结构
Inception结构
ResNet
残差结构
SENet:
子结构
第10章 循环神经网络
10.1 循环神经网络回顾
前馈神经网络的缺点
擅长处理序列数据:RNN
参数共享(w,u,v)
体现出一个神经元其实一直在处理同一个任务;(是RNN可以处理任意长度数据的关键);减少参数量
RNN的连接方式
标准的RNN:
问题:对长时间记忆的信息会衰减,存在梯度爆炸和梯度消失问题,并不能真正的处理好长距离的依赖。
10.2 RNN变种
长短期记忆网络:一种特殊的RNN类型,可以学习长期依赖信息
增加了一些门结构
LSTM-记忆单元:和标准RNN一样,负责记录之前的信息Ct-1
LSTM-遗忘门:遗忘门结构通过分析上一时刻的输出Ht-1和当前时刻的输入Xt,计算出输入系统数it和需要新记忆的内容Ct
LSTM-输入门
LSTM-信息更新
LSTM-输出门
LSTM全景
GRU门控循环单元,简化版的LSTM。
-
实践案例:Resnet-经典卷积神经网络
1. 加载并处理数据集
import os
import sys
import moxing as mox
datasets_dir = '../datasets'
if not os.path.exists(datasets_dir):
os.makedirs(datasets_dir)
if not os.path.exists(os.path.join(datasets_dir, 'MNIST_Data.zip')):
mox.file.copy('obs://modelarts-labs-bj4-v2/course/hwc_edu/python_module_framework/datasets/mindspore_data/MNIST_Data.zip',
os.path.join(datasets_dir, 'MNIST_Data.zip'))
os.system('cd %s; unzip MNIST_Data.zip' % (datasets_dir))
sys.path.insert(0, os.path.join(os.getcwd(), '../datasets/MNIST_Data'))
from load_data_all import load_data_all
from process_dataset import process_dataset
mnist_ds_train, mnist_ds_test, train_len, test_len = load_data_all(datasets_dir) # 加载数据集
mnist_ds_train = process_dataset(mnist_ds_train, batch_size= 64, resize= 28) # 处理训练集,分批加载
mnist_ds_test = process_dataset(mnist_ds_test, batch_size= 32, resize= 28) # 处理测试集, 分批加载
2. 下载构建好的resnet18网络源码文件
2.1. 下载网络源码文件
# 下载构建好的网络源文件,只需执行一次即可。
!wget -N https://modelarts-labs-bj4-v2.obs.cn-north-4.myhuaweicloud.com/course/mindspore/mnist_recognition/src/resnet.py --no-check-certificate
2.2.修改网络文件中通道数
# 此命令执行后将直接在原文件中修改,不会有任何输出
!sed -i '387s/3/1/g' ./resnet.py
3. 载入resnet18网络
from resnet import resnet18
network = resnet18(class_num=10)
4. 定义损失函数和优化器
import mindspore
import mindspore.nn as nn
lr = 0.01
momentum = 0.9
net_loss = nn.SoftmaxCrossEntropyWithLogits(sparse=True, reduction='mean') # 损失函数
net_opt = nn.Momentum(network.trainable_params(), lr, momentum) # 优化器
5. 配置运行信息
from mindspore import context
context.set_context(mode=context.GRAPH_MODE, device_target="GPU")
6. 调用Model高阶API进行训练和保存模型文件
mport os,time
from mindspore import Model
from mindspore import load_checkpoint, load_param_into_net
from mindspore.train.callback import ModelCheckpoint, CheckpointConfig, LossMonitor, TimeMonitor
model = Model(network, loss_fn=net_loss, optimizer=net_opt, metrics={'acc'}) # 完成Model初始化
# 训练参数
batch_num = mnist_ds_train.get_dataset_size()
max_epochs = 1
model_path = "./models/ckpt/"
os.system('rm -f {0}*.ckpt {0}*.meta {0}*.pb'.format(model_path))
# 定义回调函数
config_ck = CheckpointConfig(save_checkpoint_steps=batch_num, keep_checkpoint_max=35)
ckpoint_cb = ModelCheckpoint(prefix="train_resnet_mnist", directory=model_path, config=config_ck)
loss_cb = LossMonitor(batch_num) # 用于输出损失
start_time = time.time()
model.train(max_epochs, mnist_ds_train, callbacks=[ckpoint_cb, loss_cb]) # 训练
res = model.eval(mnist_ds_test) # 验证测试集
print("result: ", res)
cost_time = time.time() - start_time
print("训练总耗时: %.1f s" % cost_time)
!tree ./models/ckpt/
7. 批量图片的预测显示
import numpy as np
from PIL import Image
import mindspore
import mindspore.ops as ops
from mindspore import Tensor
dic_ds_test = mnist_ds_test.create_dict_iterator(output_numpy=True)
ds_test = next(dic_ds_test)
images_test = ds_test["image"]
labels_test = ds_test["label"]
output = model.predict(Tensor(images_test))
pred_labels = ops.Argmax(output_type=mindspore.int32)(output)
print("预测值 -- > ", pred_labels) # 打印预测值
print("真实值 -- > ", labels_test) # 打印真实值
batch_img = np.squeeze(images_test[0])
for i in range(1, len(labels_test)):
batch_img = np.hstack((batch_img, np.squeeze(images_test[i]))) # 将一批图片水平拼接起来,方便下一步进行显示
Image.fromarray((batch_img*255).astype('uint8'), mode= "L") # 显示真实值
运行截图:
- 点赞
- 收藏
- 关注作者
评论(0)