构建自己的ChatGPT:从零开始构建个性化语言模型

在这里插入图片描述

🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁
🦄 个人主页——libin9iOak的博客🎐
🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺
🌊 《IDEA开发秘籍》学会IDEA常用操作,工作效率翻倍~💐
🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批评指正!🍁🐥

文章目录

  • 构建自己的ChatGPT:从零开始构建个性化语言模型
    • 摘要:
    • 1. 引言
    • 2. 了解ChatGPT和自然语言处理基础
    • 3. 构建ChatGPT之前的准备
    • 4. 数据收集和预处理
    • 5. 搭建ChatGPT模型
      • 5.1. Transformer架构简介
      • 5.2. 自注意力机制
      • 5. 3. 编码器-解码器结构
      • 5.4. 模型细节
        • a. 词嵌入层
        • b. 位置编码
        • c. 多层编码器
        • d. 解码器
      • 5.5. 模型训练
      • 5.6. 模型生成
    • 6. 模型训练与优化
      • 6.1. 学习率调整
      • 6.2. 梯度裁剪
      • 6.3. 批量归一化
      • 6.4. Dropout
      • 6.5. 预训练模型微调
      • 6.6. 模型评估与调参
      • 6.7. 并行化训练
    • 7. 测试和评估
      • 7.1. 自动评估指标
        • a. BLEU(Bilingual Evaluation Understudy)
        • b. Perplexity
      • 7.2. 人工评估
      • 7.3. 对比实验
      • 7.4. 数据集划分
      • 7.5. 模型选择和调优
    • 8. 个性化语言模型的应用
    • 9. 面临的挑战与解决方案
      • 9.1. 过拟合
      • 9.2. 梯度消失和梯度爆炸
      • 9.3. 训练时间和资源
      • 9.4. 数据质量和多样性
    • 10. 未来展望
    • 11. 结论
    • 12. 参考文献
  • 原创声明

在这里插入图片描述

构建自己的ChatGPT:从零开始构建个性化语言模型

摘要:

在本篇博客中,我们将探讨如何构建自己的ChatGPT(Generative Pre-trained Transformer),这是一种个性化语言模型,能够自动生成人类类似的文本内容。我们将逐步介绍了解ChatGPT和自然语言处理基础、构建ChatGPT之前的准备、数据收集和预处理、搭建ChatGPT模型、模型训练与优化、测试和评估、以及个性化语言模型的应用。同时,我们还将深入讨论面临的挑战,并提供相应的解决方案。最后,我们将展望个性化语言模型的未来发展方向。

1. 引言

自然语言处理(NLP)技术近年来取得了长足的进步,其中基于深度学习的语言模型成为了研究的热点。ChatGPT作为近年来最受欢迎的语言模型之一,能够生成连贯的文本,甚至可以与用户进行实时对话。在这篇博客中,我们将一步步指导您如何构建自己的个性化ChatGPT语言模型,为您的项目或应用增添更多的魅力。

2. 了解ChatGPT和自然语言处理基础

在本节中,我们将深入了解ChatGPT的基本概念、原理和工作机制。ChatGPT是OpenAI推出的基于Transformer架构的预训练语言模型。它通过大规模的无监督学习从海量文本数据中学习到语言的结构和规律,从而具备了生成自然语言文本的能力。理解ChatGPT的原理将为我们构建个性化语言模型奠定坚实基础。同时,我们还将回顾一些自然语言处理的基础知识,包括词嵌入、序列模型等,以便更好地理解ChatGPT的构建过程。

3. 构建ChatGPT之前的准备

在开始构建ChatGPT之前,我们需要明确项目的目标和所需资源。首先,我们需要明确希望我们的ChatGPT能够达到怎样的效果和应用场景。其次,我们需要准备一台性能足够强大的计算机或使用云计算资源,因为训练大规模语言模型需要大量的计算资源和时间。同时,我们需要安装Python环境和相应的深度学习库,如TensorFlow或PyTorch,以及Hugging Face等库,这些库将大大简化我们构建ChatGPT的过程。

4. 数据收集和预处理

数据是训练语言模型的关键,良好的数据集将对模型性能产生巨大影响。在这一部分,我们将介绍如何收集适用于您个性化ChatGPT模型的数据,并进行必要的数据预处理。数据预处理包括文本清洗、分词、编码等过程,以及将数据划分为训练集、验证集和测试集等步骤,确保数据的质量和可用性。

5. 搭建ChatGPT模型

