当前位置: 首页 > news >正文

遨游网站建设北京市建设资格执业中心网站

遨游网站建设,北京市建设资格执业中心网站,网站建设需要哪些步骤 谢谢,河南郑州网站设计公司目录 交叉熵 手写数字识别之损失函数 分类任务的损失函数 Softmax函数 交叉熵的简单理解#xff1a;真实分布与非真实分布的交叉#xff0c;完全对应#xff0c;熵为0 交叉熵的代码实现 交叉熵 给定一个策略, 交叉熵就是在该策略下猜中颜色所需要的问题的期望值。更普…目录 交叉熵 手写数字识别之损失函数 分类任务的损失函数 Softmax函数 交叉熵的简单理解真实分布与非真实分布的交叉完全对应熵为0 交叉熵的代码实现 交叉熵 给定一个策略, 交叉熵就是在该策略下猜中颜色所需要的问题的期望值。更普遍的说交叉熵用来衡量在给定的真实分布下使用非真实分布所指定的策略消除系统的不确定性所需要付出成本的大小。 交叉的字面意思在于真实分布与非真实分布的交叉。给定一个方案, 越优的策略, 最终的交叉熵越低。具有最低的交叉熵的策略就是最优化策略也就是上面定义的熵。因此, 在机器学习中, 我们需要最小化交叉熵。 举例来说, 假设我有 3 枚硬币, 正正反, 记为 1,1,0. 预测结果是 0.8, 0.9, 0.3, 那么, 交叉熵的均值是: 1/3(1×log0.81×log0.9(10)×log(10.3)) 假设有一个完美的算法, 直接预测出了 1,1,0, 那么交叉熵的结果就是 0. 手写数字识别之损失函数 我们继续将“横纵式”教学法从横向展开如 图1 所示探讨损失函数的优化对模型训练效果的影响。 图1“横纵式”教学法 — 损失函数优化 损失函数是模型优化的目标用于在众多的参数取值中识别最理想的取值。损失函数的计算在训练过程的代码中每一轮模型训练的过程都相同分如下三步 先根据输入数据正向计算预测输出。再根据预测值和真实值计算损失。最后根据损失反向传播梯度并更新参数。 分类任务的损失函数 在之前的方案中我们复用了房价预测模型的损失函数-均方误差。从预测效果来看虽然损失不断下降模型的预测值逐渐逼近真实值但模型的最终效果不够理想。究其根本不同的深度学习任务需要有各自适宜的损失函数。我们以房价预测和手写数字识别两个任务为例详细剖析其中的缘由如下 房价预测是回归任务而手写数字识别是分类任务使用均方误差作为分类任务的损失函数存在逻辑和效果上的缺欠。房价可以是大于0的任何浮点数而手写数字识别的输出只可能是0~9之间的10个整数相当于一种标签。在房价预测的案例中由于房价本身是一个连续的实数值因此以模型输出的数值和真实房价差距作为损失函数Loss是符合道理的。但对于分类问题真实结果是分类标签而模型输出是实数值导致以两者相减作为损失不具备物理含义。 那么什么是分类任务的合理输出呢分类任务本质上是“某种特征组合下的分类概率”下面以一个简单案例说明如 图2 所示。 图2观测数据和背后规律之间的关系 在本案例中医生根据肿瘤大小xxx作为肿瘤性质yyy的参考判断判断的因素有很多肿瘤大小只是其中之一那么我们观测到该模型判断的结果是xxx和yyy的标签1为恶性0为良性。而这个数据背后的规律是不同大小的肿瘤属于恶性肿瘤的概率。观测数据是真实规律抽样下的结果分类模型应该拟合这个真实规律输出属于该分类标签的概率。 Softmax函数 如果模型能输出10个标签的概率对应真实标签的概率输出尽可能接近100%而其他标签的概率输出尽可能接近0%且所有输出概率之和为1。这是一种更合理的假设与此对应真实的标签值可以转变成一个10维度的one-hot向量在对应数字的位置上为1其余位置为0比如标签“6”可以转变成[0,0,0,0,0,0,1,0,0,0]。 为了实现上述思路需要引入Softmax函数它可以将原始输出转变成对应标签的概率公式如下其中C是标签类别个数。 从公式的形式可见每个输出的范围均在0~1之间且所有输出之和等于1这是这种变换后可被解释成概率的基本前提。对应到代码上需要在前向计算中对全连接网络的输出层增加一个Softmax运算outputs F.softmax(outputs)。 图3 是一个三个标签的分类模型三分类使用的Softmax输出层从中可见原始输出的三个数字3、1、-3经过Softmax层后转变成加和为1的三个概率值0.88、0.12、0。 图3网络输出层改为softmax函数 上文解释了为何让分类模型的输出拟合概率的原因但为何偏偏用Softmax函数完成这个职能 下面以二分类问题只输出两个标签进行原理的探讨。 对于二分类问题使用两个输出接入Softmax作为输出层等价于使用单一输出接入Sigmoid函数。如 图4 所示利用两个标签的输出概率之和为1的条件Softmax输出0.6和0.4两个标签概率从数学上等价于输出一个标签的概率0.6。 图4对于二分类问题等价于单一输出接入Sigmoid函数 图5 是肿瘤大小和肿瘤性质的数据图。从图中可发现往往尺寸越大的肿瘤几乎全部是恶性尺寸极小的肿瘤几乎全部是良性。只有在中间区域肿瘤的恶性概率会从0逐渐到1绿色区域这种数据的分布是符合多数现实问题的规律。如果我们直接线性拟合相当于红色的直线会发现直线的纵轴0-1的区域会拉的很长而我们期望拟合曲线0-1的区域与真实的分类边界区域重合。那么观察下Sigmoid的曲线趋势可以满足我们对个问题的一切期望它的概率变化会集中在一个边界区域有助于模型提升边界区域的分辨率。 图5使用Sigmoid拟合输出可提高分类模型对边界的分辨率 这就类似于公共区域使用的带有恒温装置的热水器温度阀门如 图6 所示。由于人体适应的水温在34度-42度之间我们更期望阀门的水温条件集中在这个区域而不是在0-100度之间线性分布。 图6热水器水温控制 交叉熵的简单理解真实分布与非真实分布的交叉完全对应熵为0 假设正确标签的索引是“2”与之对应的神经网络的输出是0.6则交叉熵误差是−log⁡0.60.51−\log 0.6 0.51−log0.60.51若“2”对应的输出是0.1则交叉熵误差为−log⁡0.12.30−\log 0.1 2.30−log0.12.30。由此可见交叉熵误差的值是由正确标签所对应的输出结果决定的。 交叉熵越小越好 在模型输出为分类标签的概率时直接以标签和概率做比较也不够合理人们更习惯使用交叉熵误差作为分类问题的损失衡量。 交叉熵损失函数的设计是基于最大似然思想最大概率得到观察结果的假设是真的。如何理解呢举个例子来说如 图7 所示。有两个外形相同的盒子甲盒中有99个白球1个蓝球乙盒中有99个蓝球1个白球。一次试验取出了一个蓝球请问这个球应该是从哪个盒子中取出的 图7体会最大似然的思想 给定一个策略, 交叉熵就是在该策略下猜中颜色所需要的问题的期望值。更普遍的说交叉熵用来衡量在给定的真实分布下使用非真实分布所指定的策略消除系统的不确定性所需要付出成本的大小。 交叉的字面意思在于真实分布与非真实分布的交叉。给定一个方案, 越优的策略, 最终的交叉熵越低。具有最低的交叉熵的策略就是最优化策略也就是上面定义的熵。因此, 在机器学习中, 我们需要最小化交叉熵。 在信息论中交叉熵是表示两个概率分布p,q其中p表示真实分布q表示非真实分布在相同的一组事件中其中用非真实分布q来表示某个事件发生所需要的平均比特数。从这个定义中我们很难理解交叉熵的定义。下面举个例子来描述一下 假设现在有一个样本集中两个概率分布p,q其中p为真实分布q为非真实分布。假如按照真实分布p来衡量识别一个样本所需要的编码长度的期望为 交叉熵可在神经网络(机器学习)中作为损失函数p表示真实标记的分布q则为训练后的模型的预测标记分布交叉熵损失函数可以衡量p与q的相似性。交叉熵作为损失函数还有一个好处是使用sigmoid函数在梯度下降时能避免均方误差损失函数学习速率降低的问题因为学习速率可以被输出的误差所控制 因此交叉熵只计算对应着“正确解”标签的输出的自然对数。比如假设正确标签的索引是“2”与之对应的神经网络的输出是0.6则交叉熵误差是−log⁡0.60.51−\log 0.6 0.51−log0.60.51若“2”对应的输出是0.1则交叉熵误差为−log⁡0.12.30−\log 0.1 2.30−log0.12.30。由此可见交叉熵误差的值是由正确标签所对应的输出结果决定的。  交叉熵的代码实现 在手写数字识别任务中仅改动三行代码就可以将在现有模型的损失函数替换成交叉熵Cross_entropy。 在读取数据部分将标签的类型设置成int体现它是一个标签而不是实数值飞桨框架默认将标签处理成int64。在网络定义部分将输出层改成“输出十个标签的概率”的模式。在训练过程部分将损失函数从均方误差换成交叉熵。 在数据处理部分需要修改标签变量Label的格式代码如下所示。 从label np.reshape(labels[i], [1]).astype(‘float32’)到label np.reshape(labels[i], [1]).astype(‘int64’) #数据处理部分之前的代码保持不变 import os import random import paddle import numpy as np import matplotlib.pyplot as plt from PIL import Imageimport gzip import json# 创建一个类MnistDataset继承paddle.io.Dataset 这个类 # MnistDataset的作用和上面load_data()函数的作用相同均是构建一个迭代器 class MnistDataset(paddle.io.Dataset):def __init__(self, mode):datafile ./work/mnist.json.gzdata json.load(gzip.open(datafile))# 读取到的数据区分训练集验证集测试集train_set, val_set, eval_set data# 数据集相关参数图片高度IMG_ROWS, 图片宽度IMG_COLSself.IMG_ROWS 28self.IMG_COLS 28if modetrain:# 获得训练数据集imgs, labels train_set[0], train_set[1]elif modevalid:# 获得验证数据集imgs, labels val_set[0], val_set[1]elif modeeval:# 获得测试数据集imgs, labels eval_set[0], eval_set[1]else:raise Exception(mode can only be one of [train, valid, eval])# 校验数据imgs_length len(imgs)assert len(imgs) len(labels), \length of train_imgs({}) should be the same as train_labels({}).format(len(imgs), len(labels))self.imgs imgsself.labels labelsdef __getitem__(self, idx):# img np.array(self.imgs[idx]).astype(float32)# label np.array(self.labels[idx]).astype(int64)img np.reshape(self.imgs[idx], [1, self.IMG_ROWS, self.IMG_COLS]).astype(float32)label np.reshape(self.labels[idx], [1]).astype(int64)return img, labeldef __len__(self):return len(self.imgs) # 声明数据加载函数使用训练模式MnistDataset构建的迭代器每次迭代只返回batch1的数据 train_dataset MnistDataset(modetrain) # 使用paddle.io.DataLoader 定义DataLoader对象用于加载Python生成器产生的数据 # DataLoader 返回的是一个批次数据迭代器并且是异步的 train_loader paddle.io.DataLoader(train_dataset, batch_size100, shuffleTrue, drop_lastTrue) val_dataset MnistDataset(modevalid) val_loader paddle.io.DataLoader(val_dataset, batch_size128,drop_lastTrue)在网络定义部分需要修改输出层结构代码如下所示。 从self.fc Linear(in_features980, out_features1)到self.fc Linear(in_features980, out_features10) # 定义 SimpleNet 网络结构 import paddle from paddle.nn import Conv2D, MaxPool2D, Linear import paddle.nn.functional as F # 多层卷积神经网络实现 class MNIST(paddle.nn.Layer):def __init__(self):super(MNIST, self).__init__()# 定义卷积层输出特征通道out_channels设置为20卷积核的大小kernel_size为5卷积步长stride1padding2self.conv1 Conv2D(in_channels1, out_channels20, kernel_size5, stride1, padding2)# 定义池化层池化核的大小kernel_size为2池化步长为2self.max_pool1 MaxPool2D(kernel_size2, stride2)# 定义卷积层输出特征通道out_channels设置为20卷积核的大小kernel_size为5卷积步长stride1padding2self.conv2 Conv2D(in_channels20, out_channels20, kernel_size5, stride1, padding2)# 定义池化层池化核的大小kernel_size为2池化步长为2self.max_pool2 MaxPool2D(kernel_size2, stride2)# 定义一层全连接层输出维度是10self.fc Linear(in_features980, out_features10)# 定义网络前向计算过程卷积后紧接着使用池化层最后使用全连接层计算最终输出# 卷积层激活函数使用Relu全连接层激活函数使用softmaxdef forward(self, inputs):x self.conv1(inputs)x F.relu(x)x self.max_pool1(x)x self.conv2(x)x F.relu(x)x self.max_pool2(x)x paddle.reshape(x, [x.shape[0], 980])x self.fc(x)return x 修改计算损失的函数从均方误差常用于回归问题到交叉熵误差常用于分类问题代码如下所示。 从loss paddle.nn.functional.square_error_cost(predict, label)到loss paddle.nn.functional.cross_entropy(predict, label) def evaluation(model, datasets):model.eval()acc_set list()for batch_id, data in enumerate(datasets()):images, labels dataimages paddle.to_tensor(images)labels paddle.to_tensor(labels)pred model(images) # 获取预测值acc paddle.metric.accuracy(inputpred, labellabels)acc_set.extend(acc.numpy())# #计算多个batch的准确率acc_val_mean np.array(acc_set).mean()return acc_val_mean #仅修改计算损失的函数从均方误差常用于回归问题到交叉熵误差常用于分类问题 def train(model):model.train()#调用加载数据的函数# train_loader load_data(train)# val_loader load_data(valid)opt paddle.optimizer.SGD(learning_rate0.01, parametersmodel.parameters())EPOCH_NUM 10for epoch_id in range(EPOCH_NUM):for batch_id, data in enumerate(train_loader()):#准备数据images, labels dataimages paddle.to_tensor(images)labels paddle.to_tensor(labels)#前向计算的过程predicts model(images)#计算损失使用交叉熵损失函数取一个批次样本损失的平均值loss F.cross_entropy(predicts, labels)avg_loss paddle.mean(loss)#每训练了200批次的数据打印下当前Loss的情况if batch_id % 200 0:print(epoch: {}, batch: {}, loss is: {}.format(epoch_id, batch_id, avg_loss.numpy()))#后向传播更新参数的过程avg_loss.backward()# 最小化loss,更新参数opt.step()# 清除梯度opt.clear_grad()# acc_train_mean evaluation(model, train_loader)# acc_val_mean evaluation(model, val_loader)# print(train_acc: {}, val acc: {}.format(acc_train_mean, acc_val_mean)) #保存模型参数paddle.save(model.state_dict(), mnist.pdparams)#创建模型 model MNIST() #启动训练过程 train(model) epoch: 0, batch: 0, loss is: [2.3579125] epoch: 0, batch: 200, loss is: [0.4289544] epoch: 0, batch: 400, loss is: [0.31014374] epoch: 1, batch: 0, loss is: [0.23571382] epoch: 1, batch: 200, loss is: [0.14443767] epoch: 1, batch: 400, loss is: [0.29584044] epoch: 2, batch: 0, loss is: [0.2954171] epoch: 2, batch: 200, loss is: [0.17638636] epoch: 2, batch: 400, loss is: [0.15439035] epoch: 3, batch: 0, loss is: [0.09984577] epoch: 3, batch: 200, loss is: [0.17405878] epoch: 3, batch: 400, loss is: [0.08693444] epoch: 4, batch: 0, loss is: [0.25134712] epoch: 4, batch: 200, loss is: [0.09044845] epoch: 4, batch: 400, loss is: [0.0785885] epoch: 5, batch: 0, loss is: [0.06229271] epoch: 5, batch: 200, loss is: [0.18825674] epoch: 5, batch: 400, loss is: [0.05030152] epoch: 6, batch: 0, loss is: [0.10051466] epoch: 6, batch: 200, loss is: [0.18116194] epoch: 6, batch: 400, loss is: [0.06495788] epoch: 7, batch: 0, loss is: [0.12305102] epoch: 7, batch: 200, loss is: [0.06968503] epoch: 7, batch: 400, loss is: [0.08263568] epoch: 8, batch: 0, loss is: [0.15880015] epoch: 8, batch: 200, loss is: [0.06577106] epoch: 8, batch: 400, loss is: [0.05110953] epoch: 9, batch: 0, loss is: [0.14060621] epoch: 9, batch: 200, loss is: [0.14625353] epoch: 9, batch: 400, loss is: [0.11598101]虽然上述训练过程的损失明显比使用均方误差算法要小但因为损失函数量纲的变化我们无法从比较两个不同的Loss得出谁更加优秀。怎么解决这个问题呢我们可以回归到问题的本质谁的分类准确率更高来判断。在后面介绍完计算准确率和作图的内容后读者可以自行测试采用不同损失函数下模型准确率的高低。 至此大家阅读论文中常见的一些分类任务模型图就清晰明了如全连接神经网络、卷积神经网络在模型的最后阶段都是使用Softmax进行处理。 图8常见的分类任务模型图 由于我们修改了模型的输出格式因此使用模型做预测时的代码也需要做相应的调整。从模型输出10个标签的概率中选择最大的将其标签编号输出。 # 读取一张本地的样例图片转变成模型输入的格式 def load_image(img_path):# 从img_path中读取图像并转为灰度图im Image.open(img_path).convert(L)im im.resize((28, 28), Image.ANTIALIAS)im np.array(im).reshape(1, 1, 28, 28).astype(np.float32)# 图像归一化im 1.0 - im / 255.return im# 定义预测过程 model MNIST() params_file_path mnist.pdparams img_path work/example_0.jpg # 加载模型参数 param_dict paddle.load(params_file_path) model.load_dict(param_dict) # 灌入数据 model.eval() tensor_img load_image(img_path) #模型反馈10个分类标签的对应概率 results model(paddle.to_tensor(tensor_img)) #取概率最大的标签作为预测输出 lab np.argsort(results.numpy()) print(本次预测的数字是: , lab[0][-1]) 本次预测的数字是: 0
http://www.pierceye.com/news/171624/

