动手学深度学习(一)深度学习介绍2

news2024/11/19 9:29:18

目录

二、起源

三、深度学习的成功案例:

四、特点:

五、小结:


二、起源

为了解决各种各样的机器学习问题,深度学习提供了强大的工具。 虽然许多深度学习方法都是最近才有重大突破,但使用数据和神经网络编程的核心思想已经研究了几个世纪。 事实上,人类长期以来就有分析数据和预测未来结果的愿望,而自然科学大部分都植根于此。 例如,伯努利分布是以雅各布•伯努利(1654-1705)命名的。 而高斯分布是由卡尔•弗里德里希•高斯(1777-1855)发现的, 他发明了最小均方算法,至今仍用于解决从保险计算到医疗诊断的许多问题。 这些工具算法催生了自然科学中的一种实验方法——例如,电阻中电流和电压的欧姆定律可以用线性模型完美地描述。

即使在中世纪,数学家对估计(estimation)也有敏锐的直觉。 例如,雅各布·克贝尔 (1460–1533)的几何学书籍举例说明,通过平均16名成年男性的脚的长度,可以得出一英尺的长度。

图1.4.1 说明了这个估计器是如何工作的。 16名成年男子被要求脚连脚排成一行。 然后将它们的总长度除以16,得到现在等于1英尺的估计值。 这个算法后来被改进以处理畸形的脚——将拥有最短和最长脚的两个人送走,对其余的人取平均值。 这是最早的修剪均值估计的例子之一。

随着数据的收集和可获得性,统计数据真正实现了腾飞。 罗纳德·费舍尔(1890-1962)对统计理论和在遗传学中的应用做出了重大贡献。 他的许多算法(如线性判别分析)和公式(如费舍尔信息矩阵)至今仍被频繁使用。 甚至,费舍尔在1936年发布的鸢尾花卉数据集,有时仍然被用来解读机器学习算法。 他也是优生学的倡导者,这提醒我们:数据科学在道德上存疑的使用,与其在工业和自然科学中的生产性使用一样,有着悠远而持久的历史。

机器学习的第二个影响来自克劳德·香农(1916–2001)的信息论和艾伦·图灵(1912-1954)的计算理论。 图灵在他著名的论文《计算机器与智能》 (Turing, 1950) 中提出了“机器能思考吗?”的问题。 在他所描述的图灵测试中,如果人类评估者很难根据文本互动区分机器和人类的回答,那么机器就可以被认为是“智能的”。

另一个影响可以在神经科学和心理学中找到。 其中,最古老的算法之一是唐纳德·赫布 (1904–1985)开创性的著作《行为的组织》 (Hebb and Hebb, 1949) 。 他提出神经元通过积极强化学习,是Rosenblatt感知器学习算法的原型,被称为“赫布学习”。 这个算法也为当今深度学习的许多随机梯度下降算法奠定了基础:强化期望行为和减少不良行为,从而在神经网络中获得良好的参数设置。

神经网络(neural networks)的得名源于生物灵感。 一个多世纪以来(追溯到1873年亚历山大·贝恩和1890年詹姆斯·谢林顿的模型),研究人员一直试图组装类似于相互作用的神经元网络的计算电路。 随着时间的推移,对生物学的解释变得不再肤浅,但这个名字仍然存在。 其核心是当今大多数网络中都可以找到的几个关键原则:

  • 线性和非线性处理单元的交替,通常称为(layers);

  • 使用链式规则(也称为反向传播(backpropagation))一次性调整网络中的全部参数。

经过最初的快速发展,神经网络的研究从1995年左右开始停滞不前,直到2005年才稍有起色。 这主要是因为两个原因。 首先,训练网络(在计算上)非常昂贵。 在上个世纪末,随机存取存储器(RAM)非常强大,而计算能力却很弱。 其次,数据集相对较小。 事实上,费舍尔1932年的鸢尾花卉数据集是测试算法有效性的流行工具, 而MNIST数据集的60000个手写数字的数据集被认为是巨大的。 考虑到数据和计算的稀缺性,核方法(kernel method)、决策树(decision tree)和图模型(graph models)等强大的统计工具(在经验上)证明是更为优越的。 与神经网络不同的是,这些算法不需要数周的训练,而且有很强的理论依据,可以提供可预测的结果。

