
深度学习笔记
文章平均质量分 87
深度学习相关知识点
yyc_audio
985本科毕业,在职音频开发工程师。
开发经验涉及声学,驱动,android框架,android APP,linux音频中间件开发。
收悉主流音频框架。
500强音频领域工作经验7年+
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
深度学习处理文本(12)
接下来,我们准备两个单独的TextVectorization层:一个用于英语,一个用于西班牙语。我们需要自定义字符串的预处理方式。我们需要保留插入的词元"[start]“和”[end]"。默认情况下,字符[和]将被删除,但我们希望保留它们,以便区分单词“start”与开始词元"[start]"。不同语言的标点符号是不同的。在西班牙语的TextVectorization层中,如果要删除标点符号,也需要删除字符¿。原创 2025-04-04 08:44:58 · 697 阅读 · 0 评论 -
深度学习处理文本(11)
对于“this movie is the bomb”和“this movie was a bomb”这两个句子,它们的一元语法表示非常接近,词袋模型可能很难分辨,但序列模型可以分辨出哪句是负面的、哪句是正面的。我们有20 000个训练样本,平均词数为233,所以根据我们的经验法则,应该使用二元语法模型,这也证实了我们在实践中的结果。事实证明,在处理新的文本分类任务时,你应该密切关注训练数据中的样本数与每个样本的平均词数之间的比例,如图11-11所示。这是迄今为止最好的序列模型,但仍然比词袋方法差一点。原创 2025-04-04 08:44:40 · 1072 阅读 · 0 评论 -
深度学习处理文本(10)
在编写自定义层时,一定要实现get_config()方法:这样我们可以利用config字典将该层重新实例化,这对保存和加载模型很有用。该方法返回一个Python字典,其中包含用于创建该层的构造函数的参数值。所有Keras层都可以被序列化(serialize)和反序列化(deserialize),如下所示。new_layer = layer.__class__.from_config(config) ←---- config不包含权重值,因此该层的所有权重都是从头初始化的来看下面这个例子。原创 2025-04-03 12:54:03 · 1179 阅读 · 0 评论 -
深度学习处理文本(9)
比如在机器翻译中,查询是目标序列,键和值则都是源序列:对于目标序列中的每个元素(如“tiempo”),你都希望回到源序列(“How’s the weather today?当然,如果你只做序列分类,那么查询、键和值这三者是相同的:将一个序列与自身进行对比,用整个序列的上下文来丰富每个词元的表示。“多头”是指:自注意力层的输出空间被分解为一组独立的子空间,对这些子空间分别进行学习,也就是说,初始的查询、键和值分别通过3组独立的密集投影,生成3个独立的向量。搜索引擎会将你的查询和数据库中的键进行对比。原创 2025-04-03 12:40:48 · 1251 阅读 · 0 评论 -
深度学习处理文本(7)
这是因为我们在TextVectorization层中使用了output_sequence_length=max_length选项(max_length为600),也就是说,多于600个词元的句子将被截断为600个词元,而少于600个词元的句子则会在末尾用0填充,使其能够与其他序列连接在一起,形成连续的批量。在这种情况下,你可以从预计算嵌入空间中加载词嵌入向量(这个嵌入空间是高度结构化的,并且具有有用的性质,捕捉到了语言结构的通用特征),而不是在解决问题的同时学习词嵌入。原创 2025-04-02 09:14:58 · 837 阅读 · 0 评论 -
深度学习处理文本(8)
你说的“mark the date”(标记日期)与“go on a date”(去约会),二者中的“date”并不是同一个意思,与你在市场上买的date(椰枣)也不是同一个意思。当你说“I’ll see you soon”(一会儿见)、“I’ll see this project to its end”(我会一直跟着这个项目直到结束)或“I see what you mean”(我懂你的意思),这三个“see”的含义也有着微妙的差别。再来看句中的一个单词:“station”(站)。原创 2025-04-02 09:14:35 · 931 阅读 · 0 评论 -
深度学习处理文本(6)
例如,在一个合理的词向量空间中,同义词应该被嵌入到相似的词向量中,一般来说,任意两个词向量之间的几何距离(比如余弦距离或L2距离)应该与这两个单词之间的“语义距离”有关。但从更实际的角度来说,一个好的词嵌入空间在很大程度上取决于你的任务,英语影评情感分析模型的完美词嵌入空间,可能不同于英语法律文件分类模型的完美词嵌入空间,因为某些语义关系的重要性因任务而异。(维度大小等于词表中的单词个数),而词嵌入是低维的浮点向量(密集向量,与稀疏向量相对),如图11-2所示。词嵌入是密集的表示,也是。原创 2025-04-01 08:46:50 · 726 阅读 · 0 评论 -
深度学习处理文本(5)
第二,这个模型的测试精度只有87%,性能还不如一元语法二进制模型,后者的速度还很快。显然,使用one-hot编码将单词转换为向量,这是我们能做的最简单的事情,但这并不是一个好主意。奇怪的是,一维卷积神经网络在NLP中一直没有很流行,尽管根据我自己的经验,一维深度可分离卷积的残差堆叠通常可以实现与双向LSTM相当的性能,而且计算成本大大降低。但如果想导出一个独立于这个管道的模型,我们应该确保模型包含文本预处理(否则需要在生产环境中重新实现,这可能很困难,或者可能导致训练数据与生产数据之间的微妙差异)。原创 2025-04-01 08:46:24 · 676 阅读 · 0 评论 -
深度学习处理文本(4)
同时,某个词在数据集所有文档中的出现频次也很重要:如果一个词几乎出现在每个文档中(比如“the”或“a”),那么这个词就不是特别有信息量,而仅在一小部分文本中出现的词(比如“Herzog”)则是非常独特的,因此也非常重要。如果你做的是文本分类,那么知道一个单词在某个样本中的出现次数是很重要的:任何足够长的影评,不管是哪种情绪,都可能包含“可怕”这个词,但如果一篇影评包含许多个“可怕”,那么它很可能是负面的。我们在这个二进制编码的二元语法袋上训练模型,并测试模型性能,如代码清单11-8所示。原创 2025-03-31 09:18:24 · 805 阅读 · 0 评论 -
深度学习处理文本(3)
最后,你也可以采用混合方法:Transformer架构在技术上是不考虑顺序的,但它将单词位置信息注入数据表示中,从而能够同时查看一个句子的不同部分(这与RNN不同),并且仍然是顺序感知的。今天,这两种方法仍然都是有价值的。请注意,本例的数据集是一个平衡的二分类数据集(正面样本和负面样本数量相同),所以无须训练模型就能实现的“简单基准”的精度只有50%。这些数据集生成的输入是TensorFlow tf.string张量,生成的目标是int32格式的张量,取值为0或1,如代码清单11-2所示。原创 2025-03-31 09:18:02 · 708 阅读 · 0 评论 -
深度学习处理文本(2)
接下来,如果想将模型导出到生产环境中,你可能希望导出一个接收原始字符串作为入的模型(类似上面第二种用法的代码片段),否则,你需要在生产环境中(可能是JavaScript)重新实现文本标准化和词元化,可能会引入较小的预处理偏差,从而降低模型精度。对于编码为整数序列的文本,如果你需要将其转换回单词,那么这种方法很有用。你可以用无状态的方式来执行此操作,比如将每个词元哈希编码为一个固定的二进制向量,但在实践中,你需要建立训练数据中所有单词(“词表”)的索引,并为词表中的每个单词分配唯一整数,如下所示。原创 2025-03-30 18:58:23 · 677 阅读 · 0 评论 -
深度学习处理文本(1)
在计算机科学领域,我们将人类语言(如英语或普通话)称为“自然”语言,以区别于为机器设计的语言(如汇编语言、LISP或XML)。每一种机器语言都是设计出来的:人类工程师写下一组正式规则,描述用这种语言可以编写哪些语句以及这些语句的含义。**规则在先,只有这组规则是完备的,人们才会开始使用这种语言。**人类语言正好相反:**使用在先,规则出现在后。自然语言是进化形成的,就像生物体一样,这是我们称其为“自然语言”的原因。**自然语言的“规则”(比如英语语法)是在事后确立的,而且经常被使用者忽视或破坏。原创 2025-03-30 18:12:37 · 1087 阅读 · 0 评论 -
深度学习处理时间序列(7)
遇到一个新问题时,最好首先为你选择的指标建立基于常识的基准。如果没有需要超越的基准,那么就无法判断是否取得了真正的进展。在尝试计算代价较高的模型之前,先尝试一些简单的模型,以证明增加计算代价是有意义的。有时简单模型就是你的最佳选择。如果顺序对数据很重要,特别是对于时间序列数据,那么循环神经网络(RNN)是一种很适合的方法,与那些先将时间数据展平的模型相比,其性能要更好。Keras中的两个基本的RNN层是LSTM层和GRU层。原创 2025-03-29 10:57:23 · 1191 阅读 · 0 评论 -
深度学习处理时间序列(6)
我们回头来看基于LSTM的模型,它是第一个能够超越常识基准的模型。2016年,Yarin Gal在他关于贝叶斯深度学习的博士论文中,确定了在RNN中使用dropout的正确方式:在每个时间步都应该使用相同的dropout掩码(相同模式的舍弃单元),而不是在不同的时间步使用随机变化的dropout掩码。由于使用了dropout,我们不需要过分依赖网络尺寸来进行正则化,因此我们将使用具有两倍单元个数的LSTM层,希望它的表示能力更强(如果不使用dropout,这个网络会马上开始过拟合,你可以试试看)。原创 2025-03-29 10:05:09 · 1210 阅读 · 0 评论 -
深度学习处理时间序列(5)
但是,如果所有序列的长度相同,那么我建议指定完整的输入形状,因为这样model.summary()能够显示输出长度信息,这总是很好的,而且还可以解锁一些性能优化功能。RNN单元的类型(如前所述)决定了假设空间,即在训练过程中搜索良好模型配置的空间,但它不能决定RNN单元的作用,那是由单元权重来决定的。相同的单元具有不同的权重,可以起到完全不同的作用。值得庆幸的是,SimpleRNN层并不是Keras中唯一可用的循环层,还有另外两个:LSTM层和GRU层,二者都是为解决这个问题而设计的。原创 2025-03-29 09:43:18 · 1063 阅读 · 0 评论 -
深度学习处理时间序列(4)
智能生物处理信息是渐进式的,保存一个关于所处理内容的内部模型,这个模型是根据过去的信息构建的,并随着新信息的进入而不断更新。在处理两个彼此独立的序列(比如批量中的两个样本)之间,RNN的状态会被重置,所以你仍然可以将一个序列看作单个数据点,即神经网络的单个输入。这个RNN对时间步进行遍历,在每个时间步t,它都会考虑t的当前状态和t的输入(形状为(input_features,)),并对二者计算得到t的输出。出张量中的每个时间步t都包含入序列中时间步0到t的信息,即关于过去的全部信息。NN实现起来很简单。原创 2025-03-28 09:04:51 · 856 阅读 · 0 评论 -
深度学习处理时间序列(3)
同样,在开始研究复杂且计算代价很大的模型(如RNN)之前,尝试简单且计算代价很小的机器学习模型(比如小型的密集连接网络)也是很有用的。我们使用均方误差(MSE)作为损失,而不是平均绝对误差(MAE),因为MSE在0附近是光滑的(而MAE不是),这对梯度下降来说是一个有用的属性。这个假设的含义是,如果沿着序列滑动一个窗口,那么窗口的内容应该遵循相同的属性,而与窗口位置无关。在本例中,我们可以放心地假设:温度时间序列是连续的(明天的温度很可能接近今天的温度),并且具有每天的周期性变化。原创 2025-03-28 09:04:24 · 1382 阅读 · 0 评论 -
深度学习处理时间序列(2)
举个例子,对于data = [0, 1, 2, 3, 4, 5, 6]和sequence_length = 3,timeseries_dataset_from_array()将生成以下样本:[0, 1, 2], [1, 2, 3], [2, 3, 4],[3, 4, 5], [4, 5, 6]。对于验证数据集,我们传入start_index = num_train_samples和end_index = num_train_samples + num_val_samples,使用接下来25%的数据。原创 2025-03-16 12:59:47 · 1426 阅读 · 0 评论 -
深度学习处理时间序列(1)
与前面遇到的数据类型不同,处理时间序列需要了解系统的动力学(dynamics),包括系统的周期性循环、系统随时间如何变化、系统的周期规律与突然激增等。接下来,我们将所有420 451行数据转换为NumPy数组,如代码清单10-2所示:一个数组包含温度(单位为摄氏度),另一个数组包含其他数据。我们来绘制温度随时间的变化曲线(单位为摄氏度),如代码清单10-3和图10-1所示。从输出可以看出,共有420 451行数据(每行数据是一个时间步,记录了1个日期和14个与天气有关的值),输出还包含以下表头。原创 2025-03-16 11:54:31 · 1075 阅读 · 0 评论 -
深度学习(3)-TensorFlow入门(常数张量和变量)
低阶张量操作是所有现代机器学习的底层架构,可以转化为TensorFlow API。,包括存储神经网络状态的特殊张量(变量)。,比如加法、relu、matmul。,一种计算数学表达式梯度的方法(在TensorFlow中通过GradientTape对象来实现)。然后是高阶深度学习概念。这可以转化为Keras API。,多层可以构成模型。,它定义了用于学习的反馈信号。(必须是可微的),它决定学习过程如何进行。,比如精度。,执行小批量梯度随机下降。原创 2025-02-23 20:44:24 · 502 阅读 · 0 评论 -
机器学习简介
机器学习与数理统计相关,与统计学不同,机器学习经常要处理复杂的大型数据集(比如包含数百万张图片的数据集,每张图片又包含数万像素),用经典的统计分析(比如贝叶斯分析)来处理这种数据集是不切实际的。并且,由此得到的基于规则的系统很脆弱,维护困难。系统地搜索自动生成的数据表示与基于这些表示的规则之间的不同组合,利用正确分类的数字所占百分比作为反馈信号,在某个开发数据集上找到那些好的组合,这就是机器学习。简而言之,机器学习就是指在预先定义的可能性空间中,利用反馈信号的指引,在输入数据中寻找有用的表示和规则。原创 2025-01-23 17:04:59 · 568 阅读 · 0 评论 -
深度学习(2)-深度学习关键网络架构
深度学习有4种类型的网络架构:密集连接网络、卷积神经网络、循环神经网络和Transformer。每种类型的模型都是针对特定的输入模式,网络架构包含了关于数据结构的假设,即模型搜索的假设空间。某种架构能否解决某个问题,完全取决于问题的数据结构与所选的网络架构假设之间是否匹配。这些不同类型的网络可以很容易组合起来,实现更大的多模式模型,就像拼乐高积木一样。某种程度上来说,深度学习的层就是信息处理领域的乐高积木。下面列出了输入模式与网络架构之间的对应关系。向量数据:密集连接网络(Dense层)。原创 2025-02-21 22:32:59 · 1477 阅读 · 0 评论 -
核心Keras API(3)
TensorFlow是业界领先的数值计算框架,它可以在CPU、GPU或TPU上运行。它既可以自动计算任意可微表达式的梯度,也可以分布到许多设备上,还可以将程序导出到各种外部运行环境,甚至是JavaScript运行时。Keras是用TensorFlow进行深度学习的标准APIKeras的核心类是Layer。层封装了一些权重和一些计算,并构成了模型。在开始训练模型之前,需要选择优化器、损失函数和指标,你可以通过model.compile()方法指定这3个参数。原创 2025-03-04 08:48:46 · 718 阅读 · 0 评论 -
深度学习(3)-TensorFlow入门(梯度带)
如果要监视常数张量,那么必须对其调用tape.watch(),手动将其标记为被监视的张量,如代码清单3-11所示。梯度带是一个非常强大的工具,它甚至能够计算二阶梯度(梯度的梯度)。举例来说,物体位置相对于时间的梯度是这个物体的速度,二阶梯度则是它的加速度。你只需要创建一个GradientTape作用域,对一个或多个输入张量做一些计算,然后就可以检索计算结果相对于输入的梯度,如代码清单3-10所示。它默认监视可训练变量,因为计算损失相对于可训练变量列表的梯度,是梯度带最常见的用途。原创 2025-02-23 21:09:51 · 516 阅读 · 0 评论 -
通过TensorFlow实现简单深度学习模型(2)
拥有这种对代码底层原理的思维模型,可以更好地使用Keras API的高级功能。学习的过程:随机选取包含数据样本及其目标值的批量,计算批量损失相对于模型参数的梯度。优化器是利用损失梯度对参数进行更新的具体方式,比如RMSprop优化器、带动量的随机梯度下降(SGD)等。学习是指找到一组模型参数值,使模型在一组给定的训练数据样本及其对应目标值上的损失函数最小化。一轮训练就是对训练数据的每个批量都重复上述训练步骤,而完整的训练循环就是重复多轮训练。前文我们已经实现了对每批数据的训练,下面继续实现一轮完整的训练。原创 2025-02-28 07:55:51 · 457 阅读 · 0 评论 -
通过TensorFlow实现简单深度学习模型(1)
更新权重”这一步(由update_weights函数实现)的目的,就是将权重沿着减小批量损失值的方向移动“一小步”。我们来实现一个简单的Python类NaiveDense,它创建了两个TensorFlow变量W和b,并定义了一个__call__()方法供外部调用,以实现上述变换。Dense层实现了下列输入变换,其中W和b是模型参数,activation是一个逐元素的函数(通常是relu,但最后一层是softmax)。最难的一步就是“训练步骤”,即在一批数据上运行模型后更新模型权重。我们需要做到以下几点。原创 2025-02-27 08:19:15 · 606 阅读 · 0 评论 -
深度学习(5)-卷积神经网络
在最后一个 conv2D层之后,我们得到了形状为(3,3,128)的输出,即通道数为 128的3x3特征图。由于我们要做的是带有 softmax 输出的十类别分类,因此要使用分类交叉熵损失,而且由于标签是整数,因此要使用稀疏分类交叉熵损失sparse categorical crossentropy,如代码 8-3 所示。本例中,我们设置卷积神经网络处理大小为(28,28,1)的输入,这正是 MNIST 图像的格式。它是 conv2D层和 MaxPooling2D 层的堆叠,你很快就会知道这些层的作用。原创 2025-02-23 21:13:41 · 433 阅读 · 0 评论 -
用TensorFlow编写线性分类器(重点)
我们来绘制这条直线,如图3-8所示。直观上来看,协方差矩阵描述了点云的形状,均值则描述了点云在平面上的位置,如图3-6所示。如代码清单3-15所示,我们来生成对应的目标标签,即一个形状为(2000, 1)的数组,其元素都是0或1:如果输入inputs[i]属于类别0,则目标targets[i, 0]为0;由于目标值是0和1,因此如果一个给定输入点的预测值小于0.5,那么它将被归为类别0,而如果预测值大于0.5,则被归为类别1,如图3-7所示。ssh远程服务器执行python也可以在桌面显示,出乎意料!原创 2025-03-01 08:15:48 · 829 阅读 · 0 评论 -
Keras和TensorFlow
这些组件包括用于强化学习研究的TF- Agents,用于工业级机器学习工作流程管理的TFX,用于生产部署的TensorFlow Serving,以及包含许多预训练模型的TensorFlow Hub代码库。要训练模型,我们需要更新其状态,而模型状态是一组张量。NumPy数组和TensorFlow张量之间的一个重要区别是,TensorFlow张量是不可赋值的,它是常量。通过TensorFlow,Keras可以在不同类型的硬件上运行(见图3-1),包括GPU、TPU和普通CPU,还可以无缝扩展到上千台机器上。原创 2025-03-01 08:15:07 · 511 阅读 · 0 评论 -
神经网络入门:分类与回归(1)
*样本(sample)或输入(input)**:进入模型的数据点。**预测(prediction)或输出(output)**:模型的输出结果。**目标(target)**:真实值。对于外部数据源,理想情况下模型应该能够预测出目标。**预测误差(prediction error)或损失值(loss value)**:模型预测与目标之间的差距。**类别(class)**:分类问题中可供选择的一组标签。举例来说,对猫狗图片进行分类时,“猫”和“狗”就是两个类别。原创 2025-03-03 08:53:25 · 1006 阅读 · 0 评论 -
核心Keras API(2)
compile()方法的作用是配置训练过程,它接收的参数是optimizer、loss和metrics(一个列表)。如果你正在处理一个二分类问题,使用的模型由一个没有激活的Dense层组成(纯仿射变换),那么你就是在假设这两个类别是线性可分的。到目前为止,你只见过Sequential模型(Model的一个子类),它是层的简单堆叠,将单一输入映射为单一输出。因此,指标不需要是可微的。在Keras中构建模型通常有两种方法:直接作为Model类的子类,或者使用函数式API,后者可以用更少的代码做更多的事情。原创 2025-03-03 08:52:59 · 510 阅读 · 0 评论 -
核心Keras API(1)
如果我们把NaiveDense层重新实现为能够自动推断形状的Keras层,那么它看起来就像前面的SimpleDense层(见代码清单3-22),具有build()方法和call()方法。层的核心就是权重和激活函数。例如,简单的向量数据存储在形状为(samples, features)的2阶张量中,通常用密集连接层[densely connected layer,也叫全连接层(fully connected layer)或密集层(dense layer),对应于Keras的Dense类]来处理。原创 2025-03-02 09:36:05 · 981 阅读 · 0 评论 -
神经网络入门:分类与回归(2)
你面对的是一个二分类问题,模型输出是一个概率值(模型最后一层只有一个单元并使用sigmoid激活函数),所以最好使用binary_crossentropy(二元交叉熵)损失函数。中间层使用relu作为激活函数,最后一层使用sigmoid激活函数,以便输出一个介于0和1之间的概率值(表示样本目标值等于“1”的可能性,即评论为正面的可能性)。注意,我们还在训练过程中监控精度。,但模型的计算代价也变得更大,并可能导致学到不必要的模式(这种模式可以提高在训练数据上的性能,但不会提高在测试数据上的性能)。原创 2025-03-04 08:49:07 · 684 阅读 · 0 评论 -
用TensorFlow编写线性分类器(补充说明)
因此,你也可以使用 np.concatenate((a[:, np.newaxis], b[:, np.newaxis]), axis=0) 来达到相同的效果,但这样做通常更繁琐且不易读。在这个例子中,我们首先创建了一个二维张量 x,然后分别计算了所有元素的平均值、每行的平均值以及每列的平均值(同时保留了列维度)。它将一系列具有相同列数的数组作为输入,并返回一个新的数组,该数组的行数是输入数组行数之和,而列数保持不变。tup:一个序列,包含要堆叠的数组。返回一个新的数组,该数组是由输入数组垂直堆叠而成的。原创 2025-03-02 09:35:28 · 498 阅读 · 0 评论 -
机器学习基础(2)
但是,这些输入中只有少数看起来像是有效的MNIST样本,也就是说,在所有可能的28×28 uint8数组组成的父空间中,真实的手写数字只占据一个很小的子空间。至关重要的是,虽然深度学习实现泛化的方法是对数据流形的学习近似进行插值,但如果认为插值就是泛化的全部,那你就错了。人类能够进行极端泛化(extreme generalization),这是由不同于插值的认知机制实现的,包括抽象、世界的符号模型、推理、逻辑、常识,以及关于世界的固有先验知识——我们通常称其为理性(reason),与直觉和模式识别相对。原创 2025-03-11 08:06:49 · 929 阅读 · 0 评论 -
计算机视觉深度学习入门(2)
卷积的工作原理是这样的:在3维输入特征图上滑动(slide)这些3×3或5×5的窗口,在每个可能的位置停下来并提取周围特征的3维图块[形状为(window_height,window_width, input_depth)]。输出特征图中的每个空间位置都对应输入特征图中的相同位置(比如输出的右下角包含输入右下角的信息)。对于这32个输出通道,每个通道都包含一个26×26的数值网格,它是滤波器对输入的响应图(response map),表示这个滤波器模式在输入中不同位置的响应,如图8-3所示。原创 2025-03-07 22:47:03 · 1154 阅读 · 0 评论 -
神经网络入门:分类与回归(5)
二分类问题、多分类问题和标量回归问题。回归问题使用的损失函数和评估指标都与分类问题不同。将原始数据输入神经网络之前,通常需要对其进行预处理。如果数据特征具有不同的取值范围,应该先进行预处理,对每个特征单独进行缩放。随着训练的进行,神经网络最终会过拟合,并在前所未见的数据上得到较差的结果。如果训练数据不是很多,那么可以使用只有一两个中间层的小模型,以避免严重的过拟合。如果数据被划分为多个类别,那么中间层过小可能会造成信息瓶颈。如果要处理的数据很少,那么K折交叉验证有助于可靠地评估模型。原创 2025-03-07 21:14:39 · 934 阅读 · 0 评论 -
计算机视觉深度学习入门(5)
具体地说,Keras包含实用函数image_dataset_from_directory(),它可以快速建立数据管道,自动将磁盘上的图像文件转换为预处理好的张量批量。因为这是一个二分类问题,所以模型的最后一层是使用sigmoid激活函数的单个单元(大小为1的Dense层)。模型最后一层是单一的sigmoid单元,所以我们将使用二元交叉熵作为损失函数,如代码清单8-8所示。本例初始输入的尺寸为180像素×180像素(这是一个随意的选择),最后在Flatten层之前的特征图尺寸为7×7。原创 2025-03-12 08:02:53 · 424 阅读 · 0 评论 -
机器学习基础(6)
机器学习模型的目的在于泛化,即在前所未见的输入上表现良好。这看起来不难,但实现起来很难。深度神经网络实现泛化的方式是:学习一个参数化模型,这个模型可以成功地在训练样本之间进行插值——这样的模型学会了训练数据的“潜在流形”。这就是为什么深度学习模型只能理解与训练数据非常接近的输入。机器学习的根本问题是优化与泛化之间的矛盾:为了实现泛化,你必须首先实现对训练数据的良好拟合,然后改进模型对训练数据的拟合,在一段时间之后将不可避免地降低泛化能力。深度学习的所有最佳实践都旨在解决这一矛盾。原创 2025-03-06 08:46:08 · 1359 阅读 · 0 评论 -
神经网络入门:分类与回归(4)
如果某一层丢失了与分类问题相关的信息,那么后面的层永远无法恢复这些信息,也就是说,每一层都可能成为信息瓶颈。在这个例子中,标签的one-hot编码就是将每个标签表示为全零向量,只有标签索引对应的元素为1,如代码清单4-14所示。模型将输出一个在46个输出类别上的概率分布——对于每个输入样本,模型都会生成一个46维输出向量,其中output[i]是样本属于第i个类别的概率。对于单标签、多分类问题,模型的最后一层应该使用softmax激活函数,这样可以输出一个在N个输出类别上的概率分布。原创 2025-03-05 08:59:06 · 950 阅读 · 0 评论