自己公司做公益网站怎么弄企业所得税优惠

news/2025/10/9 11:18:55/文章来源:
自己公司做公益网站怎么弄,企业所得税优惠,有了域名怎么制作网站吗,网站后台添加图片显示不了第4章 机器学习基础 本章包括以下内容#xff1a; 除分类和回归之外的机器学习形式 评估机器学习模型的规范流程 为深度学习准备数据 特征工程 解决过拟合 处理机器学习问题的通用工作流程 学完第 3 章的三个实例#xff0c;你应该已经知道如何用神经网络解决分类问题和回归…第4章 机器学习基础 本章包括以下内容 除分类和回归之外的机器学习形式 评估机器学习模型的规范流程 为深度学习准备数据 特征工程 解决过拟合 处理机器学习问题的通用工作流程 学完第 3 章的三个实例你应该已经知道如何用神经网络解决分类问题和回归问题而且也看到了 机器学习的核心难题过拟合 。本章会将你对这些问题的直觉固化为解决深度学习问题的可靠的概念框架。我们将把所有这些概念——模型评估、数据预处理、特征工程、解决过拟合——整合为详细的 七步工作流程 用来解决任何机器学习任务。 4.1 机器学习的四个分支 三种类型的机器学习问题二分类问题、多分类问题和标量回归问题。这三者都是监督学习supervised learning的例子其目标是学习训练输入与训练目标之间的关系。 4.1.1 监督学习 监督学习只是冰山一角——机器学习是非常宽泛的领域其子领域的划分非常复杂。机器学习算法大致可分为四大类我们将在接下来的四小节中依次介绍。 监督学习是目前最常见的机器学习类型 。给定一组样本通常由人工标注它可以学会将输入数据映射到已知目标也叫 标注 annotation。本书前面的四个例子都属于监督学习。一 般来说近年来广受关注的深度学习应用几乎都属于监督学习比如光学字符识别、语音识别、 图像分类和语言翻译。 虽然监督学习主要包括分类和回归但还有更多的奇特变体 主要包括如下几种。 序列生成sequence generation 。给定一张图像预测描述图像的文字。序列生成有时可以被重新表示为一系列分类问题比如反复预测序列中的单词或标记。 语法树预测syntax tree prediction 。给定一个句子预测其分解生成的语法树。 目标检测object detection 。给定一张图像在图中特定目标的周围画一个边界框。这个问题也可以表示为分类问题给定多个候选边界框对每个框内的目标进行分类或分类与回归联合问题用向量回归来预测边界框的坐标。 图像分割image segmentation 。给定一张图像在特定物体上画一个像素级的掩模 mask 。 4.1.2 无监督学习 无监督学习是指在没有目标的情况下寻找输入数据的有趣变换其目的在于数据可视化、数据压缩、数据去噪或更好地理解数据中的相关性。无监督学习是数据分析的必备技能在解决监督学习问题之前为了更好地了解数据集它通常是一个必要步骤。 降维 dimensionality reduction 和 聚类 clustering 都是众所周知的无监督学习方法。 4.1.3 自监督学习 自监督学习是监督学习的一个特例它与众不同 值得单独归为一类。自监督学习是没有人工标注的标签的监督学习 你可以将它看作没有人类参与的监督学习。标签仍然存在因为总要有什么东西来监督学习过程但它们是从输入数据中生成的通常是使用启发式算法生成的。 举个例子 自编码器autoencoder 是有名的自监督学习的例子其生成的目标就是未经修改的输入。同样给定视频中过去的帧来预测下一帧或者给定文本中前面的词来预测下一个词都是自监督学习的例子这两个例子也属于 时序监督学习temporally supervised learning 即用未来的输入数据作为监督。 注意监督学习、自监督学习和无监督学习之间的区别有时很模糊这三个类别更像是没有明确界限的连续体。自监督学习可以被重新解释为监督学习或无监督学习这取决于你关注的是学习机制还是应用场景。 注意 本书的重点在于监督学习因为它是当前深度学习的主要形式行业应用非常广泛。后续章节也会简要介绍自监督学习。 4.1.4 强化学习 强化学习一直以来被人们所忽视但最近随着 Google 的 DeepMind 公司将其成功应用于学习玩Atari 游戏以及后来学习下围棋并达到最高水平机器学习的这一分支开始受到大量关注。在强化学习中 智能体agent 接收有关其环境的信息并学会选择使某种奖励最大化的行动。例如神经网络会“观察”视频游戏的屏幕并输出游戏操作目的是尽可能得高分这种神经网络可以通过强化学习来训练。 目前强化学习主要集中在研究领域除游戏外还没有取得实践上的重大成功。但是我们期待强化学习未来能够实现越来越多的实际应用自动驾驶汽车、机器人、资源管理、教育等。强化学习的时代已经到来或即将到来。 分类和回归术语表 分类和回归都包含很多专业术语。前面你已经见过一些术语在后续章节会遇到更多。这些术语在机器学习领域都有确切的定义你应该了解这些定义。 样本 sample 或输入 input 进入模型的数据点。 预测 prediction 或输出 output 从模型出来的结果。 目标 target 真实值。对于外部数据源理想情况下模型应该能够预测出目标。 预测误差prediction error或损失值loss value模型预测与目标之间的距离。 类别 class 分类问题中供选择的一组标签。例如对猫狗图像进行分类时“狗” 和“猫”就是两个类别。 标签 label 分类问题中类别标注的具体例子。比如如果 1234 号图像被标注为 包含类别“狗”那么“狗”就是 1234 号图像的标签。 真值ground-truth或标注annotation数据集的所有目标通常由人工收集。 二分类 binary classification 一种分类任务每个输入样本都应被划分到两个互 斥的类别中。 多分类 multiclass classification 一种分类任务每个输入样本都应被划分到两个 以上的类别中比如手写数字分类。 多标签分类 multilabel classification 一种分类任务每个输入样本都可以分配多 个标签。举个例子如果一幅图像里可能既有猫又有狗那么应该同时标注“猫” 标签和“狗”标签。每幅图像的标签个数通常是可变的。 标量回归 scalar regression 目标是连续标量值的任务。预测房价就是一个很好的 例子不同的目标价格形成一个连续的空间。 向量回归 vector regression 目标是一组连续值比如一个连续向量的任务。如 果对多个值比如图像边界框的坐标进行回归那就是向量回归。 小批量 mini-batch 或批量 batch 模型同时处理的一小部分样本样本数通常 为 8~128 。样本数通常取 2 的幂这样便于 GPU 上的内存分配。训练时小批量 用来为模型权重计算一次梯度下降更新。 4.2 评估机器学习模型 在第 3 章介绍的三个例子中我们将数据划分为训练集、验证集和测试集。我们没有在训练模型的相同数据上对模型进行评估其原因很快显而易见仅仅几轮过后三个模型都开始过拟合。也就是说随着训练的进行模型在训练数据上的性能始终在提高但在前所未见的数据上的性能则不再变化或者开始下降。 机器学习的目的是得到可以泛化generalize的模型 即在前所未见的数据上表现很好的模型而过拟合则是核心难点。你只能控制可以观察的事情所以能够可靠地衡量模型的泛化能力非常重要。后面几节将介绍降低过拟合以及将泛化能力最大化的方法。本节重点介绍如何衡量泛化能力即如何评估机器学习模型。 4.2.1 训练集、验证集和测试集 评估模型的重点是将数据划分为三个集合训练集、验证集和测试集。在训练数据上训练模型在验证数据上评估模型。一旦找到了最佳参数就在测试数据上最后测试一次。 你可能会问为什么不是两个集合一个训练集和一个测试集在训练集上训练模型然后在测试集上评估模型。这样简单得多 原因在于开发模型时总是需要调节模型配置比如选择层数或每层大小这叫作模型的 超参数hyperparameter 以便与模型 参数即权重区分开。 这个调节过程需要使用模型在验证数据上的性能作为反馈信号 。这个调节过程本质上就是一种 学习 在某个参数空间中寻找良 好的模型配置。因此如果基于模型在验证集上的性能来调节模型配置会很快导致模型在验证集上过拟合 即使你并没有在验证集上直接训练模型也会如此。 造成这一现象的关键在于信息泄露information leak 。每次基于模型在验证集上的性能来 调节模型超参数都会有一些关于验证数据的信息泄露到模型中。如果对每个参数只调节一次 那么泄露的信息很少验证集仍然可以可靠地评估模型。但如果你多次重复这一过程运行一 次实验在验证集上评估然后据此修改模型那么将会有越来越多的关于验证集的信息泄露 到模型中。 最后你得到的模型在验证集上的性能非常好人为造成的因为这正是你优化的目的。你关心的是模型在全新数据上的性能而不是在验证数据上的性能 因此你需要使用一个完全不同的、前所未见的数据集来评估模型它就是测试集 。你的模型一定不能读取与测试集有关的 任何信息既使间接读取也不行。如果基于测试集性能来调节模型那么对泛化能力的衡量是不准确的。 将数据划分为训练集、验证集和测试集可能看起来很简单但如果可用数据很少还有几种高级方法可以派上用场。我们先来介绍 三种经典的评估方法 简单的留出验证、K 折验证以及带有打乱数据的重复 K 折验证。 1. 简单的留出验证 留出一定比例的数据作为测试集。在剩余的数据上训练模型然后在测试集上评估模型。如前所述为了防止信息泄露你不能基于测试集来调节模型所以还应该保留一个验证集。 留出验证hold-out validation 的示意图见图 4-1 。代码清单 4-1 给出了其简单实现。 import numpy as npnum_validation_samples 10000 np.random.shuffle(data) # 通常需要打乱数据 validation_data data[:num_validation_samples] # 定义验证集 data data[num_validation_samples:] training_data data[:] # 定义训练集# 在训练数据上训练模型并在验证数据上评估模型 model get_model() model.train(training_data) validation_score model.evaluate(validation_data)# 现在你可以调节模型、重新训练、评估然后再次调节…… # 一旦调节好超参数通常就在所有非测试数据上从头开始训练最终模型 model get_model() model.train(np.concatenate([training_data,validation_data])) test_score model.evaluate(test_data)这是最简单的评估方法但有一个缺点 如果可用的数据很少那么可能验证集和测试集包含的样本就太少从而无法在统计学上代表数据 。这个问题很容易发现如果在划分数据前进行不同的随机打乱最终得到的模型性能差别很大那么就存在这个问题。接下来会介绍 K 折验证与重复的 K 折验证它们是解决这一问题的两种方法。 2. K 折验证 K 折验证K-fold validation将数据划分为大小相同的 K 个分区。对于每个分区 i在剩余的 K-1 个分区上训练模型然后在分区 i 上评估模型。 最终分数等于 K 个分数的平均值。对于不同的训练集 - 测试集划分如果模型性能的变化很大那么这种方法很有用。与留出验证一样这种方法也需要独立的验证集进行模型校正。 K 折交叉验证的示意图见图 4-2 。代码清单 4-2 给出了其简单实现。 4.2.2 评估模型的注意事项 4.3 数据预处理、特征工程和特征学习 除模型评估之外在深入研究模型开发之前我们还必须解决另一个重要问题 将数据输入神经网络之前如何准备输入数据和目标 许多数据预处理方法和特征工程技术都是和特定领域相关的比如只和文本数据或图像数据相关我们将在后续章节的实例中介绍这些内容。 4.3.1 神经网络的数据预处理 1. 向量化 神经网络的所有输入和目标都必须是浮点数张量 在特定情况下可以是整数张量。无论 处理什么数据声音、图像还是文本都必须首先将其转换为张量这一步叫作数据向量化 data vectorization。例如在前面两个文本分类的例子中开始时文本都表示为整数列表代 表单词序列然后我们用 one-hot 编码将其转换为 float32 格式的张量。在手写数字分类和预 测房价的例子中数据已经是向量形式所以可以跳过这一步。 2. 值标准化 在手写数字分类的例子中开始时图像数据被编码为 0~255 范围内的整数表示灰度值。 将这一数据输入网络之前你需要将其转换为 float32 格式并除以 255这样就得到 0~1 范围内的浮点数。同样预测房价时开始时特征有各种不同的取值范围有些特征是较小的浮点数有些特征是相对较大的整数。将这一数据输入网络之前你需要对每个特征分别做标准化使其均值为 0、标准差为 1。 一般来说将取值相对较大的数据比如多位整数比网络权重的初始值大很多或 异质数据 heterogeneous data 比如数据的一个特征在 0~1 范围内另一个特征在 100~200 范围内 输入到神经网络中是不安全的。这么做可能导致较大的梯度更新进而导致网络无法收敛。为 了让网络的学习变得更容易输入数据应该具有以下特征。 取值较小 大部分值都应该在 0~1 范围内。 同质性homogenous 所有特征的取值都应该在大致相同的范围内。 此外下面这种更严格的标准化方法也很常见而且很有用虽然不一定总是必需的例如 对于数字分类问题就不需要这么做。 将每个特征分别标准化使其平均值为 0。 将每个特征分别标准化使其标准差为 1 。 这对于 Numpy 数组很容易实现。 x - x.mean(axis0)  x / x.std(axis0) 假设 x 是一个形状为 (samples, features) 的二维矩阵 3. 处理缺失值 你的数据中有时可能会有缺失值。例如在房价的例子中第一个特征数据中索引编号为 0 的列是人均犯罪率。如果不是所有样本都具有这个特征的话怎么办那样你的训练数据 或测试数据将会有缺失值。 一般来说对于神经网络将缺失值设置为 0 是安全的只要 0 不是一个有意义的值。网络能够从数据中学到 0 意味着 缺失数据 并且会忽略这个值。 注意如果测试数据中可能有缺失值而网络是在没有缺失值的数据上训练的那么网络 不可能学会忽略缺失值。在这种情况下你应该人为生成一些有缺失项的训练样本多次复制 一些训练样本然后删除测试数据中可能缺失的某些特征。 4.3.2 特征工程 特征工程feature engineering 是指将数据输入模型之前利用你自己关于数据和机器学 习算法这里指神经网络的知识对数据进行硬编码的变换不是模型学到的以改善模型的 效果。多数情况下一个机器学习模型无法从完全任意的数据中进行学习。呈现给模型的数据 应该便于模型进行学习。 我们来看一个直观的例子。假设你想开发一个模型输入一个时钟图像模型能够输出对应的时间见图 4-3 。 如果你选择用图像的原始像素作为输入数据那么这个机器学习问题将非常困难。你需要 用卷积神经网络来解决这个问题而且还需要花费大量的计算资源来训练网络。 但如果你从更高的层次理解了这个问题你知道人们怎么看时钟上的时间那么可以为机 器学习算法找到更好的输入特征比如你可以编写 5 行 Python 脚本找到时钟指针对应的黑色 像素并输出每个指针尖的 ( x , y ) 坐标这很简单。然后一个简单的机器学习算法就可以学会这些坐标与时间的对应关系。 你还可以进一步思考进行坐标变换将 ( x , y ) 坐标转换为相对于图像中心的极坐标。这样输入就变成了每个时钟指针的角度 theta。现在的特征使问题变得非常简单根本不需要机器学习因为简单的舍入运算和字典查找就足以给出大致的时间。 这就是 特征工程的本质用更简单的方式表述问题从而使问题变得更容易。它通常需要深入理解问题。 深度学习出现之前特征工程曾经非常重要因为经典的浅层算法没有足够大的假设空间来自己学习有用的表示。将数据呈现给算法的方式对解决问题至关重要。例如卷积神经网络在 MNIST 数字分类问题上取得成功之前其解决方法通常是基于硬编码的特征比如数字图像中的圆圈个数、图像中每个数字的高度、像素值的直方图等。 幸运的是对于现代深度学习大部分特征工程都是不需要的因为神经网络能够从原始 数据中自动提取有用的特征。这是否意味着只要使用深度神经网络就无须担心特征工程呢并不是这样原因有两点。 良好的特征仍然可以让你用更少的资源更优雅地解决问题 。例如使用卷积神经网络来读取钟面上的时间是非常可笑的。 良好的特征可以让你用更少的数据解决问题 。深度学习模型自主学习特征的能力依赖于大量的训练数据。如果只有很少的样本那么特征的信息价值就变得非常重要。 4.4 过拟合与欠拟合 在上一章的三个例子预测电影评论、主题分类和房价回归中模型在留出验证数据上的性能总是在几轮后达到最高点然后开始下降。也就是说模型很快就在训练数据上开始过拟合 。过拟合存在于所有机器学习问题中。学会如何处理过拟合对掌握机器学习至关重要。 机器学习的根本问题是优化和泛化之间的对立 。 优化optimization是指调节模型以在训练数据上得到最佳性能即机器学习中的学习。 泛化generalization是指训练好的模型在前所未见的数据上的性能好坏 。 机器学习的目的当然是得到良好的泛化但你无法控制泛化只能基于训练数据调节模型。 训练开始时优化和泛化是相关的训练数据上的损失越小测试数据上的损失也越小。这时的模型是 欠拟合underfit 的即仍有改进的空间网络还没有对训练数据中所有相关模式建模。但在训练数据上迭代一定次数之后泛化不再提高验证指标先是不变然后开始变差即模型开始过拟合。这时模型开始学习仅和训练数据有关的模式但这种模式对新数据来说是错误的或无关紧要的。 为了防止模型从训练数据中学到错误或无关紧要的模式最优解决方法是获取更多的训练数据。模型的训练数据越多泛化能力自然也越好。如果无法获取更多数据次优解决方法是调节模型允许存储的信息量或对模型允许存储的信息加以约束。如果一个网络只能记住几个模式那么优化过程会迫使模型集中学习最重要的模式这样更可能得到良好的泛化。 这种降低过拟合的方法叫作 正则化regularization 。我们先介绍几种最常见的正则化方法然后将其应用于实践中以改进 3.4 节的电影分类模型。 4.4.1 减小网络大小 防止过拟合的最简单的方法就是减小模型大小即减少模型中可学习参数的个数这由层数和每层的单元个数决定。在深度学习中模型中可学习参数的个数通常被称为模型的容量 capacity 。直观上来看参数更多的模型拥有更大的 记忆容量 memorization capacity因此能够在训练样本和目标之间轻松地学会完美的字典式映射这种映射没有任何泛化能力。例如拥有 500 000 个二进制参数的模型能够轻松学会 MNIST 训练集中所有数字对应的类别——我们 只需让 50 000 个数字每个都对应 10 个二进制参数。但这种模型对于新数字样本的分类毫无用处。 始终牢记深度学习模型通常都很擅长拟合训练数据但真正的挑战在于泛化而不是拟合。 与此相反如果网络的记忆资源有限则无法轻松学会这种映射。因此为了让损失最小化 网络必须学会对目标具有很强预测能力的压缩表示这也正是我们感兴趣的数据表示。同时请 记住你使用的模型应该具有足够多的参数以防欠拟合即模型应避免记忆资源不足。在容 量过大 与 容量不足 之间要找到一个折中。 不幸的是没有一个魔法公式能够确定最佳层数或每层的最佳大小。你必须评估一系列不 同的网络架构当然是在验证集上评估而不是在测试集上以便为数据找到最佳的模型大小。 要找到合适的模型大小一般的工作流程是开始时选择相对较少的层和参数然后逐渐增加层的大小或增加新层直到这种增加对验证损失的影响变得很小。 我们在电影评论分类的网络上试一下。原始网络如下所示。 from keras import models from keras import layers import matplotlib.pyplot from keras.datasets import imdb import numpy as np   (train_data, train_labels), (test_data, test_labels) imdb.load_data(     num_words10000)   # word_index 是一个将单词映射为整数索引的字典 word_index imdb.get_word_index()   # 键值颠倒将整数索引映射为单词 reverse_word_index dict(     [(value, key) for (key, value) in word_index.items()])     def vectorize_sequences(sequences, dimension10000):     results np.zeros((len(sequences), dimension))     # enumerate     for i, sequence in enumerate(sequences):         results[i, sequence] 1.  # 将 results[i] 的指定索引设为 1         # print(i, sequence)         # print(results)     return results     x_train vectorize_sequences(train_data) # 将测试数据向量化 x_test vectorize_sequences(test_data) y_train np.asarray(train_labels).astype(float32) y_test np.asarray(test_labels).astype(float32)   original_model models.Sequential() original_model.add(layers.Dense(16, activationrelu, input_shape(10000,))) original_model.add(layers.Dense(16, activationrelu)) original_model.add(layers.Dense(1, activationsigmoid))   original_model.compile(optimizerrmsprop,                        lossbinary_crossentropy,                        metrics[accuracy])   smaller_model models.Sequential() smaller_model.add(layers.Dense(4, activationrelu, input_shape(10000,))) smaller_model.add(layers.Dense(4, activationrelu)) smaller_model.add(layers.Dense(1, activationsigmoid))   smaller_model.compile(optimizerrmsprop,                       lossbinary_crossentropy,                       metrics[accuracy])   original_hist original_model.fit(x_train, y_train,                                    epochs20,                                    batch_size512,                                    validation_data(x_test, y_test))   smaller_model_hist smaller_model.fit(x_train, y_train,                                        epochs20,                                        batch_size512,                                        validation_data(x_test, y_test))   epochs range(1, 21) original_val_loss original_hist.history[val_loss] smaller_model_val_loss smaller_model_hist.history[val_loss] # bo 表示蓝色圆点 matplotlib.pyplot.plot(epochs, original_val_loss, bo, labelOriginal loss) # b 表示蓝色实线 matplotlib.pyplot.plot(epochs, smaller_model_val_loss, b, labelSmaller loss) matplotlib.pyplot.title(Training and validation loss) matplotlib.pyplot.xlabel(Epochs) matplotlib.pyplot.ylabel(Loss) matplotlib.pyplot.legend() matplotlib.pyplot.show() 如你所见更小的网络开始过拟合的时间要晚于参考网络前者 6 轮后开始过拟合而后 者 4 轮后开始而且开始过拟合之后它的性能变差的速度也更慢。 为了好玩我们再向这个基准中添加一个容量更大的网络容量远大于问题所需 bigger_model models.Sequential() bigger_model.add(layers.Dense(512, activationrelu, input_shape(10000,))) bigger_model.add(layers.Dense(512, activationrelu)) bigger_model.add(layers.Dense(1, activationsigmoid))   bigger_model.compile(optimizerrmsprop,                       lossbinary_crossentropy,                       metrics[accuracy])   bigger_model_hist bigger_model.fit(x_train, y_train,                                        epochs20,                                        batch_size512,                                        validation_data(x_test, y_test)) pochs range(1, 21) original_val_loss original_hist.history[val_loss] bigger_model_val_loss bigger_model_hist.history[val_loss] # bo 表示蓝色圆点 plt.plot(epochs, original_val_loss, bo, labelOriginal_ loss) # b 表示蓝色实线 plt.plot(epochs, bigger_model_val_loss, b, labelBigger loss) plt.title(Training and validation loss) plt.xlabel(Epochs) plt.ylabel(Loss) plt.legend() plt.show() 上图同时给出了这两个网络的训练损失。如你所见更大网络的训练损失很快就接近于零。 网络的容量越大它拟合训练数据即得到很小的训练损失的速度就越快但也更容易过拟合 导致训练损失和验证损失有很大差异。 4.4.2 添加权重正则化 | weight regularization 你可能知道 奥卡姆剃刀 Occam’s razor原理如果一件事情有两种解释那么最可能正 确的解释就是最简单的那个即假设更少的那个。这个原理也适用于神经网络学到的模型给定一些训练数据和一种网络架构很多组权重值即很多 模型都可以解释这些数据。 简单模型比复杂模型更不容易过拟合。 这里的 简单模型simple model是指参数值分布的熵更小的模型或参数更少的模型 比 如上一节的例子。因此一种常见的降低过拟合的方法就是强制让模型权重只能取较小的值 从而限制模型的复杂度这使得权 重值的分布更加规则regular 。这种方法叫作权重正则化 weight regularization 其实现方法是向网络损失函数中添加与较大权重值相关的 成本 cost 。 这个成本有两种形式。 L1 正则化L1 regularization 添加的成本与 权重系数的绝对值 权重的 L1 范数 norm 成正比。 L2 正则化L2 regularization 添加的成本与 权重系数的平方 权重的 L2 范数成正比。 神经网络的 L2 正则化也叫 权重衰减 weight decay。不要被不同的名称搞混权重衰减 与 L2 正则化在数学上是完全相同的。 在 Keras 中添加权重正则化的方法是向层传递 权重正则化项实例 weight regularizer instance 作为关键字参数。下列代码将向电影评论分类网络中添加 L2 权重正则化。 其中L1的限制使得大部分都在角的部分相交就使得某些参数为0而L2没有突出的角所以不能使得参数为0。总结就是L1会使得某些参数为0具有稀疏性而L2没有这个功能使得参数的值比较小去降低过拟合。 L1L2都是规则化的方式最小化目标函数类似于一个下坡的过程所以它们下降的坡不同L1是按照绝对值函数下坡L2是按照二次函数下坡在0附近L1的速度更快。 from keras import models from keras import layers import matplotlib.pyplot as plt from keras.datasets import imdb import numpy as np from keras import regularizers   # (train_data, train_labels), (test_data, test_labels) imdb.load_data(     num_words10000)     # def vectorize_sequences(sequences, dimension10000):     results np.zeros((len(sequences), dimension))     # enumerate     for i, sequence in enumerate(sequences):         results[i, sequence] 1.  # 将 results[i] 的指定索引设为 1         # print(i, sequence)         # print(results)     return results     x_train vectorize_sequences(train_data) # 将测试数据向量化 x_test vectorize_sequences(test_data) y_train np.asarray(train_labels).astype(float32) y_test np.asarray(test_labels).astype(float32)   original_model models.Sequential() original_model.add(layers.Dense(16, activationrelu, input_shape(10000,))) original_model.add(layers.Dense(16, activationrelu)) original_model.add(layers.Dense(1, activationsigmoid))   original_model.compile(optimizerrmsprop,                        lossbinary_crossentropy,                        metrics[accuracy])   original_hist original_model.fit(x_train, y_train,                                    epochs20,                                    batch_size512,                                    validation_data(x_test, y_test))   # l2(0.001) 的意思是该层权重矩阵的每个系数都会使网络总损失增加 0.001 * weight_ # coefficient_value。注意由于这个惩罚项只在训练时添加 # 所以这个网络的训练损失会比测试损失大很多。   l2_model models.Sequential() l2_model.add(layers.Dense(16, kernel_regularizerregularizers.l2(0.001),                           activationrelu, input_shape(10000,))) l2_model.add(layers.Dense(16, kernel_regularizerregularizers.l2(0.001),                           activationrelu)) l2_model.add(layers.Dense(1, activationsigmoid))   l2_model.compile(optimizerrmsprop,                  lossbinary_crossentropy,                  metrics[accuracy])   l2_model_hist l2_model.fit(x_train, y_train,                              epochs20,                              batch_size512,                              validation_data(x_test, y_test))   epochs range(1, 21) original_val_loss original_hist.history[val_loss]   l2_model_val_loss l2_model_hist.history[val_loss] # bo 表示蓝色圆点   plt.plot(epochs, original_val_loss, bo, labelOriginal loss) # b 表示蓝色实线 plt.plot(epochs, l2_model_val_loss, b, labell2 loss) plt.title(Training and validation loss) plt.xlabel(Epochs) plt.ylabel(Loss) plt.legend() plt.show() 上图显示了 L2 正则化惩罚的影响。如你所见即使两个模型的参数个数相同具有 L2 正则化的模型圆点比参考模型实线更不容易过拟合。 你还可以用 Keras 中以下这些权重正则化项来代替 L2 正则化。也可以同时做 L1 和 L2 正则化 from keras import regularizers regularizers.l1(0.001)  regularizers.l1_l2(l10.001, l20.001) 4.4.3 添加 dropout 正则化 dropout 是神经网络最有效也最常用的正则化方法之一它是由多伦多大学的 Geoffrey Hinton 和他的学生开发的。 对某一层使用 dropout就是在训练过程中随机将该层的一些输出特征舍弃设置为 0 。假设在训练过程中某一层对给定输入样本的返回值应该是向量 [0.2, 0.5, 1.3, 0.8, 1.1] 。使用 dropout 后这个向量会有几个随机的元素变成 0 比如 [0, 0.5, 1.3, 0, 1.1] 。 dropout 比率dropout rate是被设为 0 的特征所占的比例通常在 0.2~0.5 范围内 。测试时没有单元被舍弃而该层的输出值需要按 dropout 比率缩小因为这时比训练时 有更多的单元被激活需要加以平衡。 假设有一个包含某层输出的 Numpy 矩 阵 layer_output 其形状为 (batch_size, features) 。训练时我们随机将矩阵中一部分值设为 0 。 4.5 机器学习的通用工作流程 4.5.1 定义问题收集数据集 首先你必须定义所面对的问题。 你的输入数据是什么你要预测什么 只有拥有可用的训练数据你才能学习预测某件 事情。比如只有同时拥有电影评论和情感标注你才能学习对电影评论进行情感分类。 因此数据可用性通常是这一阶段的限制因素除非你有办法付钱让人帮你收集数据。 你面对的是什么类型的问题 是二分类问题、多分类问题、标量回归问题、向量回归问题 还是多分类、多标签问题或者是其他问题比如聚类、生成或强化学习确定问题类 型有助于你选择模型架构、损失函数等。 只有明确了输入、输出以及所使用的数据你才能进入下一阶段。注意你在这一阶段所做 的假设。 假设输出是可以根据输入进行预测的。 假设可用数据包含足够多的信息足以学习输入和输出之间的关系。 4.5.2 选择衡量成功的指标 要控制一件事物就需要能够观察它。要取得成功就必须给出成功的定义精度准确 率 precision 和召回率 recall 客户保留率衡量成功的指标将指引你选择损失函数即 模型要优化什么。它应该直接与你的目标如业务成功保持一致。 4.5.3 确定评估方法 一旦明确了目标你必须确定如何衡量当前的进展。前面介绍了三种常见的评估方法。 留出验证集 。数据量很大时可以采用这种方法。 K 折交叉验证 。如果留出验证的样本量太少无法保证可靠性那么应该选择这种方法。 重复的 K 折验证。如果可用的数据很少同时模型评估又需要非常准确那么应该使用 这种方法。 只需选择三者之一。大多数情况下第一种方法足以满足要求。 4.5.4 准备数据 4.5.5 开发比基准更好的模型 这一阶段的目标是获得 统计功效statistical power 即开发一个小型模型它能够打败纯随机的基准 dumb baseline 。在 MNIST 数字分类的例子中任何精度大于 0.1 的模型都可以说 具有统计功效在 IMDB 的例子中任何精度大于 0.5 的模型都可以说具有统计功效。 注意不一定总是能获得统计功效。如果你尝试了多种合理架构之后仍然无法打败随机基准 那么原因可能是问题的答案并不在输入数据中。要记住你所做的两个假设。 假设输出是可以根据输入进行预测的。 假设可用的数据包含足够多的信息足以学习输入和输出之间的关系。 这些假设很可能是错误的这样的话你需要从头重新开始。 如果一切顺利你还需要选择三个关键参数来构建第一个工作模型。 最后一层的激活。 它对网络输出进行有效的限制。例如 IMDB 分类的例子在最后一层 使用了 sigmoid 回归的例子在最后一层没有使用激活等等。 损失函数。 它应该匹配你要解决的问题的类型。例如 IMDB 的例子使用 binary_ crossentropy 、回归的例子使用 mse 等等。 优化配置。 你要使用哪种优化器学习率是多少大多数情况下使用 rmsprop 及其 默认的学习率是稳妥的。 关于损失函数的选择需要注意 直接优化衡量问题成功的指标不一定总是可行的 。有时 难以将指标转化为损失函数要知道损失函数需要在只有小批量数据时即可计算理想情况 下只有一个数据点时损失函数应该也是可计算的而且还必须是可微的否则无法用反向 传播来训练网络。例如广泛使用的分类指标 ROC AUC 就不能被直接优化。因此在分类任务 中常见的做法是优化 ROC AUC 的替代指标比如交叉熵。 一般来说你可以认为交叉熵越小 ROC AUC 越大。 4.5.6 扩大模型规模开发过拟合的模型 要搞清楚你需要多大的模型就必须开发一个过拟合的模型这很简单。 (1) 添加更多的层。 (2) 让每一层变得更大。 (3) 训练更多的轮次。 要始终监控训练损失和验证损失以及你所关心的指标的训练值和验证值。如果你发现模型在验证数据上的性能开始下降那么就出现了过拟合。 下一阶段将开始正则化和调节模型以便尽可能地接近理想模型既不过拟合也不欠拟合。 4.5.7 模型正则化与调节超参数| hyperparameter 这一步是最费时间的你将不断地调节模型、训练、在验证数据上评估这里不是测试数据、 再次调节模型然后重复这一过程直到模型达到最佳性能。你应该尝试以下几项。 添加 dropout 。 尝试不同的架构增加或减少层数。 添加 L1 和 / 或 L2 正则化。 尝试不同的超参数比如每层的单元个数或优化器的学习率以找到最佳配置。 可选反复做特征工程添加新特征或删除没有信息量的特征。 本章小结 定义问题与要训练的数据。收集这些数据有需要的话用标签来标注数据。 选择衡量问题成功的指标。你要在验证数据上监控哪些指标 确定评估方法留出验证 K 折验证你应该将哪一部分数据用于验证 开发第一个比基准更好的模型即一个具有统计功效的模型。 开发过拟合的模型。 基于模型在验证数据上的性能来进行模型正则化与调节超参数。许多机器学习研究往往 只关注这一步但你一定要牢记整个工作流程。 ———————————————— 版权声明本文为博主原创文章遵循 CC 4.0 BY-SA 版权协议转载请附上原文出处链接和本声明。                          原文链接https://blog.csdn.net/weixin_42963026/article/details/134316116

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/932468.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