二、深度学的发展:

大约2010年开始,那些在计算上看起来不可行的神经网络算法变得热门起来,实际上是以下两点导致的: 其一,随着互联网的公司的出现,为数亿在线用户提供服务,大规模数据集变得触手可及; 另外,廉价又高质量的传感器、廉价的数据存储(克莱德定律)以及廉价计算(摩尔定律)的普及,特别是GPU的普及,使大规模算力唾手可得。

很明显,随机存取存储器没有跟上数据增长的步伐。 与此同时,算力的增长速度已经超过了现有数据的增长速度。 这意味着统计模型需要提高内存效率(这通常是通过添加非线性来实现的),同时由于计算预算的增加,能够花费更多时间来优化这些参数。 因此,机器学习和统计的关注点从(广义的)线性模型和核方法转移到了深度神经网络。 这也造就了许多深度学习的中流砥柱,如多层感知机 (McCulloch and Pitts, 1943) 、卷积神经网络 (LeCun et al., 1998) 、长短期记忆网络 (Graves and Schmidhuber, 2005) 和Q学习 (Watkins and Dayan, 1992) ,在相对休眠了相当长一段时间之后,在过去十年中被“重新发现”。

最近十年,在统计模型、应用和算法方面的进展就像寒武纪大爆发——历史上物种飞速进化的时期。 事实上,最先进的技术不仅仅是将可用资源应用于几十年前的算法的结果。 下面列举了帮助研究人员在过去十年中取得巨大进步的想法(虽然只触及了皮毛)。

新的容量控制方法,如dropout (Srivastava et al., 2014),有助于减轻过拟合的危险。这是通过在整个神经网络中应用噪声注入 (Bishop, 1995) 来实现的,出于训练目的,用随机变量来代替权重。

注意力机制解决了困扰统计学一个多世纪的问题:如何在不增加可学习参数的情况下增加系统的记忆和复杂性。研究人员通过使用只能被视为可学习的指针结构 (Bahdanau et al., 2014) 找到了一个优雅的解决方案。不需要记住整个文本序列(例如用于固定维度表示中的机器翻译),所有需要存储的都是指向翻译过程的中间状态的指针。这大大提高了长序列的准确性,因为模型在开始生成新序列之前不再需要记住整个序列。

多阶段设计。例如,存储器网络 (Sukhbaatar et al., 2015) 和神经编程器-解释器 (Reed and De Freitas, 2015)。它们允许统计建模者描述用于推理的迭代方法。这些工具允许重复修改深度神经网络的内部状态,从而执行推理链中的后续步骤,类似于处理器如何修改用于计算的存储器。

另一个关键的发展是生成对抗网络 (Goodfellow et al., 2014) 的发明。传统模型中,密度估计和生成模型的统计方法侧重于找到合适的概率分布(通常是近似的)和抽样算法。因此,这些算法在很大程度上受到统计模型固有灵活性的限制。生成式对抗性网络的关键创新是用具有可微参数的任意算法代替采样器。然后对这些数据进行调整,使得鉴别器(实际上是一个双样本测试)不能区分假数据和真实数据。通过使用任意算法生成数据的能力,它为各种技术打开了密度估计的大门。驰骋的斑马 (Zhu et al., 2017) 和假名人脸 (Karras et al., 2017) 的例子都证明了这一进展。即使是业余的涂鸦者也可以根据描述场景布局的草图生成照片级真实图像( (Park et al., 2019) )。