在这一章节中,我们将从头开始搭建ChatGPT模型。我们将介绍Transformer架构的基本原理,并解释其在生成文本方面的优势。随后,我们将逐步构建模型的各个组件,包括自注意力机制、编码器-解码器结构等,确保模型能够正确地生成文本。

在本章节中,我们将详细介绍如何从头开始搭建ChatGPT模型,该模型将基于Transformer架构,并利用自注意力机制和编码器-解码器结构来实现文本生成功能。下面是具体的步骤:

5.1. Transformer架构简介

Transformer是一种基于注意力机制的神经网络架构,由Vaswani等人于2017年提出,并在自然语言处理任务中取得了重大突破。Transformer摒弃了传统的循环神经网络(RNN)结构,采用了自注意力机制,使得模型能够并行处理输入序列,从而显著提高了计算效率。

5.2. 自注意力机制

自注意力机制是Transformer的核心组件之一。它允许模型在处理输入序列时,能够根据输入序列中的其他元素自适应地给予不同的注意权重。自注意力机制通过计算注意力分数来实现这一功能,然后将注意力分数与输入序列进行加权求和,得到每个位置的表示。

5. 3. 编码器-解码器结构

在构建ChatGPT模型时,我们需要同时考虑到输入序列(文本的历史信息)和输出序列(即将生成的文本)。为此,我们使用了编码器-解码器结构。编码器负责处理输入序列,将其转换为一系列高维表示;而解码器则利用这些高维表示,结合自注意力机制,生成目标序列,即我们希望模型生成的文本。

5.4. 模型细节

接下来,我们将逐步搭建ChatGPT模型的具体细节:

a. 词嵌入层

我们首先引入词嵌入层,将输入的文本转换为向量表示。词嵌入层将每个词转换为高维向量,使得模型能够更好地理解词汇之间的语义关系。

b. 位置编码

由于Transformer没有像RNN那样的顺序信息,我们需要引入位置编码来告知模型输入序列中每个单词的位置信息。位置编码的添加使得模型能够理解输入序列的顺序。

c. 多层编码器

在ChatGPT模型中,我们通常使用多层编码器来对输入序列进行处理。每一层编码器都包含自注意力机制和前馈神经网络,使得模型能够在不同抽象层次上理解输入序列的信息。

d. 解码器

在解码器中,我们将使用类似的多层结构来生成目标序列,即我们希望模型生成的文本。解码器通过注意编码器的输出和自注意力机制来逐步生成文本,直到完成整个序列的生成。

5.5. 模型训练

构建好ChatGPT模型后,我们将使用数据集进行模型训练。训练的目标是最小化模型生成文本与实际目标文本之间的差距,通常使用最大似然估计(MLE)作为训练目标。我们会使用一些优化算法,如Adam,来调整模型的参数,从而使得模型能够更好地生成符合预期的文本。

5.6. 模型生成

经过训练后,我们的ChatGPT模型就可以用来生成文本了。在生成时,我们会将一个初始的输入文本传入模型,然后利用解码器逐步生成后续的文本。为了增加生成的多样性,我们可以采用一些采样策略,如贪婪采样、束搜索等。

通过以上步骤,我们将成功搭建一个基本的ChatGPT模型,并使其能够生成个性化的文本内容。在实际应用中,我们可以根据具体需求对模型进行调优和改进,以获得更好的效果和用户体验。

6. 模型训练与优化

模型的训练和优化是确保ChatGPT性能良好的关键步骤。我们将详细讨论训练过程中的注意事项,如学习率调整、梯度裁剪等,以及一些优化技巧,如批量归一化、Dropout等,以提高模型的生成能力和效率。同时,我们还将介绍如何利用预训练模型进行微调,以便更好地适应特定任务或领域。

在模型训练与优化阶段,我们需要关注一系列重要的注意事项和优化技巧,以确保ChatGPT模型具有较好的性能和生成能力。下面是我们将要详细讨论的内容:

6.1. 学习率调整

学习率是控制模型参数更新步长的重要超参数。过大的学习率可能导致训练过程不稳定,而过小的学习率会使得模型训练过慢。在模型训练过程中,我们通常采用学习率衰减或动态调整的方法,逐渐降低学习率,使得模型在训练初期能够快速学习,而在训练后期逐渐稳定。

6.2. 梯度裁剪

梯度裁剪是一种防止梯度爆炸问题的技巧。在深度学习中,由于反向传播时梯度可能会非常大,导致模型权重更新过于剧烈。梯度裁剪通过限制梯度的大小,使得梯度不会超过一定阈值,从而稳定训练过程。