德州网站建设招聘藁城外贸网站建设

一款经典游戏,会在时间的沉淀中被每一代玩家所怀念,经久不衰。对于紫龙游戏来讲,他们就是这样一群怀揣着创作出经典游戏的初心而聚集在一起的团队,致力于研发出被广大玩家喜爱的作品。 从 2015 年团队成立,到 2019 年走…

图表全能王新增支持散点图功能,数据分析更强大!

在数据分析和可视化的过程中,散点图(Scatter Plot)是一个非常有用的工具。它不仅可以帮助我们识别数据之间的关系,还能直观地展示变量之间的相关性。无论是科研、市场分析,还是财务分析,散点图都能提供极大的帮助…

图表全能王新增支持K线图,数据分析更强大!

数据分析不仅限于科研和市场调查,金融领域同样对精确的数据解读和可视化有着极高的要求。尤其是在股票、外汇、期货等市场中,K线图(Candlestick Chart)已经成为投资者分析市场趋势、捕捉交易信号的经典工具。今天,…

图表全能王 (ChartStudio) 新增径向树图 (Radial Tree Diagram):创新层级数据可视化

ChartStudio —— 一款强大的数据分析与可视化工具,最新版本新增了 径向树图 (Radial Tree Diagram) 功能,为用户提供了全新的数据可视化方式。径向树图可以帮助你清晰展示复杂的层级关系,带来更直观、创新的数据展…

