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

晋城网站制作公司好用的crm系统有哪些

晋城网站制作公司,好用的crm系统有哪些,推广网站联盟,网站开发公司企业官网前言 小时候听过一个小孩练琴的故事#xff0c;老师让他先弹最简单的第一小节#xff0c;小孩练了两天后弹不出。接着#xff0c;老师让他直接去练更难的第二小节#xff0c;小孩练习了几天后还是弹不出#xff0c;开始感觉到挫败和烦躁了。 小孩以为老师之后会让他从简…前言 小时候听过一个小孩练琴的故事老师让他先弹最简单的第一小节小孩练了两天后弹不出。接着老师让他直接去练更难的第二小节小孩练习了几天后还是弹不出开始感觉到挫败和烦躁了。 小孩以为老师之后会让他从简单的开始练谁知老师直接让他开始练最难的一小节。小孩不干了问老师是不是故意刁难他。 老师笑笑让他现在弹弹第一小节试试。神奇的是小孩竟然发现自己已经能完整弹出来了。 这有点像我现在的学习状况前些天我还没搞明白线性模型和多层感知机就去看了后面卷积神经网络的内容。现在再回看前面的内容时竟然发现有点豁然开朗了所以有了前一篇文章。 当然并不是学任何东西都可以像练琴故事里那样往后学着学着前面的自然就会了。 我想说的其实是不要老想着有什么很好的学习方法陷入“完美主义”而迟迟不开始学。 学就是了或许学着学着你就可以搞明白之前觉得困惑的地方。 当然也不能非常头铁也是需要一定的“顶层设计”的。学的过程中要时刻搞清楚“是什么”和“为什么”。 一、softmax 回归 前面我们学习了回归它可以帮助我们解决“多少”的问题。比如预测房屋的价格是多少某支篮球队的胜场数是多少等等。 在生活中我们除了会碰到“多少”的问题还会碰到“哪一个”的分类问题如 某个图像是蚂蚁还是蜜蜂某人有可能去看哪一部电影 这两个的问题界限比较模糊其中一个原因是分类可以用回归实现。 就比如我们只希望得到结果到底是哪个类别到底是蚂蚁还是蜜蜂。 但在实现时我们会采用连续值的方法即如果这张图片属于蚂蚁的概率超过了某个值我们就把它分为蚂蚁这一类。 分类问题 我们从一个图像分类问题开始。假设每次输入的是一个 2 × 2 2\times2 2×2 的灰度图像需要判断其是“猫”、“狗”还是“鸡”。 对图像的基本知识不清楚的可以另外看看其他资料。 我们可以用一个标量表示每个像素值这样一个图像就对应于四个特征 x 1 , x 2 , x 3 , x 4 x_1,x_2,x_3,x_4 x1​,x2​,x3​,x4​。 接下来我们要选择如何表示类别标签。统计学家发明了一种简单的表示分类数据的方法独热编码(one-hot encoding)。 独热编码是一个向量它的分量和类别一样多。类别对应的分量设为 1其他分量设为 0。 网络架构 前面提到我们实现分类需要计算出所有可能类别的条件概率因此需要一个有多输出的模型每个类型对应于一个输出。 为了解决线性模型的分类问题我们需要和输出一样多的仿射函数(affine function)每个输出对应于它自己的仿射函数。 与线性回归一样softman 回归也是一个单层神经网络如下图。由于计算每个输出取决于所有输入所以 softmax 回归的输出层也是全连接层。 softmax 运算 有了多个输出后怎么确定好分类结果呢我们设置一个阈值比如选择具有最大概率的标签作为预测类别。 例如得到的三个输出分别为 0.80.1 和 0.1那么我们预测的类别可以说是 1。 若是出现三个输出为 0.80.6 和 0.4 呢我们还能直接确定预测类别是 1 吗 答案是否定的。一方面线性层没法保证所有输出之和为 1另一方面不同的输入输出结果可能是负值。这两条违反了概率的基本公理。 要将输出视为概率我们必须保证在任何数据上的输出是非负的且总和为 1。此外我们需要一个训练的目标函数来激励模型精准地估计概率。 例如在分类器输出 0.5 的所有样本中我们希望这些样本确实是有一半预测对了。这个属性称为校准(calibration)。 1959 年社会科学家邓肯·卢斯在选择模型(choice model)的基础上发明的 s o f t m a x softmax softmax 函数正是这样做的 softmax 函数能够将未规范化的预测变换为非负数且总和为 1同时让模型保持可导的性质。如下式 y ^ s o f t m a x ( o ) , y ^ j exp ⁡ o j ∑ k exp ⁡ ( o k ) \hat{\pmb{y}}softmax(\pmb{o}),\hat{y}_j\frac{\exp{o_j}}{\sum_k\exp{(o_k)}} y^​softmax(o),y^​j​∑k​exp(ok​)expoj​​ 这个让我想起了交通规划里的 Logit 模型也是通过这个公式将效用转为选择概率的。 尽管 softmax 是一个非线性函数但 softmax 回归的输出仍然是由输入特征的仿射变换决定的。因此softmax 回归是一个线性模型(linear model)。 二、softmax 回归的从零开始实现 准备数据集 与线性回归实现时我们自己生成数据集不同我们借助已有的图像分类数据集 Fashion-MNIST。 Fashion-MNIST由10个类别的图像组成分别为t-shirtT恤、trouser裤子、pullover套衫、dress连衣裙、coat外套、sandal凉鞋、shirt衬衫、sneaker运动鞋、bag包和ankle boot短靴。 每个类别由训练数据集train dataset中的6000张图像和测试数据集test dataset中的1000张图像组成。 因此训练集和测试集分别包含60000和10000张图像图像大小为 28 × 28 28\times28 28×28。测试数据集不会用于训练只用于评估模型性能。 torchvision 为我们提供了一系列机器视觉工具包其中就包括图像数据集及图像处理工具 transforms。 为了使我们读取图像时更轻松我们直接使用 DataLoader并使用多线程 loader_num 读取数据集。 将下载数据集与读取数据集整合进一个函数中并加入 resize 参数用于对图像大小进行调整。 def load_data_fashion_mnist(batch_size, loader_num, resizeNone): # 数据集准备下载Fashion-MNIST数据集然后将其加载到内存中trans [transforms.ToTensor()] # 数据变换操作列表if resize: # 如果需要改变形状的话把resize的操作加到变换列表里trans.insert(0, transforms.Resize(resize))trans transforms.Compose(trans) # 将变换操作集合起来# 下载训练集和数据集mnist_train torchvision.datasets.FashionMNIST(root../dataset, trainTrue, transformtrans, downloadTrue)mnist_test torchvision.datasets.FashionMNIST(root../dataset, trainFalse, transformtrans, downloadTrue)return (data.DataLoader(mnist_train, batch_size, shuffleTrue,num_workersloader_num),data.DataLoader(mnist_test, batch_size, shuffleFalse,num_workersloader_num))这段代码的逻辑是首先创建一个只有改变数据格式操作的列表接着判断是否需要改变图像形状大小如果需要则将其加入到列表中。 接着下载 torchvision 中的训练/测试集最后函数返回两个 DataLoader分别用于读取训练和测试集。 初始化模型参数 对于 28 × 28 28\times28 28×28 的图像如果我们把每个像素位置看作一个特征的话其具有 28 × 28 784 28\times28784 28×28784 个特征因此模型的输入为 784 维。数据集具有 10 个类别故输出维度为 10。 softmax 回归也可视为线性模型因此其同样只具有两个参数权重 w w w 和偏置 b b b。其中权重为 784 × 10 784\times10 784×10 的矩阵偏置为 1 × 10 1\times10 1×10 行的向量即 y 1 × 10 x 1 × 784 w 784 × 10 b 1 × 10 \pmb{y}_{1\times10}\pmb{x}_{1\times784}\pmb{w}_{784\times10}b_{1\times10} y1×10​x1×784​w784×10​b1×10​ 权重采用均值为 0标准差为 0.01 的正态分布随机数初始化偏置初始设置零向量。 num_inputs 784num_outputs 10W torch.normal(0, 0.01, size(num_inputs, num_outputs), requires_gradTrue)b torch.zeros(num_outputs, requires_gradTrue)定义 softmax 操作 因为模型中需要通过 softmax 运算将输出的结果转为概率因此在定义模型前需要先定义 softmax 操作。 softmax 操作由以下三个步骤组成 对每项求 exp 幂对每一行求和每一行代表一个样本得到每个样本的规范化常数每一行除以其规范化常数确保结果之和为 1。 def softmax(X): # 定义 softmax 操作X_exp torch.exp(X)partition X_exp.sum(1, keepdimTrue) # keepdim 指保持维度不变return X_exp / partition # 这里应用了广播机制定义模型 定义好 softmax 操作后我们就可以定义 softmax 回归模型。 这里注意需要对输入的 X 进行 reshape 操作将其展平为 1 × 784 1\times784 1×784。 def net(X): # 定义模型return softmax(torch.matmul(X.reshape((-1, W.shape[0])), W) b)定义损失函数 与线性回归采用平方损失函数不同softmax 回归采用的是交叉熵损失(cross-entropy loss)。 对于任何标签 y \pmb{y} y 和模型预测 y ^ \hat{\pmb{y}} y^​损失函数为 l ( y , y ^ ) − ∑ j 1 q y j log ⁡ y ^ j . l(\pmb{y},\hat{\pmb{y}})-\sum_{j1}^qy_j\log{\hat{y}_j}. l(y,y^​)−j1∑q​yj​logy^​j​. 这可能是深度学习中最常见的损失函数因为分类问题的数量远远超过回归问题的数量。 def cross_entropy(y_hat, y): # 交叉熵损失函数return - torch.log(y_hat[range(len(y_hat)), y])定义优化器 我们仍然采用小批量随机梯度下降对参数进行更新代码和前面线性回归的一样。 def my_optimizer(params, lr, batch_size): # 定义优化器小批量随机梯度下降with torch.no_grad(): # 以下操作不计算梯度for param in params:param - lr * param.grad / batch_sizeparam.grad.zero_()分类精度 给定预测概率 y ^ \hat{y} y^​当我们必须输出硬预测(hard prediction)时我们通常选择预测概率最高的类。 当预测与真实标签一致时说明该样本预测正确。分类精度即预测正确的样本数与总样本数之比。 精度是我们最关心的性能衡量标准几乎所有分类问题都会关注它。 我们首先定义一个计算精度的函数当传入预测值和真实值时这个函数可以返回预测正确的数量。 def accuracy(y_hat, y):计算预测正确的数量if len(y_hat.shape) 1 and y_hat.shape[1] 1:y_hat y_hat.argmax(axis1)cmp y_hat.type(y.dtype) yreturn float(cmp.type(y.dtype).sum())当模型训练完后我们还需要计算其在测试集上的表现因此我们可以定义一个函数用于计算模型在指定数据集上的精度。 def evaluate_accuracy(net, data_iter):计算在指定数据集上模型的精度if isinstance(net, torch.nn.Module):net.eval() # 将模型设置为评估模式metric Accumulator(2) # 正确预测数、预测总数with torch.no_grad():for X, y in data_iter:metric.add(accuracy(net(X), y), y.numel())return metric[0] / metric[1]由于是小批量读取我们还需要定义一个累加器 Accumulator 类用于得到整个数据集的精度。 class Accumulator:在n个变量上累加def __init__(self, n):self.data [0.0] * ndef add(self, *args):self.data [a float(b) for a, b in zip(self.data, args)]def reset(self):self.data [0.0] * len(self.data)def __getitem__(self, idx):return self.data[idx]训练 softmax 回归的训练过程和线性回归很类似从初始的参数出发逐轮训练计算损失并更新。 因为我们需要查看每一轮训练后的效果所以需要单独定义一个训练一轮的函数。 除此之外我们还需要定义一个完整训练的函数该函数反复调用训练一轮的函数。这样当换了一个模型时我们也只需要改变传入的参数即可实现新模型的训练。 训练一轮的函数代码如下。函数内首先判断这个模型是否是实例化了 nn.Module 这个类例如线性回归从零开始的模型是自己实现的而简洁实现则是使用了 nn.Linear。 之后定义累加器开始 for 循环批量读取训练集计算损失并更新。接着判断是调用了 pytorch 的损失函数和优化器还是使用了自己写的各自有不同的写法。 最后返回整个训练集的平均训练损失与训练集上的精度。 def train_epoch(net, train_iter, loss, updater): #save训练模型一个迭代周期# 将模型设置为训练模式if isinstance(net, torch.nn.Module):net.train()# 训练损失总和、训练准确度总和、样本数metric Accumulator(3)for X, y in train_iter:# 计算梯度并更新参数y_hat net(X)l loss(y_hat, y)if isinstance(updater, torch.optim.Optimizer):# 使用PyTorch内置的优化器和损失函数updater.zero_grad()l.mean().backward()updater.step()else:# 使用定制的优化器和损失函数l.sum().backward()updater([W, b], lr, batch_size)metric.add(float(l.sum()), accuracy(y_hat, y), y.numel())# 返回训练损失和训练精度return metric[0] / metric[2], metric[1] / metric[2]完整训练的函数代码如下。在传入模型、训练集、测试集、损失函数、训练轮数和优化器后进入 for 循环开始调用训练一轮的函数可以返回该轮训练后的损失以及精度。 接着利用 evaluate_accuracy 函数计算此轮训练后的模型在测试集上的精度。往后的 writer 和 print 都是为了可视化训练情况其中前者是利用了 pytorch 自带的 tensorboard。 def train(net, train_iter, test_iter, loss, num_epochs, updater):训练模型for epoch in range(num_epochs):train_loss, train_acc train_epoch(net, train_iter, loss, updater)test_acc evaluate_accuracy(net, test_iter)writer.add_scalar(train_loss, train_loss, epoch)writer.add_scalar(train_acc, train_acc, epoch)writer.add_scalar(test_loss, test_acc, epoch)print(f第{epoch 1}轮的训练损失为{train_loss})print(f第{epoch 1}轮的训练精度为{train_acc})print(f第{epoch 1}轮的测试集精度为{test_acc})return train_loss, train_acc, test_acc 以上是实现模型训练所需要的函数下面我们开始编写主代码。李沐老师的代码是用 jupyter notebook 编写的而我是用 pycharm有些时候就会报错。 我猜测可能是设置了多线程的原因我需要把主代码写在 if __name__ __main__: 里才可以运行。 if __name__ __main__:lr 0.1 # 学习率batch_size 256writer SummaryWriter(./runs) # 设置tb文件保存位置train_iter, test_iter load_data_fashion_mnist(batch_size, 4)# 初始化权重和偏置num_inputs 784num_outputs 10W torch.normal(0, 0.01, size(num_inputs, num_outputs), requires_gradTrue)b torch.zeros(num_outputs, requires_gradTrue)# 设置随机种子方便复现random_seed 326torch.manual_seed(random_seed)# 训练num_epochs 40train_loss, train_acc, test_acc train(net, train_iter, test_iter, cross_entropy, num_epochs, my_optimizer)writer.close()开始运行后训练过程的数据会被记录在 ./runs 文件夹下即当前目录下的 runs 文件夹下。 我们在左侧目录下找到 runs 文件夹右键选择复制相对路径。接着打开底部 Terminal输入 conda activate pytorch 激活项目的虚拟环境回车。 配置 pytorch 环境我是按照 b 站土堆视频来的环境名称就叫 pytorch。 随后输入 tensorboard --logdir接着粘贴刚复制的相对路径回车它会返回给你一个网址点击它即可进入 tensorboard。 随后点击上方右侧的 SCALARS就可以看到我们本次训练的训练损失、训练精度、测试精度随训练轮数的变化。 从图中可以发现训练损失并未收敛到一个稳定的常数其他两项也是。不过要注意纵坐标训练精度和测试精度其实已经算比较稳定了。 另外运行的时间也比较长因此我打算增加训练轮数到 40 轮并利用 GPU 进行训练。 增加训练轮数简单把 num_epochs 改为 40 即可。 利用 GPU 训练的话需要数据、模型都放进 GPU。定义的使用 GPU 的函数如下 def try_gpu(i0): # 有 GPU 则使用否则使用 CPU如果存在则返回gpu(i)否则返回cpu()if torch.cuda.device_count() i 1:return torch.device(fcuda:{i})return torch.device(cpu)接着在相应模型和数据后添加 .to(try_gpu())具体位置可见文章末尾完整代码我是按照土堆视频里那样加的。 再次运行前记得把原本 runs 文件夹下的文件先删掉不然可能出来的图中含有上一次的数据。 运行过程中我看着控制台似乎打印的速度和前面用 CPU 差不多我还上网搜了怎么确认使用了 GPU 训练。 打开任务管理器和使用 nvidia-smi 都显示 GPU 在使用。同时我注意到我的 CPU 使用率是 100%。 网上说是可能还存在读写操作所以影响 GPU 的使用我感觉可能是 tensorboard 的使用导致的。不管了我也忘了测一下运行时间后面再研究研究。 训练了 40 轮后的相关结果如下感觉不错。 第40轮的训练损失为0.4002220250447591 第40轮的训练精度为0.86335 第40轮的测试集精度为0.8424遗憾地是从训练损失变化图来看40 轮训练似乎也并未收敛。 三、softmax 回归的简洁实现 下面我们使用 pytorch 框架来简洁地实现 softmax 回归。准备数据集和前面一样用的同一个函数batch_size 也不变。 定义模型与初始化模型参数 回想一下从零开始实现原本数据集中的图像大小是 28 × 28 28\times28 28×28我们把它 reshape 成 1 × 784 1\times784 1×784 才传入线性层。这一操作称为展平pytorch 中有专门的层(Flatten())来实现类似的处理。 因此softmax 使用的模型有两层一层为 Flatten()另一层为 nn.Linear(784, 10)。 # PyTorch不会隐式地调整输入的形状。因此# 我们在线性层前定义了展平层flatten来调整网络输入的形状net nn.Sequential(nn.Flatten(), nn.Linear(784, 10)) # 定义模型在简洁实现线性回归时由于其只有一层线性层初始化模型采用的是直接指定net[0]的两个参数。 而如果层数较多时直接指定不太方面我们可以自己定义一个权重的函数利用 net.apply 对每一层进行初始化而如果需要对某层进行特定操作时可在函数中加入 if 判断。 def init_weights(m): # 对特定层的权重进行初始化偏置默认为0初始化if type(m) nn.Linear:nn.init.normal_(m.weight, mean0, std0.01)损失函数 损失函数直接调用 nn 模块下的现成函数即可。 loss nn.CrossEntropyLoss(reductionnone) # 损失函数这里取值none即直接返回loss向量优化器 优化器通用调用 nn.optim 下现成的函数即可。 optimizer torch.optim.SGD(net.parameters(), lrlr) # 优化器训练 进行训练可以直接调用我们在从零开始实现时写好的训练函数。由于我们在训练函数中已经进行了if判断因此只要直接修改传入的参数即可。 num_epochs 10train_loss, train_acc, test_acc train(net, train_iter, test_iter, loss, num_epochs, optimizer)运行如下程序可得到第十轮训练后的相关评估结果。 if __name__ __main__:lr 0.1 # 学习率batch_size 256writer SummaryWriter(./runs/softmax_concise) # 设置tb文件保存位置train_iter, test_iter load_data_fashion_mnist(batch_size, 4)# 初始化权重和偏置简洁实现时未采用num_inputs 784num_outputs 10W torch.normal(0, 0.01, size(num_inputs, num_outputs),requires_gradTrue, devicetry_gpu())b torch.zeros(num_outputs, requires_gradTrue, devicetry_gpu())# 设置随机种子方便复现random_seed 326torch.manual_seed(random_seed)# PyTorch不会隐式地调整输入的形状。因此# 我们在线性层前定义了展平层flatten来调整网络输入的形状net nn.Sequential(nn.Flatten(), nn.Linear(784, 10)) # 定义模型net net.to(try_gpu())net.apply(init_weights) # 初始化模型参数loss nn.CrossEntropyLoss(reductionnone) # 损失函数这里取值none即直接返回loss向量optimizer torch.optim.SGD(net.parameters(), lrlr) # 优化器num_epochs 10train_loss, train_acc, test_acc train(net, train_iter, test_iter, loss, num_epochs, optimizer)writer.close()第10轮的训练损失为0.4472448839187622 第10轮的训练精度为0.8485666666666667 第10轮的测试集精度为0.8322softmax 回归的两种实现代码见附件
http://www.hkea.cn/news/14559395/