6.3. 批量归一化

批量归一化(Batch Normalization)是一种用于加速训练过程和稳定模型的技术。它通过在每个小批量数据上对输入进行归一化,使得模型在训练过程中更容易收敛。批量归一化还有助于防止梯度消失问题,并允许使用更大的学习率。

6.4. Dropout

Dropout是一种用于防止过拟合的正则化技术。它在训练过程中随机丢弃一部分神经元,使得模型在不同神经元组合上进行训练,减少神经元之间的依赖关系。这样可以提高模型的泛化能力,防止过拟合。

6.5. 预训练模型微调

如果有预训练的语言模型,如GPT-2或BERT,我们可以利用这些模型进行微调,以便更好地适应特定任务或领域。预训练模型通常在大规模数据上进行了预训练,具有丰富的语言知识。通过微调,我们可以在较少的训练数据上快速提高模型性能。

6.6. 模型评估与调参

在训练过程中,我们需要定期评估模型在验证集上的性能。通过监控模型在验证集上的表现,我们可以选择最佳的模型进行保存,避免过拟合。同时,我们还需要对模型的超参数进行调优,如学习率、批量大小等,以找到最优的组合。

6.7. 并行化训练

为了加快训练速度,我们可以采用并行化训练的方法。将模型训练过程拆分为多个计算节点并行进行,利用多台机器或GPU进行分布式训练,从而减少训练时间。

通过以上训练和优化技巧,我们可以有效地提高ChatGPT模型的性能和生成能力。同时,利用预训练模型进行微调,可以使得模型更加适应特定任务或领域,提高模型的应用价值。在训练和优化过程中,持续的实验和调整将有助于找到最佳的模型和超参数组合。

7. 测试和评估

在这一部分,我们将介绍如何对构建的ChatGPT模型进行测试和评估。我们将使用一系列标准评估指标,如BLEU、Perplexity等,来评估模型的性能,并确保其在各项指标上达到预期要求。同时,我们将进行人工评估,以获得对模型生成文本质量的直观感受。

在测试和评估ChatGPT模型的过程中,我们将采用多种方法来验证模型的性能和生成文本的质量。以下是我们将采取的评估步骤:

7.1. 自动评估指标

a. BLEU(Bilingual Evaluation Understudy)

BLEU是一种常用的自动评估指标,用于衡量模型生成的文本与参考文本之间的相似性。它通过比较n-gram重叠来计算文本之间的匹配程度。较高的BLEU分数表示模型生成的文本更接近参考文本,从而表明模型性能较好。

b. Perplexity

Perplexity是一种衡量语言模型预测能力的指标。在ChatGPT中,我们可以使用Perplexity来衡量模型生成文本的流畅程度和一致性。较低的Perplexity值意味着模型能够更好地预测下一个词,从而生成更连贯的文本。

7.2. 人工评估

自动评估指标虽然能够提供一定程度上的衡量,但仍难以完全反映模型生成文本的质量。因此,我们需要进行人工评估来获得对模型生成文本质量的直观感受。在人工评估中,我们会邀请一些评估者阅读并评价模型生成的文本,从而得到更全面和准确的评估结果。

7.3. 对比实验

为了更好地验证模型性能,我们还可以进行对比实验。我们可以将构建的ChatGPT模型与其他类似的语言模型进行比较,包括传统的n-gram语言模型和其他基于深度学习的语言模型。通过对比实验,我们可以更好地了解ChatGPT模型的优势和不足之处。

7.4. 数据集划分

在进行测试和评估时,我们需要将数据集划分为训练集、验证集和测试集。训练集用于模型的训练,验证集用于调整模型的超参数和防止过拟合,而测试集用于最终评估模型的性能。划分数据集的过程需要保证数据的随机性和一致性,以确保评估结果的准确性。

7.5. 模型选择和调优

根据测试和评估的结果,我们可以选择最佳的模型,或者对模型进行调优。调优的过程可以包括调整模型的超参数,增加训练数据的规模,或者采用更复杂的模型结构。通过不断地优化模型,我们可以使得ChatGPT模型生成的文本更加符合预期要求。

通过以上测试和评估步骤,我们可以全面地了解ChatGPT模型的性能,并对其生成的文本质量进行准确的评估。这将有助于我们进一步改进模型,提高其生成文本的质量和可用性。同时,评估结果也将指导我们在实际应用中合理地使用ChatGPT模型,以满足不同场景下的需求。

8. 个性化语言模型的应用