建设银行龙卡网站双德网站建设

系列文章目录 stable diffusion实践操作 文章目录 系列文章目录前言一、seed是什么?二、使用步骤1.多批次随机生成多张图片2.提取图片seed3. 根据seed 再次培养4 seed使用4.1 复原别人图4.1 轻微修改 三、差异随机种子1. webUI位置2. 什么是差异随机种子3.使用差异…

图表全能王 (ChartStudio) 新增箱线图:轻松展示数据分布

ChartStudio —— 一款强大的数据分析与可视化工具,最新版本新增了 箱线图(Box Plot)功能,帮助用户更高效地展示数据的分布、离群点和集中趋势。 什么是箱线图? 箱线图是一种统计图表,常用于展示数据的分布情况。…

2025 年树脂排水沟厂家权威排行榜单,U形/线性/成品/混凝土/园林/市政/玻璃钢树脂排水沟公司推荐

一、树脂排水沟厂家推荐榜推荐一:淮安鑫塬铭新材料有限公司推荐指数:★★★★★ 口碑评分:9.9 分 品牌介绍:作为国内专业的树脂混凝土新材料研发与生产企业,淮安鑫塬铭新材料有限公司始终坚守 “诚信立业,质量为…

VS2022 过期

VS2022 过期今天我的VS2022 Enterprise快到期, 网上找了一下, 找到了这个, 验证Enterprise是OK的, Pro没试过, 记录一下Visual Studio 2022(VS2022)激活密钥 - 可均可可 - 博客园