在许多情况下,单个GPU不足以处理可用于训练的大量数据。在过去的十年中,构建并行和分布式训练算法的能力有了显著提高。设计可伸缩算法的关键挑战之一是深度学习优化的主力——随机梯度下降,它依赖于相对较小的小批量数据来处理。同时,小批量限制了GPU的效率。因此,在1024个GPU上进行训练,例如每批32个图像的小批量大小相当于总计约32000个图像的小批量。最近的工作,首先是由 (Li, 2017) 完成的,随后是 (You et al., 2017) 和 (Jia et al., 2018) ,将观察大小提高到64000个,将ResNet-50模型在ImageNet数据集上的训练时间减少到不到7分钟。作为比较——最初的训练时间是按天为单位的。

并行计算的能力也对强化学习的进步做出了相当关键的贡献。这导致了计算机在围棋、雅达里游戏、星际争霸和物理模拟(例如,使用MuJoCo)中实现超人性能的重大进步。有关如何在AlphaGo中实现这一点的说明,请参见如 (Silver et al., 2016) 。简而言之,如果有大量的(状态、动作、奖励)三元组可用,即只要有可能尝试很多东西来了解它们之间的关系,强化学习就会发挥最好的作用。仿真提供了这样一条途径。

深度学习框架在传播思想方面发挥了至关重要的作用。允许轻松建模的第一代框架包括Caffe、Torch和Theano。许多开创性的论文都是用这些工具写的。到目前为止,它们已经被TensorFlow(通常通过其高级API Keras使用)、CNTK、Caffe 2和Apache MXNet所取代。第三代工具,即用于深度学习的命令式工具,可以说是由Chainer率先推出的,它使用类似于Python NumPy的语法来描述模型。这个想法被PyTorch、MXNet的Gluon API和Jax都采纳了。

“系统研究人员构建更好的工具”和“统计建模人员构建更好的神经网络”之间的分工大大简化了工作。 例如,在2014年,对卡内基梅隆大学机器学习博士生来说,训练线性回归模型曾经是一个不容易的作业问题。 而现在,这项任务只需不到10行代码就能完成,这让每个程序员轻易掌握了它。

三、深度学习的成功案例:

人工智能在交付结果方面有着悠久的历史,它能带来用其他方法很难实现的结果。例如,使用光学字符识别的邮件分拣系统从20世纪90年代开始部署,毕竟,这是著名的手写数字MNIST数据集的来源。这同样适用于阅读银行存款支票和对申请者的信用进行评分。系统会自动检查金融交易是否存在欺诈。这成为许多电子商务支付系统的支柱,如PayPal、Stripe、支付宝、微信、苹果、Visa和万事达卡。国际象棋的计算机程序已经竞争了几十年。机器学习在互联网上提供搜索、推荐、个性化和排名。换句话说,机器学习是无处不在的,尽管它经常隐藏在视线之外。

直到最近,人工智能才成为人们关注的焦点,主要是因为解决了以前被认为难以解决的问题,这些问题与消费者直接相关。许多这样的进步都归功于深度学习。

1.智能助理,如苹果的Siri、亚马逊的Alexa和谷歌助手,都能够相当准确地回答口头问题。这包括一些琐碎的工作,比如打开电灯开关(对残疾人来说是个福音)甚至预约理发师和提供电话支持对话。这可能是人工智能正在影响我们生活的最明显的迹象。

2.数字助理的一个关键要素是准确识别语音的能力。逐渐地,在某些应用中,此类系统的准确性已经提高到与人类同等水平的程度 (Xiong et al., 2018)。

3.物体识别同样也取得了长足的进步。估计图片中的物体在2010年是一项相当具有挑战性的任务。在ImageNet基准上,来自NEC实验室和伊利诺伊大学香槟分校的研究人员获得了28%的Top-5错误率 (Lin et al., 2010) 。到2017年,这一错误率降低到2.25% (Hu et al., 2018) 。同样,在鉴别鸟类或诊断皮肤癌方面也取得了惊人的成果。