除了生成文本,个性化语言模型还有许多有趣的应用。在这一章节中,我们将探讨ChatGPT在对话系统、内容创作、智能助手等领域的实际应用,并展示其在提高用户体验、推动商业发展等方面的潜在价值。同时,我们还将展示如何通过调整模型参数和输入文本来实现个性化的生成结果。

9. 面临的挑战与解决方案

构建个性化语言模型并不是一帆风顺的,我们将面临各种挑战。在这一部分,我们将讨论可能遇到的问题,如过拟合、梯度消失等,以及提供相应的解决方案,帮助您克服困难并优化模型的性能。

在构建个性化语言模型的过程中,确实会遇到一些挑战,这些挑战可能会影响模型的性能和效果。以下是一些常见的挑战以及相应的解决方案:

9.1. 过拟合

过拟合是指模型在训练集上表现很好,但在新的未见过的数据上表现较差。这是因为模型过于复杂或训练数据过少,导致模型记住了训练集的噪声而不是学习到普遍规律。

解决方案:为了克服过拟合,我们可以采取以下措施:

  • 增加训练数据量:更多的数据有助于模型学习更多的通用规律,减少过拟合的可能性。
  • 数据增强:通过对训练数据进行旋转、平移、缩放等操作,生成更多的数据样本,增加数据的多样性。
  • 正则化:引入L1或L2正则化惩罚项,限制模型权重的大小,防止模型过度拟合。
  • Dropout:在训练过程中随机丢弃一部分神经元,使得模型在不同神经元组合上进行训练,减少过拟合。

9.2. 梯度消失和梯度爆炸

在深度学习中,特别是在RNN和一些较深的神经网络中,梯度消失和梯度爆炸是常见的问题。梯度消失指的是在反向传播过程中,梯度逐层递减,导致较早层的权重更新非常缓慢。梯度爆炸指的是梯度逐层递增,导致较早层的权重更新过快,导致不稳定的训练过程。

解决方案:解决梯度消失和梯度爆炸问题的方法有以下几种:

  • 使用激活函数:合理选择激活函数可以缓解梯度消失问题。ReLU、Leaky ReLU和ELU等激活函数都有一定的抑制梯度消失的能力。
  • 权重初始化:合理初始化权重可以避免梯度爆炸问题。使用较小的初始化权重,如Xavier初始化或He初始化。
  • 梯度裁剪:限制梯度的大小,防止梯度爆炸。
  • LSTM和GRU:使用长短期记忆网络(LSTM)或门控循环单元(GRU)等特殊的循环神经网络结构,可以减少梯度消失问题。

9.3. 训练时间和资源

构建个性化语言模型通常需要大量的训练时间和计算资源,特别是对于较大的模型和大规模的数据集。这可能成为一个挑战,特别是对于个人或资源有限的团队。

解决方案:为了解决训练时间和资源问题,可以采取以下措施:

  • 选择适当规模的模型:根据资源情况,选择适当规模的模型,权衡模型性能和训练时间。
  • 使用分布式训练:将训练过程拆分为多个计算节点并行进行,利用多台机器或GPU进行分布式训练,缩短训练时间。
  • 使用预训练模型:如果有适用于自己任务的预训练模型,可以使用预训练模型进行微调,减少训练时间和资源消耗。

9.4. 数据质量和多样性

构建个性化语言模型需要高质量的数据集,以及涵盖多样化的文本内容,以确保模型具有广泛的应用能力。然而,获取高质量和多样性的数据并不容易。

解决方案:为了保证数据质量和多样性,可以考虑以下方法:

  • 数据清洗:对数据进行必要的清洗和去噪,确保数据质量。
  • 数据增强:通过数据增强技术生成更多的数据样本,增加数据的多样性。
  • 引入领域知识:利用领域专家的知识来筛选和收集具有代表性的数据。

通过解决上述挑战,并采取相应的解决方案,我们可以优化个性化语言模型的性能,使其更加适用于不同的任务和应用场景。

10. 未来展望

随着人工智能技术的不断发展,个性化语言模型的未来充满了无限可能。在这一章节中,我们将展望个性化语言模型的未来发展方向,并探讨可能的研究方向和应用场景。我们相信,个性化语言模型将在各个领域发挥更加重要和广泛的作用。

11. 结论

通过本篇博客的学习,您应该对构建个性化ChatGPT语言模型有了全面的了解。个性化语言模型作为一种强大的自然语言处理技术,将为您的项目和应用带来更加出色的效果和用户体验。不过,构建个性化语言模型仍然是一个复杂而充满挑战的任务,需要不断地学习和改进。希望本文能为您在个性化语言模型的构建和应用方面提供帮助。