相关文章:

  • 宁波公司网站建立西安网络优化哪家好
  • 网站开发用什么语言最多系统花钱做任务的小说魅网站
  • 网站的运营模式门户网站 需求
  • 海城百度公司 海城网站建设广东深圳房价
  • 做网站负责人有法律风险吗新共享项目加盟代理
  • 网站的跟目录淘客 wordpress 数据
  • 网站备案号在哪作风建设提升年活动网站
  • 池州网站建设兼职设计网装修
  • 如何建设一个简单的公司网站jsp可以做网站吗
  • 平面设计好的网站wordpress 删除 分类存档
  • .net网站开发书如何建设百度网站
  • 坪山网站建设多少钱百度帐号登录
  • 河南平台网站建设制作网站登录界面模板html
  • 静安做网站公司wordpress春菜
  • 网站跳出率高精品课程网站设计报告
  • wordpress媒体库播放器seo需要会什么
  • 网站的三种基本类型网上银行入口
  • 网站建设的展望 视频化妆品网站设计模板
  • 沈阳市做网站电话网站建设欧美
  • 深度网营销型网站建设公司怎么样梁山专做网站的公司
  • 如何建设网站步骤给公司做网站需要华多少钱
  • 没有网站做APP兰甘肃网站建设
  • 广州做网站公司培训做性的网站
  • 网站维护内容如何开网店卖自己的东西
  • 阿里云做网站官网国外网站做营销
  • 网站流量指标WordPress文章消失
  • 网站设计行业前景打广告的免费软件
  • wap网站开发做网站功能模块
  • 哪些网站可以免费做产品推广赚钱软件下载
  • dedecms做的网站河北注册公司流程和费用