4.游戏曾经是人类智慧的堡垒。从TD-Gammon开始,一个使用时差强化学习的五子棋游戏程序,算法和计算的进步导致了算法被广泛应用。与五子棋不同的是,国际象棋有一个复杂得多的状态空间和一组动作。深蓝公司利用大规模并行性、专用硬件和高效搜索游戏树 (Campbell et al., 2002) 击败了加里·卡斯帕罗夫(Garry Kasparov)。围棋由于其巨大的状态空间,难度更大。AlphaGo在2015年达到了相当于人类的棋力,使用和蒙特卡洛树抽样 (Silver et al., 2016) 相结合的深度学习。扑克中的挑战是状态空间很大,而且没有完全观察到(我们不知道对手的牌)。在扑克游戏中,库图斯使用有效的结构化策略超过了人类的表现 (Brown and Sandholm, 2017) 。这说明了游戏取得了令人瞩目的进步以及先进的算法在其中发挥了关键作用的事实。

5.人工智能进步的另一个迹象是自动驾驶汽车和卡车的出现。虽然完全自主还没有完全触手可及,但在这个方向上已经取得了很好的进展,特斯拉(Tesla)、英伟达(NVIDIA)和Waymo等公司的产品至少实现了部分自主。让完全自主如此具有挑战性的是,正确的驾驶需要感知、推理和将规则纳入系统的能力。目前,深度学习主要应用于这些问题的计算机视觉方面。其余部分则由工程师进行大量调整。

同样,上面的列表仅仅触及了机器学习对实际应用的影响之处的皮毛。 例如,机器人学、物流、计算生物学、粒子物理学和天文学最近取得的一些突破性进展至少部分归功于机器学习。 因此,机器学习正在成为工程师和科学家必备的工具。

关于人工智能的非技术性文章中,经常提到人工智能奇点的问题:机器学习系统会变得有知觉,并独立于主人来决定那些直接影响人类生计的事情。 在某种程度上,人工智能已经直接影响到人类的生计:信誉度的自动评估,车辆的自动驾驶,保释决定的自动准予等等。 甚至,我们可以让Alexa打开咖啡机。

幸运的是,我们离一个能够控制人类创造者的有知觉的人工智能系统还很远。 首先,人工智能系统是以一种特定的、面向目标的方式设计、训练和部署的。 虽然他们的行为可能会给人一种通用智能的错觉,但设计的基础是规则、启发式和统计模型的结合。 其次,目前还不存在能够自我改进、自我推理、能够在试图解决一般任务的同时,修改、扩展和改进自己的架构的“人工通用智能”工具。

一个更紧迫的问题是人工智能在日常生活中的应用。 卡车司机和店员完成的许多琐碎的工作很可能也将是自动化的。 农业机器人可能会降低有机农业的成本,它们也将使收割作业自动化。 工业革命的这一阶段可能对社会的大部分地区产生深远的影响,因为卡车司机和店员是许多国家最常见的工作之一。 此外,如果不加注意地应用统计模型,可能会导致种族、性别或年龄偏见,如果自动驱动相应的决策,则会引起对程序公平性的合理关注。 重要的是要确保小心使用这些算法。 就我们今天所知,这比恶意超级智能毁灭人类的风险更令人担忧。

同样,上面的列表仅仅触及了机器学习对实际应用的影响之处的皮毛。 例如,机器人学、物流、计算生物学、粒子物理学和天文学最近取得的一些突破性进展至少部分归功于机器学习。 因此,机器学习正在成为工程师和科学家必备的工具。

关于人工智能的非技术性文章中,经常提到人工智能奇点的问题:机器学习系统会变得有知觉,并独立于主人来决定那些直接影响人类生计的事情。 在某种程度上,人工智能已经直接影响到人类的生计:信誉度的自动评估,车辆的自动驾驶,保释决定的自动准予等等。 甚至,我们可以让Alexa打开咖啡机。

幸运的是,我们离一个能够控制人类创造者的有知觉的人工智能系统还很远。 首先,人工智能系统是以一种特定的、面向目标的方式设计、训练和部署的。 虽然他们的行为可能会给人一种通用智能的错觉,但设计的基础是规则、启发式和统计模型的结合。 其次,目前还不存在能够自我改进、自我推理、能够在试图解决一般任务的同时,修改、扩展和改进自己的架构的“人工通用智能”工具。