论文速读 | 25年10月

Mastering the game of Go with deep neural networks and tree searchAlphaGo 2016 人类数据训练网络 —— 自我对弈强化学习 —— MCTS(PUCT)Mastering the game of Go without human knowledgeAlphaZero 2017 完全摒…

电子商务网站的建设的原理项目策划书模板范文

课程介绍 ES6新特性ReactJS入门学习 1、ES6 新特性 1.2、let 和 const 命令 var 之前,我们写js定义变量的时候,只有一个关键字: var var 有一个问题,变量作用域的问题,作用域不可控,就是定义的变量有时会…

怎么查网站备案做网站是买服务器还是买cdn

1. 一种软件测试方法,其特征在于,包括: 自动化测试工具执行数据生成自动化用例得到交易场景数据;其中,所述数据生成自 动化用例由自动化工具根据交易场景的数据编写得到; 使用预设数量的自动化用例和所述交易场景数据执…

营销型网站开发公司电话wordpress 集成安装包

点击蓝字“程序员考拉”欢迎关注!1 /直接将web项目文件件拷贝到webapps目录中这是最常用的方式,Tomcat的Webapps目录是Tomcat默认的应用目录,当服务器启动时,会加载所有这个目录下的应用。如果你想要修改这个默认目录,…

网站建站业务wordpress的模板目录在哪里