12. 参考文献

  1. Vaswani, A., et al. (2017). “Attention is All You Need.” In Proceedings of the 31st Conference on Neural Information Processing Systems (NIPS 2017).
  2. Radford, A., et al. (2018). “Improving Language Understanding by Generative Pre-Training.” URL: https://s3-us-west-2.amazonaws.com/openai-assets/research-covers/language-unsupervised/language_understanding_paper.pdf
  3. Devlin, J., et al. (2019). “BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding.” In Proceedings of the 2019 Conference of the North American Chapter of the Association for Computational Linguistics: Human Language Technologies (NAACL-HLT 2019).
  4. Hugging Face Transformers Library: https://github.com/huggingface/transformers

原创声明

=======

作者wx: [ libin9iOak ]


本文为原创文章,版权归作者所有。未经许可,禁止转载、复制或引用。

作者保证信息真实可靠,但不对准确性和完整性承担责任。

未经许可,禁止商业用途。

如有疑问或建议,请联系作者。

感谢您的支持与尊重。

点击下方名片,加入IT技术核心学习团队。一起探索科技的未来,共同成长。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Unity2D】设置一物体默认在其他物体之上不被遮挡

比如我想让机器人显示在箱子的前面。 点击箱子,将其层级设置在机器人的后面。 即修改箱子的Order in Layer 在机器人之后 物体默认的Order in Layer 都是0 ,将箱子的Order in Layer修改为-1即可 这样将确保先绘制机器人,然后绘制箱子。这样…

【小黄碎碎念】如何解析和替换字符串中的 Markdown 文本?正则表达式与 flexmark-java 库

前言 本周,笔者将之前的基于 Servlet 的个人博客项目进行了迭代,基于 SpringBoot SpringMVC Mybatis Redis 进行实现。额外实现密码的明文加密处理(加盐算法)、修改随笔、随笔主页等功能,并将 session 存储到 Redis…

App测试中ios和Android的区别

1、Android长按home键呼出应用列表和切换应用,然后右滑则终止应用; 2、多分辨率测试,Android端20多种,ios较少; 3、手机操作系统,Android较多,ios较少且不能降级,只能单向升级&…

ffmpeg中filter_query_formats函数解析

ffmpeg中filter_query_formats主要起一个pix fmt引用指定的功能。 下下结论&#xff1a; 先看几个结构体定义&#xff1a; //删除了一些与本次分析不必要的成员 struct AVFilterLink {AVFilterContext *src; ///< source filterAVFilterPad *srcpad; ///<…

Feign远程调用如何携带form url

这是一个需要携带参数在form url上的请求&#xff0c;正常调用方式是这样的 响应&#xff1a; 在Feign中&#xff0c;应该怎么调用呢?? 定义OpenFeignClient接口 FeignClient(value "client-service", url "http://127.0.0.1/api") public interface…

pytorch工具——认识pytorch

目录 pytorch的基本元素操作创建一个没有初始化的矩阵创建一个有初始化的矩阵创建一个全0矩阵并可指定数据元素类型为long直接通过数据创建张量通过已有的一个张量创建相同尺寸的新张量利用randn_like方法得到相同尺寸张量&#xff0c;并且采用随机初始化的方法为其赋值采用.si…

记一次简单的MySql注入试验

试验环境&#xff1a; 1.已经搭建好的php服务器&#xff0c;并可以通过访问到localhost/index.php&#xff1b; 2.已经安装好数据库&#xff0c;并创建表test&#xff0c;表内有name、age等字段&#xff0c;并随便创建几个假数据用于测试&#xff1b;如图&#xff1a; 开始测…

万向节死锁

要理解万向节死锁的产生原因&#xff0c;首先要理解欧拉角变换&#xff0c;欧拉角变换是基于最初始的坐标进行变换而非变换后的坐标进行变换。 欧拉角变换需要空间中的三个角&#xff08;即变换后每个轴的偏移量&#xff09;&#xff0c;另外还有每个轴的变换顺序。值得注意的…

安装:【vue】npm install -g @vue/cli出现错误

安装Vue脚手架&#xff0c;cli就是Command Line Interface 命令行接口 工具 进行到npm install -g vue/cli这一步出现错误&#xff0c;操作步骤如下&#xff1a; 1.通过 wins打开开始栏的搜索框&#xff0c;输入cmd&#xff0c;管理员身份运行 2.先下载node.js 不知道有没有…