一个更紧迫的问题是人工智能在日常生活中的应用。 卡车司机和店员完成的许多琐碎的工作很可能也将是自动化的。 农业机器人可能会降低有机农业的成本,它们也将使收割作业自动化。 工业革命的这一阶段可能对社会的大部分地区产生深远的影响,因为卡车司机和店员是许多国家最常见的工作之一。 此外,如果不加注意地应用统计模型,可能会导致种族、性别或年龄偏见,如果自动驱动相应的决策,则会引起对程序公平性的合理关注。 重要的是要确保小心使用这些算法。 就我们今天所知,这比恶意超级智能毁灭人类的风险更令人担忧。

四、特点:

到目前为止,已经广泛地讨论了机器学习,它既是人工智能的一个分支,也是人工智能的一种方法。 虽然深度学习是机器学习的一个子集,但令人眼花缭乱的算法和应用程序集让人很难评估深度学习的具体成分是什么。 这就像试图确定披萨所需的配料一样困难,因为几乎每种成分都是可以替代的。

如前所述,机器学习可以使用数据来学习输入和输出之间的转换,例如在语音识别中将音频转换为文本。 在这样做时,通常需要以适合算法的方式表示数据,以便将这种表示转换为输出。 深度学习是“深度”的,模型学习了许多“层”的转换,每一层提供一个层次的表示。 例如,靠近输入的层可以表示数据的低级细节,而接近分类输出的层可以表示用于区分的更抽象的概念。 由于表示学习(representation learning)目的是寻找表示本身,因此深度学习可以称为“多级表示学习”。

到目前为止讨论的问题,例如从原始音频信号中学习,图像的原始像素值,或者任意长度的句子与外语中的对应句子之间的映射,都是深度学习优于传统机器学习方法的问题。 事实证明,这些多层模型能够以以前的工具所不能的方式处理低级的感知数据。 毋庸置疑,深度学习方法中最显著的共同点是使用端到端训练。 也就是说,与其基于单独调整的组件组装系统,不如构建系统,然后联合调整它们的性能。 例如,在计算机视觉中,科学家们习惯于将特征工程的过程与建立机器学习模型的过程分开。 Canny边缘检测器 (Canny, 1987) 和SIFT特征提取器 (Lowe, 2004) 作为将图像映射到特征向量的算法,在过去的十年里占据了至高无上的地位。 在过去的日子里,将机器学习应用于这些问题的关键部分是提出人工设计的特征工程方法,将数据转换为某种适合于浅层模型的形式。 然而,与一个算法自动执行的数百万个选择相比,人类通过特征工程所能完成的事情很少。 当深度学习开始时,这些特征抽取器被自动调整的滤波器所取代,产生了更高的精确度。

因此,深度学习的一个关键优势是它不仅取代了传统学习管道末端的浅层模型,而且还取代了劳动密集型的特征工程过程。 此外,通过取代大部分特定领域的预处理,深度学习消除了以前分隔计算机视觉、语音识别、自然语言处理、医学信息学和其他应用领域的许多界限,为解决各种问题提供了一套统一的工具。

五、小结:

  • 机器学习研究计算机系统如何利用经验(通常是数据)来提高特定任务的性能。它结合了统计学、数据挖掘和优化的思想。通常,它是被用作实现人工智能解决方案的一种手段。

  • 表示学习作为机器学习的一类,其研究的重点是如何自动找到合适的数据表示方式。深度学习是通过学习多层次的转换来进行的多层次的表示学习。

  • 深度学习不仅取代了传统机器学习的浅层模型,而且取代了劳动密集型的特征工程。

  • 最近在深度学习方面取得的许多进展,大都是由廉价传感器和互联网规模应用所产生的大量数据,以及(通过GPU)算力的突破来触发的。

  • 整个系统优化是获得高性能的关键环节。有效的深度学习框架的开源使得这一点的设计和实现变得非常容易。