相关文章:

  • 长沙网络建设的网站免费的个人简历模板word下载
  • 网站维护简单吗wordpress绿色两栏响应式主题
  • 二手站网站怎做福州网站建设的公司哪家好
  • dw如何做网站后台佛山行业网站建设
  • 如何做网站轮播大图简单网页制作成品代码
  • 网站怎么做uc整合查企业网站
  • 网站没被收录什么原因网站排名点击工具
  • 江西南昌建设厅网站商品展示软件
  • 眼镜企业网站建设方案2015做那些网站致富
  • 创建个人网站的流程建设网站聊天室
  • cms 学校网站上海模板网站
  • 网站建设投资风险分析公司做的网站费用如何做账
  • 网站建设费用核算科目DW做的网页用网站打不开
  • wordpress标签搜索引擎嘉兴市做网站优化
  • 网站更换关键词怎么做好wordpress post fonts
  • 厦门优化网站排名网站备案转服务器
  • 怎样做pdf电子书下载网站做旅行攻略的网站
  • 怎样做网站推广啊抖音网站的flash怎么做
  • 网站建设小说网站建设目标是什么意思
  • 如何做一个好的网站中英文网站好处
  • wordpress站点版权设置晋中建设集团网站
  • 怎么夸一个网站做的好看烟台百度网站推广
  • 佛山市网站建设分站多少钱企业门户账号是什么
  • 大中型网站开发价格铜山区建设局局网站周保春
  • 为什么有人做商城优惠券网站卖科技风格设计网站
  • 企业网站的需求分析是做网站编辑还是做平面设计
  • 超酷 flash 网站淮南网红餐厅
  • 湛江网站建设开发株洲关键词seo优化服务商
  • 女的有没有做网站的十大经典随身空间小说推荐
  • 江西做网站哪家好监理证查询网