应用案例 | 实现第三方控制系统下HART智能设备的集中管理与维护

一 背景 在过程工业向数字化转型的过程中&#xff0c;设备管理系统扮演者着关键的角色——帮助企业集中管理和监控现场设备&#xff0c;并实现全面的设备管理和维护。通过实时监测和控制设备的运行状态、性能和健康状况&#xff0c;设备管理系统能够提前发现设备故障、减少生产…

Transformer+医学图像最新进展【2023】

Transformer主要用于自然语言处理领域。近年来,它在计算机视觉(CV)领域得到了广泛的应用。医学图像分析(MIA,Medical image analysis)作为机器视觉(CV,Computer Vision)的一个重要分支,也极大地受益于这一最先进的技术。 机构:新加坡国立大学机械工程系、中山大学智能系…

链动2+1营销系统开发模式深度解析

链动21模式其实是一种针对快消品行业的营销模式&#xff0c;主要逻辑就是用薄利多销丰厚返利的方式来吸引客户&#xff0c;同时快速裂变团队。 这个模式的玩法也很简单&#xff0c;只有代理和老板两种身份&#xff0c;代理身份是用户购买499元产品可以解锁&#xff0c;同时享受…

es通过rest接口_search、_delete_by_query查询与删除数据

1、rest接口查询数据 rest查询: http://localhost:9200/index_name/_search 查询表达式&#xff1a; {"query": {"wildcard": {"accountID": {"value": "v*"}}} }postman请求截图&#xff1a; 2、使用Rest接口删除数据 …

Mysql表的查找进阶

重点细节知识&#xff1a;NULL是表示表里这个格子是空着的&#xff0c;NULL参与各种运算都是->false&#xff0c;但是只有这个才是可以用NULL等于NULL成功的 <>。,看一下&#xff0c;下图的区别&#xff0c;下面的是连空也算上了 补充一个is 用法&#xff0c;和上面语…

python实现远程服务器的操作

前言 测试过程中经常会遇到需要将本地的文件上传到远程服务器上&#xff0c;或者需要将服务器上的文件拉到本地就行操作&#xff0c;以前安静经常会用到xftp工具。今天介绍一种python库Paramiko&#xff0c;可以帮助我们通过代码的方式进行完成对远程服务器的上传和下载操作。…

OpenCV for Python 实战(一):获取图片拍摄GPS地址并自动添加水印

Hello 我们在OpenCV每天的基础博客当中已经更新了很多了&#xff0c;那么今天我们就来结合前几天的内容。做一个获取属性然后添加对应属性的水印。那让我们赶快开始吧~ 文章目录 图片EXIFPython 获取EXIFexifread库使用方法转换成文字地址 添加水印cv2.putText() 每日总结 图片…

了解应用层

应用层 1. 概述2. 应用程序组织方式2.1 C/S方式2.1 P2P方式 3. 动态主机配置协议DHCP3.1 DHCP工作流程 4. 域名系统DNS4.1 域名结构4.2 域名分类4.3 域名服务器4.3.1 分类 4.4 DNS域名解析过程 5. 文件传输协议FTP5.1 FTP工作流程 6. 电子邮件系统6.1 邮件信息格式6.2 简单邮件…

信息的表示与处理 (深入理解计算机系统第二章)

刚学习这本书没多久&#xff0c;感觉里面讲的东西挺多的&#xff0c;前后的关联性比较强。学着后面的还需要看看前的才可以更好的理解。 2.1信息存储 无符号(unsigned) 编码是基于传统的二进制表示法的&#xff0c;表示大于或者等于零的数字。 二进制补码(twos-complement)编…

存储过程——用户自定义变量、局部变量

1.用户自定义变量 在会话一定义的变量在会话二中是用不了的。 使用set指令定义变量,并为变量赋值&#xff0c;mysql中赋值推荐使用 :&#xff0c;因为在mysql中没有这个比较运算&#xff0c;也带有比较运算的功能&#xff0c;因此赋值运算推荐使用 : set myname itcast; se…

软件测试面试题及答案【史上最全】

以下是软件测试相关的面试题及答案&#xff0c;欢迎大家参考! 1、你的测试职业发展是什么? 测试经验越多&#xff0c;测试能力越高。所以我的职业发展是需要时间积累的&#xff0c;一步步向着高级测试工程师奔去。而且我也有初步的职业规划&#xff0c;前3年积累测试经验&…
最新文章