1.你当前正在编写的代码的哪些部分可以“学习”,即通过学习和自动确定代码中所做的设计选择来改进?你的代码是否包含启发式设计选择?

可学习部分:

  1. 代码效率:通过分析代码运行时的时间和资源消耗,可以学习如何优化算法以提高效率。这可能包括减少循环次数、避免不必要的计算、使用更有效的数据结构等。
  2. 代码可读性和可维护性:通过阅读他人的代码和接受反馈,可以学习如何编写更清晰、更易于理解的代码。这可能涉及使用有意义的变量名、添加注释、遵循一致的代码格式等。
  3. 错误处理和异常管理:通过识别和修复错误,可以学习如何在代码中更好地处理异常情况。这可能包括使用适当的错误检查、提供有用的错误消息、使用断言来验证假设等。

启发式设计选择:

  1. 模块化设计:为了提高代码的可维护性和可重用性,我采用了模块化的设计方式,将功能划分为独立的模块。每个模块都有明确定义的输入和输出,使得代码更易于理解和修改。
  2. 面向对象编程:为了模拟现实世界中的概念,我使用了面向对象编程的方法。通过定义类和对象,可以更好地组织代码,并利用继承和封装等面向对象的特性来提高代码的灵活性和可维护性。
  3. DRY原则:为了避免重复的代码,我遵循了DRY原则,即“Don't Repeat Yourself”。通过提取公共的函数或方法,以及利用继承和模块化设计,我尽量减少了代码的重复。

这些只是我当前编写的代码中可以进行“学习”的部分和包含的一些启发式设计选择。实际上,每次编写和优化代码都是一个学习和改进的过程,而良好的启发式设计选择也有助于编写出更高效、更易于维护的代码。

2.你遇到的哪些问题有许多解决它们的样本,但没有具体的自动化方法?这些可能是使用深度学习的主要候选者。

(1)自然语言处理:尽管自然语言处理技术取得了很大的进步,但机器仍然难以完全理解人类的语言。许多问题需要结合上下文、语境和人类常识才能解决,这仍然是人工智能领域的一大挑战。

(2)图像识别和物体检测:虽然深度学习在图像识别和物体检测方面取得了很大的进展,但在复杂场景、遮挡、光照变化和尺度变化等情况下,仍然存在困难。

(3)情感分析:情感分析试图理解文本、语音或社交媒体帖子中的情感色彩,但它仍然是一个挑战。机器很难理解并模仿人类的情感和情绪,特别是在复杂和多变的社交环境中。

(4)人类行为预测:预测人类行为是一个非常复杂的问题,因为人类行为受到许多因素的影响,包括心理、社会、文化等。尽管有一些模型和方法可以预测人类行为,但它们通常缺乏准确性和普适性。

(5)数据推理和因果关系推断:机器学习模型通常只能从数据中学习相关性,而无法推断因果关系。在许多情况下,了解因果关系对于制定有效的策略和决策至关重要。

3.如果把人工智能的发展看作一场新的工业革命,那么算法和数据之间的关系是什么?它类似于蒸汽机和煤吗?根本区别是什么?

算法和数据之间的关系可以被理解为新工业革命中的两个重要组成部分。

算法和数据之间的关系类似于蒸汽机和煤的关系。算法是指用来处理和分析数据的数学和计算模型,它们是人工智能系统的核心,通过算法,计算机可以学习和理解数据,从而做出决策和预测。数据的质量和多样性对于算法的性能和准确性至关重要,而算法的选择和设计也会影响数据的解释和应用。
根本区别在于蒸汽机消耗煤来提供动力,而算法使用数据作为“燃料”来驱动决策和预测。同时,算法的设计和优化对于人工智能的性能和功能至关重要,而蒸汽机更偏向执行。此外,人工智能技术更侧重于决策,而蒸汽机更偏向于执行。
另外,数据结构与算法也有密切的联系。数据结构是算法实现的基础,算法总是要依赖于某种数据结构来实现的。往往是在发展一种算法的时候,构建了适合于这种算法的数据结构。算法的操作对象是数据结构,不同的数据结构的设计将导致差异很大的算法。数据结构是算法设计的基础,算法的设计同时伴有数据结构的设计,两者都是为最终解决问题服务的。