XML 被设计出来用于数据的记录和传递,经常被作用为配置文件 什么是XML 可扩展标记语言(Extensible Markup Language),没有固定的标签,所有的标签都可以自定义。使用简单的标记来描述数据通常,xml被用于信息的记录和传…

CF2145F Long Journey

你在 \(0\) 时刻位于数轴上的 \(0\) 位置。每个时刻开始时,你可以选择右移一个单位,或者停在原地。在第 \(t\) 个时刻结束时,如果你的位置 \(p\) 满足 \(p \equiv b_{t\bmod n} \pmod {a_{t\bmod n}}\),那么你就输…

强化学习实验环境库 gym/Gymnasium

Gym库(https://gym.openai.com) 是OpenAI推出的强化学习实验环境库。它用Python语言实现了离散之间智能体-环境接口中的环境部分。每个环境就代表着一类强化学习问题,用户通过设计和训练自己的智能体来解决这些强化学…

网站买流量是怎么做的上海建设摩托车科技有限公司官网

什么是es(elasticsearch) Elasticsearch是一个开源的分布式搜索和分析引擎,它构建在Apache Lucene搜索引擎库之上。它提供了一个分布式多用户能力的实时搜索和分析引擎,能够处理大规模的数据。Elasticsearch被广泛用于构建全文搜索、日志分析、实时应用…

深圳网站建设首选上榜网络山河建设集团有限公司的网站

第33题 在 OSI 参考模型中, 下列功能需由应用层的相邻层实现的是()A. 对话管理B. 数据格式转换C. 路由选择D. 可靠数据传输 很显然,题目所问的应用层的相邻层是表示层。该层实现与数据表示相关的功能。选项a中的对话管理属于会话层。选项c中的路由选择属于网络层。…

为什么需要建立全面的质量管理体系

为什么需要建立全面的质量管理体系什么是全面的质量管理? 所谓全面质量管理, 简称TQM (Total Quality Management)就是一个组织以产品质量为中心,以全员参与为基础,目的在于通过让顾客满意和本组织所有成员及社会…

Encoding.RegisterProvider(CodePagesEncodingProvider.Instance)了解

Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);这行代码在 .NET Core / .NET 5+ 项目里的作用一句话就能说清楚:把 Windows 专用的“代码页”编码(GB2312、Shift-JIS、Windows-1252 等)注册到程序…

mybatis pagehelper 分页参数污染线程的问题

mybatis pagehelper 分页参数污染线程的问题参考: https://github.com/pagehelper/Mybatis-PageHelper/blob/master/wikis/zh/HowToUse.md 最佳实践 public interface CountryMapper { List selectByPageNumSize( @Pa…