4.你还可以在哪里应用端到端的训练方法,比如 图1.1.2 、物理、工程和计量经济学?

  1. 物理模拟:在物理模拟中,我们可以使用端到端的训练方法来预测某种物理现象,例如预测物体在给定力作用下的运动轨迹。通过这种方式,我们可以直接从输入(如初始速度、角度和重力加速度)映射到输出(如最终位置和速度),而不需要详细地模拟物体的每一个物理过程。
  2. 控制系统:在控制系统中,端到端的训练方法可以用于优化控制策略,以实现特定的目标,例如使系统达到稳定状态或最小化某个性能指标。
  3. 机器人学:在机器人学中,端到端的训练方法可以用于让机器人执行复杂的任务,例如抓取和移动物体。在这种情况下,输入是机器人的传感器读数,输出是机器人的运动指令,而端到端的训练方法则可以帮助机器人学习如何根据其传感器读数生成适当的运动指令。
  4. 计量经济学:在计量经济学中,端到端的训练方法可以用于建立预测模型,例如预测经济指标(如GDP、通货膨胀率等)的变化。在这种情况下,输入是历史数据和其他相关信息,输出是预测的经济指标。

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

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

相关文章

代码随想录算法训练营DAY6 | 哈希表(1)

DAY5休息一天,今天重启~ 哈希表理论基础:代码随想录 Java hash实现 :java 哈希表-CSDN博客 一、LeetCode 242 有效的字母异位词 题目链接:242.有效的字母异位词 思路:设置字典 class Solution {public boolean isAnag…

C/C++ - 内存管理(C++)

堆栈 C中的栈和堆是用于存储变量和对象​​的两个主要内存区域。栈是一种自动分配和释放内存的区域,用于存储局部变量和函数调用的上下文。栈上的内存分配和释放是自动进行的,无需手动管理。堆是动态分配内存的区域,用于存储动态创建的对象和…

Blender教程(基础)-内插面、分离、环切、倒角-08

一、内插面 菜单位置如下图位置。 单击需要处理的面,出现一个黄色的圈。 1、菜单选中内插 鼠标悬停在黄色圈内单击左键可以来回实现内插,但是发现并不好操作。 2、快捷键内插 在选中需要操作的面之后,鼠标移动到外面,键盘在英…

计算机设计大赛 基于图像识别的跌倒检测算法

前言 🔥 优质竞赛项目系列,今天要分享的是 基于图像识别的跌倒检测算法 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🧿 更多资料, 项目分享: https://gitee.com/dancheng-senior/…

Java图形化界面基本案例

案例: public class exer1 {JFrame snew JFrame("练习");//菜单JMenuBar jMenuBarnew JMenuBar();JMenu wenjiannew JMenu("文件");JMenu bianjinew JMenu("编辑");JMenuItem zidongnew JMenuItem("自动换行");JMenuItem f…

斜率优化dp模型整理

300. 任务安排1(300. 任务安排1 - AcWing题库) 思路:很明显这些任务是按顺序排好的,我们能执行的操作只是对它们进行分批,我们可以发现每一批之前的开始时间s,影响的不仅仅是当前这一批的结束时间&#xff…

Java强训day9(选择题编程题)

选择题 class Person {String name "No name";public Person(String nm) {name nm;} } class Employee extends Person {String empID "0000";public Employee(String id) {super(" ");//要调用父类的有参构造方法否则报错empID id;} } pu…

常用芯片学习——AMS1117芯片

AMS1117 1A 低压差线性稳压器 使用说明 AMS1117 是一款低压差线性稳压电路,该电路输出电流能力为1A。该系列电路包含固定输出电压版本和可调输出电压版本,其输出电压精度为士1.5%。为了保证芯片和电源系统的稳定性,XBLWAMS1117 内置热保护和…

秋招面试—浏览器原理篇

浏览器原理篇 1.什么是XSS、CSRF,怎么预防? (1)XSS(跨站脚本攻击):攻击者将恶意代码植入到浏览器页面中,盗取存储在客户端的Cookie; ​ XSS分为:①存储型:论坛发帖、商品评论、用户…

大型电商系统商城源码_架构_订单系统_OctShop

中国的电商差不多发展到今天已经有20多年的历史啦,特别是过去的10年里其发展速度与竞争是相当的激烈,发展出了各种各样的模式如:B2B、B2C、B2B2C、O2O、社交电商等等。对于广大的企业或商家来说,电商是一个不可或缺的销售渠道&…

猫咪不吃东西怎么办?公认适口性好的生骨肉冻干分享

猫咪不吃东西怎么办?遇到这类情况主人需要仔细观察并分析情况。如果猫咪出现其他异常症状,如呕吐、腹泻、体温异常等,可能是生病了,应及时就医。如果猫咪没有其他异常症状,那猫咪不吃东西怎么办?可能是猫粮…

JAVA多线程并发补充

AQS 是一个抽象父类 全称是 AbstractQueuedSynchronizer,是阻塞式锁和相关的同步器工具的框架。 用 state 属性来表示资源的状态(分独占模式和共享模式),子类需要定义如何维护这个状态,控制如何获取锁和释放锁 getSt…

Windows系统云服务器自定义域名解析导致网站无法访问怎么解决?

本文九河云介绍Windows实例内部自定义域名解析与本地网络域名解析不一致导致无法访问网站的问题描述、问题原因和解决方案。 问题描述 在Windows实例内部通过浏览器无法访问某网站,但在其他设备上可以正常访问,排查发现Windows实例内部自定义域名解析与…

6.s081 学习实验记录(三)system calls

文章目录 一、use gdb二、syscall:trace注意:实验代码:实验结果: 三、sysinfotips:实验代码实验结果 需要切换到 syscall 分支 一、use gdb 学习使用 gdb 调试 make qemu-gdb打开一个新的终端: gdb-mult…

Selenium教程11:模拟账号密码,自动登入qq空间

Python爬虫教程30:Selenium网页元素,定位的8种方法! Selenium自动化教程02:浏览器options配置及常用的操作方法 Selenium自动化教程03:延时等待的3种方式 Selenium自动化教程04:鼠标键盘网页的模拟操作 …

文件的相关概念及用法

文件的作用 程序运行时产生的数据都属于临时文件&#xff0c;程序一旦运行结束就会被释放。若想让数据保存下来&#xff0c;则可以通过文件将数据持久化 文件需要包含的头文件<fstream>(文件流) 文件分类 文件分为文本文件和二进制文件。 文本文件&#xff1a;文件以…

快速上手Git

目录 一、Git概述 二、Git的常用命令 Git全局配置 获取Git仓库 基本概念 本地仓库操作 远程仓库操作 分支操作 标签操作 三、在IDEA中使用Git 在IDEA中配置Git 本地仓库操作 远程仓库操作 分支操作 冲突解决 一、Git概述 Git是一个分布式版本控制工具&…

探索设计模式的魅力:深入了解适配器模式-优雅地解决接口不匹配问题

设计模式专栏&#xff1a;http://t.csdnimg.cn/nolNS 目录 一、引言 1. 概述 2. 为什么需要适配器模式 3. 本文的目的和结构 二、简价 1. 适配器模式的定义和特点 定义 特点 2. 适配器模式的作用和适用场景 作用 适用场景 3. 适配器模式与其他设计模式的比较 三、适配…

DolphinScheduler + Amazon EMR Serverless 的集成实践

01 背景 Apache DolphinScheduler 是一个分布式的可视化 DAG 工作流任务调度开源系统&#xff0c;具有简单易用、高可靠、高扩展性、⽀持丰富的使用场景、提供多租户模式等特性。适用于企业级场景&#xff0c;提供了一个可视化操作任务、工作流和全生命周期数据处理过程的解决方…