由ChatGPT谈谈下一代多模态模型的雏形

baa61d2d047207765d441c145636109f.png

来源:蘑菇先生学习记 NewBeeNLP

https://zhuanlan.zhihu.com/p/606364639

本文约5800,建议阅读11分钟

本文浅谈对多模态模型的新的认识。

最近ChatGPT风头正劲,但只能理解文字或多或少限制其才华的发挥。得益于Transformer在NLP和CV领域的大放异彩,多模态近几年取得了非常大的进步。但之前的工作大多数局限在几个特定的,比如VQA,ITR,VG等任务上,限制了其应用。

最近,Junnan Li大佬挂出了他最新的杰作BLIP2。让我对多模态模型有了一些新的认识,希望通过本文分享一下我的想法。由于本身水平有限,加上很长时间没有survey过相关领域的论文了,里面大部分的思考可能都是闭门造车,所以不可避免有很多错误,欢迎大家指正讨论。

806e2759a3bb3120b07940b9bd167d0e.png

ALBEF,BLIP,BLIP2 都是 Junnan Li [1]大佬的杰作,给了我很大的启发。ALBEF去掉了笨重的Detector,BLIP统一了理解与生成,BLIP2再次刷新了我的认知,感谢大佬!

TL,DR

先一言以蔽之:

  1. 实现了开放性的多模态内容理解与生成,让我们有了更多的想象空间;

  2. 从新的视角去看待图文模态,引入了LLM模型。CV模型是传感器,负责感知,LLM模型是处理器,负责处理;

  3. 相对友好的计算资源,比起动辄几百张卡的大模型,BLIP 2 最大的模型也不过16张A100 40G;

  4. 传统图文任务上性能爆表


从泰坦尼克号说起

3d4eddb7c9dbb1a596b86f6fb80950b5.png

开始前介绍论文前我们先来讨论下,实现图片中的问答,需要什么能力呢?

  1. 图片里发生了什么:一位男士在船头搂着一位女士。(感知-CV模型的能力)

  2. 问题问的什么:电影的结尾是什么?(感知-NLP模型的能力)

  3. 图片和电影有什么关系:这是泰坦尼克号里的经典镜头。(对齐融合-多模态模型的能力)

  4. 电影的结尾是什么:泰坦尼克号沉没了。(推理-LLM模型的能力)


对不同模型扮演角色的理解

从上面的问题可以看出,为了解决这个问题,需要几个模型配合一下。其实自从多模态模型 (特别是图文多模态模型) 出现, 模态之间怎么配合就是个问题。

b3dbf64e292f1272343f85fbd52d45c7.png

19年、20年的时候,ViLBERT和Uniter采用了Object-Text对来提升模型对图片的理解能力。Object的引入,不可避免的需要一个笨重的检测器,去检测各种框,使得图像模态显得比较笨重。而且检测器模型不可避免的会存在漏检的问题,可以参考后来Open-Vocabulary一些工作,比如ViLD。这一阶段,显然对图像的理解是多模态的重头戏,文本更多是辅助图像任务的理解。

6954f46955b274291c181611e2b8d184.jpeg

到了21年、22年,去掉检测器成了主流,ViLT,ALBEF,VLMo,BLIP 等等都抛弃了检测器,彻底摆脱了CNN网络的舒服,全面拥抱Transformer,当然这也得益于本身ViT模型在CV领域的大放光彩,让两个模态的有机融合成为了可能。在这一阶段,文本模态感觉已经可以和图像模态平起平坐了。从在各项具体下游任务(VQA、VG、ITR)的实际表现上来说,已经比较令人满意了。但总感觉差点味道,就是复杂推理。比如VQA上的问题,大多数是简单的逻辑计算或识别,感觉还不够智能。

那么如何实现更加复杂的推理呢?众所周知,NLP领域一直领先于CV领域的发展。得益于更丰富的语料库,NLP领域的已经拥有了一些具有初步推理能力模型的研究,特别是LLM大模型的出现。(今天谷歌刚刚发布了22B的ViT,而在NLP领域这个规模的模型应该已经不算新闻了。)我对于LLM能力有多强的理解,其实也是ChatGPT之后才有明确的感知。

8bb2204a220c7daed0100513ef40e2e2.png

23年1月,BLIP2出来了,引入了LLM。从图像上看,BLIP2大概由这么几个部分组成,图像(Image)输入了 图像编码器(Image Encoder) ,得到的结果与文本(Text)在 Q-Former(BERT初始化) 里进行融合,最后送入 LLM模型。我是学自动化出身的,从自动化的角度看看BLIP2。

  • 图像和文本:自然信号;

  • 图像编码器(Image Encoder):传感器(图像);

  • Q-Former:传感器(文本)+ 融合算法(Query);

  • LLM:处理器。

之前的模型大多都关注在了传感器和融合算法的设计上,但忽略了处理器的重要作用。BERT模型虽然能理解文本,但却没有世界观的概念,没有庞大的背景知识库,只能作一个传感器。只有LLM模型,才能实现这一角色,统一起各个模态的信号,从一个宏观的角度去看待这个问题。这里引用一段原文中的话。

Powered by LLMs (e.g. OPT (Zhang et al., 2022), FlanT5 (Chung et al., 2022)), BLIP-2 can be prompted to perform zero-shot image-to-text generation that follows natural language instructions, which enables emerging capabilities such as visual knowledge reasoning, visual conversation, etc.

目前看,或许LLM就是下一代多模态模型的关键一环。

言归正传,我们开始介绍论文。


如何统一多模态的表征

LLM本质上是个语言模型,自然无法直接接受其他模态的信息。所以如何把各个模态的信息,统一到LLM能理解的特征空间,就是第一步要解决的问题。为此,作者提出了Q-Former。

1fbcdb324a39107d9761a2e24412926b.png

为了融合特征,那Transformer架构是最合适不过的了。熟悉ALBEF或者BLIP的同学或许发现,Q-Former的结构和ALBEF其实很像,如果看代码[3]的话,可以发现就是在ALBEF基础上改的。

相较于ALBEF,最大的不同,就是Learned Query的引入。可以看到这些Query通过Cross-Attention与图像的特征交互,通过Self-Attention与文本的特征交互。这样做的好处有两个:(1) 这些Query是基于两种模态信息得到的;(2) 无论多大的视觉Backbone,最后都是Query长度的特征输出,大大降低了计算量。比如在实际实验中,ViT-L/14的模型的输出的特征是257x1024的大小,最后也是32x768的Query特征。

这里其实有点疑问,也欢迎大家讨论。论文里是这样讲的:

This bottleneck architecture works together with our pre-training objectives into forcing the queries to extract visual information that is most relevant to the text.‍

作者通过Q-Former强制让Query提取文本相关的特征,但如果在推理时没有文本先验,那什么样的特征算是相关的呢?

针对Q-Former的三个训练任务分别是 Image-Text Contrastive Learning (ITC),Image-grounded Text Generation (ITG),Image-Text Matching (ITM)。其中 ITC 和 ITM 任务,与ALBEF中的实现类似,只不过图像特征改为了Query的特征,具体可以参考代码实现(ITC[5]和ITM[6])。这里比较特别的是ITG任务,与ALBEF中的MLM不同,这里改成了生成整句Text的任务,类似Captioning,具体代码实现ITG[7]。实际上,这几个任务都是以Query特征和文本特征作为输入得到的,只不过有不同的Mask组合,具体可以参考上图中的右图。

第一阶段,对于模型的训练,就是由以上三个任务组成,通过这几个任务,实现了对于特征的提取与融合。但现在模型还没见过LLM。我们现在用传感器完成了数据的提取与融合,下一步,我们得把数据转换成处理器能识别的格式。

变成LLM认识的样子

a839e311c616aa28229306e345b52a82.png

通过第一阶段的训练,Query已经浓缩了图片的精华,现在要做的,就是把Query变成LLM认识的样子。

为什么不让LLM认识Query,而让Query变成LLM认识呢? 这里的原因有两:(1)LLM模型的训练代价有点大;(2)从 Prompt Learning 的观点来看,目前多模态的数据量不足以保证LLM训练的更好,反而可能会让其丧失泛化性。如果不能让模型适应任务,那就让任务来适应模型

这里作者针对两类不同LLM设计了不同的任务:

  1. Decoder类型的LLM(如OPT):以Query做输入,文本做目标;

  2. Encoder-Decoder类型的LLM(如FlanT5):以Query和一句话的前半段做输入,以后半段做目标;

为了适合各模型不同的Embedding维度,作者引入了一个FC层做维度变换。

至此,模型两阶段的训练方法就介绍完了。

训练细节

作为图文预训练的工作,工程问题往往是关键。BLIP2的训练过程主要由以下几个值得关注的点:

  1. 训练数据方面:包含常见的 COCO,VG,SBU,CC3M,CC12M 以及 115M的LAION400M中的图片。采用了BLIP中的CapFilt方法来Bootstrapping训练数据。

  2. CV模型:选择了CLIP的ViT-L/14和ViT-G/14,特别的是,作者采用倒数第二层的特征作为输出。

  3. LLM模型:选择了OPT和FlanT5的一些不同规模的模型。

  4. 训练时,CV模型和LLM都是冻结的状态,并且参数都转为了FP16。这使得模型的计算量大幅度降低。主要训练的基于BERT-base初始化的Q-Former只有188M的参数量。

  5. 最大的模型,ViT-G/14和FlanT5-XXL,只需要16卡A100 40G,训练6+3天就可以完成。

  6. 所有的图片都被缩放到224x224的大小。


实验部分

作者首先用了整整一页的篇幅,为我们展示了BLIP2的 instructed zero-shot image-to-text generation 能力。这里暂且按下不表,到后面一起讨论。我们先看看BLIP2在传统的一些图文任务上的效果。

Image Captioning

8cffefbf57ca3c229b134b93869fa797.png

作者用图片配合文字 prompt “a photo of”作为模型的输入。训练过程中冻结LLM,训练Q-Former和CV模型。可以看到,在域内数据集(COCO)上,其表现并没有非常亮眼,但在域外数据集NoCaps上,BLIP2显示出了强大的泛化能力,相较之前的模型有明显的提升。

Visual Question Answering

6ddde84040c4246a0fc75fdcedb590d5.png

920cdab4fa09364ced24f47cc9b19f2d.png

训练的参数和IC任务一致,主要是Q-Former和ViT。不同的是,Q-Former和LLM都有Question作为文本输入。Q-Former的文本输入,保证了Query提取到的特征更加的精炼。

Image-Text Retrieval

ITR任务,作者只采用了第一阶段的Q-Former和ViT来做,没有引入LLM。具体的做法与ALBEF类似,先通过ITC任务算出点积相似度,再取Topk的匹配对,作ITM任务,得到最后的Matching Score。Flickr30K上再次刷新了SOTA,特别是I2T,基本饱和了。

Instructed Zero-shot Image-to-Text Generation

我觉得这个能力才是BLIP2最亮眼的地方。文章中是这样说的:

Selected examples of instructed zero-shot image-to-text generation using a BLIP-2 model w/ ViT-G and FlanT5XXL, where it shows a wide range of capabilities including visual conversation, visual knowledge reasoning, visual commensense reasoning, storytelling, personalized image-to-text generation, etc.

首先我们来看看BLIP2对信息的检索能力,下面几个例子都是对图片中物体的背景知识提问,可以看到,模型都给出了相应的答案。这里体现的实际上是LLM强大的背景知识库。图中有什么(ViT)+ 问的是什么(Q-Former,LLM)+ 找答案 (LLM)。

36ed565a65905cda0ce265c3bbae1936.png

下面的几个问题,都是要求模型对图片的内容进行进一步的推理。比如图二,需要建立对男人惊讶和鸡之间的因果联系

a315d80aaa3591f0f6a891abb7ecf5ee.png

最后的几个问题是开放性的生成问题。需要模型有一定的长文本生成能力。

1390f9eeda34c5da45f5c687d957831e.png

为了进一步探索BLIP2模型的效果,我也自己测试了一些Demo,这里采用的是ViT-G和FlanT5的模型组合,Hugging Face 上提供的CKPT加起来有50G左右了,作为一个平时接触CV多一点的人来看,是想当炸裂的,一般我模型的CKPT和最后那个零头差不多。

71c6115ce9ce1881e349d4aeb91f473c.png

先介绍一下测试的输入格式,这里主要参考[8]

我测试了如下形式的输入样例,其中比较特别的是Incontext Learning,这里除了图片中的信息,我还会给出一段文本中的信息,希望模型通过综合两个模态的信息给出答案。

  • Single-question answering

  • Template:"Question: {} Answer:"

  • Input: [Query, Template]

  • Multi-questions answering

  • Context: "Question: {} Answer: {}."

  • Template: "Question: {} Answer: "

  • Input: [Query, Context, Template]

  • Incontext Learning

  • Template: "Context: {} Question: {}"

  • Input: [Query, Template]

  • Instructed Generation

  • Input: [Query, Command]

下面是一些测试样例以及有趣的发现。粗体为模型的输出结果。

样例:Airbus 380

6be8d0d3ae1d63033d87966566c0171d.png

首先,我们问几个简单的问题

Q: What type of aircraft is this?
A: a a380
Q: What are the characteristics of this type of aircraft?
A: the a380 is the largest commercial passenger airline.

可以看到BLIP2基本给出了正确的回答,但当我询问飞机载客量时,模型确依然给出了380,推测可能是这个飞机和380这个数字的联系比较紧密。

Q: How many people can this aircraft accommodate?
A: 380

于是,同样的问题,我们给出一点文字上的提示,这里摘取了一段Wiki上的介绍送入模型。

C: The Airbus A380 is a large wide-body airliner that was developed and produced by Airbus. It is the world's largest passenger airliner and only full-length double-deck jet airliner. Airbus studies started in 1988, and the project was announced in 1990 to challenge the dominance of the Boeing 747 in the long-haul market. The full-length double-deck aircraft has a typical seating for 525 passengers, with a maximum certified capacity for 853 passengers.
Q: How many people can the aircraft in this figure accommodate?
A: 853

这时,我们可以看到,模型成功的给出了回答。也就是说,模型有联合两个模态信息联合推理的能力。如果我们使点坏呢,比如给出错误的Context。

C: The Airbus A350 is a long-range, wide-body twin-engine jet airliner developed and produced by Airbus.
Q: What type of aircraft is this figure?
A: airbus a350

可以看到,模型输出了错误的答案。可能由于本身LLM对文字更加关注,而且Figure的概念可能对他来说并不熟悉,在他看来,32个Query只不过是带Visual信息的Word Token。

样例:交通标志

cef34d5eda40c1fbe85b9f3670909c77.jpeg

在这个样例中,我们直接让模型自己生成个问题。

Q: Give me several question about the figure.
A: What is the speed limit on the road?

接着,我们问问看,模型自己知道答案么?

Q: What is the speed limit on the road?
A: 40 mph.

可以看到,模型准确地给出了限速。接着我们让他做一些简单逻辑判断。

Q: Can I drive 70 mph here?
A: No.
Q: Can I drive 30 mph here?
A: Yes.

模型竟然都能够正确的给出答案。最后,来个OCR的任务,让模型输出牌子上写了什么。

Q: What is written on this sign?
A: speed limit 40.

模型同样也给出了正确的答案。可以看到,模型对于逻辑判断和图片中文字的识别,都有一定的基础。

样例:表格

95fb666aab0b5b6947a88b8455a31bea.png

这里先用文章中自己的表格做测试。

Q: What is the name of the table?
A: a comparison of the mri and ct scans.

Emmm,属于是自家人不认自家人了。问问他认识自己不?

Q: Do you know BLIP2?
A: BLIP2 is a protein that in humans is encoded by the BLIP2 gene.

好吧,不认识。接着又有一些问题,模型的回答也不是很好。

Q: Which model in the table performs best?
A: dcm vs dcm vs dcm vs dcm vs dcm vs dcm.
Q: How many training parameters does BLIP2 have?
A: BLIP2 has a total of ten training parameters.

原因的话,其实比较好理解,表格的图片相对于自然图像的Gap较大,模型本身可能缺乏相应的训练数据;其次,虽然32的Query使得信息变得精炼,但也使得模型的表达能力有了瓶颈,加上224x224的大小,这种小文字的识别其实是比较困难的。我们看下个例子。

样例:图表1

c036b91a5bb19e1ccfe4551cd26cca44.png

我们让模型自己问个问题。

Q: Give me several question about the figure
A: What is the percentage of survival for those with no adolescent treatment?

可以看到,模型提问的大致方向是可以的,比如存活率。但是图表中的Adjuvant Treatment却被识别成了adolescent treatment。这说明,模型有一定的OCR能力,但不多。尤其是对于这种比较小又不常见的文字,很容易识别错误。


样例:图表2

920ff59a8000461e0cc71f237f8fdc03.png

同样,先让模型自己问个问题。

C: Caption: Fig. 3. The hospitalization and ICU figures from our simulation.
Q: Give me several question about the figure

A: What is the population of the city?

自问自答一下。

C: Caption: Fig. 3. The hospitalization and ICU figures from our simulation.
Q: What is the population of the city?
A: NYC population 8 million.

从这里不难看出,模型其实对于常见的单词,即使图片比较小也能够很好地识别到。最后来个最难的。

Q: On day 20, approximately how many people were hospitalized?

A: 200, 000.

这个问题的要求其实挺高,需要模型根据坐标去推断数值,不出意外的回答错误了。


Limitation

首先,不可否认的是,这篇工作确实让我们的想象空间更多了,尤其是 Instructed Zero-shot Image-to-Text Generation 的能力,我觉得肯定还有没有发现的潜在能力。但我们从测试样例中也看到,模型还存在一些问题。在文章中,作者也给出了一些Bad Case,比如错误的建立联系,错误的推断依据以及过时的知识库。

435ae5d5a230a637bcb5f5173e64caa8.png

作者在文中对自己模型的不足主要解释为,首先,

However, our experiments with BLIP-2 do not observe an improved VQA performance when providing the LLM with in-context VQA examples. We attribute the lack of in-context learning capability to our pretraining dataset, which only contains a single image-text pair per sample.

由于图文数据集大多数是一对一的匹配,所以很难让模型建立上下文的联系。

其次,

BLIP-2's image-to-text generation could have unsatisfactory results due to various reasons including inaccurate knowledge from the LLM, activating the incorrect reasoning path, or not having up-to-date information about new image content.

这个主要是由于LLM模型本身局限决定的。

除了作者提到的几点,我觉得一下几点也是可以探索的:

  1. 细粒度的识别,由于图像的信息都浓缩在了32个Query中,所以能否识别细粒度信息以及图像中重要的位置信息就成了疑问;

  2. 更多的任务,BLIP2强大zero-shot能力,能不能应用在更多的任务上,多模态的类似VG,单模态的类似Classification。

  3. 当然从传感器与处理器的角度去看,其他模态(比如Audio)也可以拿个传感器去测,然后送给处理器分析分析hhh

当然,BLIP2的能力应该还远远没有被挖掘完,等有新的认识了再分享。

参考

[1] Junnan Li主页:

sites.google.com/site/junnanlics/

[2] 论文链接:

https://arxiv.org/abs/2301.12597

[3] 代码仓库:

https://github.com/salesforce/LAVIS/tree/main/projects/blip2

[4] HF上的Demo:

https://huggingface.co/spaces/Salesforce/BLIP2

[5] ITC代码:

https://github.com/salesforce/LAVIS/blob/3ac397aa075c3e60b9521b012dda3660e3e35f1e/lavis/models/blip2_models/blip2_qformer.py#L125

[6] ITM代码:

https://github.com/salesforce/LAVIS/blob/3ac397aa075c3e60b9521b012dda3660e3e35f1e/lavis/models/blip2_models/blip2_qformer.py#L160

[7] ITG代码:

https://github.com/salesforce/LAVIS/blob/3ac397aa075c3e60b9521b012dda3660e3e35f1e/lavis/models/blip2_models/blip2_qformer.py#L228

[8] GitHub:NielsRogge/Transformers-Tutorials: This repository contains demos I made with the Transformers library by HuggingFace.

编辑:于腾凯

校对:林亦霖

08cc406ccffebe03e12ac3cfef623611.png

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

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

相关文章

(多模态 / 多维度)特征融合

文章目录 模式分类中的特征融合方法引入现状 ( < 2017)算法基于贝叶斯理论的特征融合算法决策级水平融合(*)特征级水平融合 基于稀疏表示理论的特征融合算法基于深度学习的特征融合算法 偏传统的特征融合方法[^6]一些多模态特征融合的思路方法[^7]基于线性规划模型基于稀疏高…

学习笔记:多模态

1.多模态数据&#xff1a; 不同的存在形式或信息来源均可被称之为一种模态。由两种或两种以上模态组成的数据称之为多模态数据&#xff08;多模态用来表示不同形态的数据形式&#xff0c;或者同种形态不同的格式&#xff0c;一般表示文本、图片、音频、视频、混合数据&#xf…

多模态 跨模态|人机交互新突破!

我们对世界的认知和体验是多模式的&#xff0c;我们看向窗外&#xff0c;听到雨滴&#xff0c;闻到青草的味道&#xff0c;触摸到木板的纹理... 某种意义上来说&#xff0c;AI 就是赋予机器类人的感知和智慧&#xff0c;想要让 AI 理解我们周围的世界&#xff0c;它需要同时解释…

基于LLMs的多模态大模型(Visual ChatGPT,PICa,MM-REACT,MAGIC)

当LLMs已经拥有了极强的对话能力后&#xff0c;如何使其拥有视觉和语音等多模态能力是紧接而来的热点&#xff08;虽然GPT4已经有了&#xff09;&#xff0c;这个系列将不定期更新一些利用LLMs做多模态任务的文章。 直觉上&#xff0c;如果直接训练一个类似chatgpt架构的多模态…

2021年5月9日,是第108个母亲节,祝福所有的母亲节日快乐

2021年5月9日&#xff0c;是第108个母亲节&#xff0c;祝福所有的母亲节日快乐 2021年5月9日&#xff0c;是第108个母亲节&#xff0c;放下你手里的所有事情&#xff0c;哪怕是几分钟&#xff0c;给妈妈打一个电话吧&#xff0c;分享一下你最近的酸甜苦辣。 或许你忙到没有准备…

母亲节:向世界上最伟大的母爱致敬

在这世间众多的亲情关系中&#xff0c;有一种关系无与伦比&#xff0c;毫不费力地凌驾于其他任何已知的地球关系之上。这种非凡的关系就是母亲与子女之间的关系。 母亲对家庭无尽的爱、奉献和忠诚使这份感情无价。为了向全球所有母亲表示敬意&#xff0c;母亲节在世界46个国家庆…

原来程序员的母亲节可以这样温馨!

致我的可爱老妈 嗨&#xff0c;忙碌的程序员宝宝们&#xff0c;记得母亲节快要来了吗&#xff1f; 在老妈眼里&#xff0c;你一出生&#xff0c;她就觉得你是一个天才。无论你的代码写得多好看&#xff0c;老妈看不懂你的代码&#xff0c;在老妈的世界里&#xff0c;她会跳很带…

母亲节到了,写一个简单的C++代码给老妈送上一个爱心祝福

&#x1f34e; 博客主页&#xff1a;&#x1f319;披星戴月的贾维斯 &#x1f34e; 欢迎关注&#xff1a;&#x1f44d;点赞&#x1f343;收藏&#x1f525;留言 &#x1f347;系列专栏&#xff1a;&#x1f319; C/C专栏 &#x1f319;请不要相信胜利就像山坡上的蒲公英一样唾…

【母亲节快乐】程序员的表达方式,了解一下?

热门文章 原创教程 原创教程&#xff1a; 附加习题&#xff1a; 趣味职场 培训费用&#xff1a; 合作推广分割线

母亲节

母亲节 目录 母亲节&#xff08;Mothers Day&#xff09; 起源(origin) 习俗(habit&custom) 世界各国庆祝母亲节的时间都不尽相同 献给母亲的花(flowers to my mother) 名人称赞母亲的十大名言 母亲节&#xff08;Mothers Day&#xff09;   母亲节作为一个感谢 母亲的节…

母亲节祝福html源码,母亲节祝福html代码,母亲节表白妈妈代码,母亲节祝福网页代码

母亲节祝福html源码&#xff0c;母亲节祝福html代码&#xff0c;母亲节表白妈妈代码&#xff0c;母亲节祝福网页代码 运行截图 核心代码&#xff1a; <!DOCTYPE HTML> <html lang"zh-Hans"> <head><meta charset"utf-8"><meta…

母亲节到了,用Python给老妈写个祝福小程序~

母亲节就要到了&#xff0c;不知各位伙伴有没有给老妈准备礼物呢&#xff1f; 微信公众号原文链接 今天&#xff0c;小笨聪给大家分享一个母亲节祝福的小程序&#xff0c;就像情人节女神节这样的&#xff0c;下面让我们愉快的开始吧&#xff01; 我们先看一下效果&#xff1a; …

母亲节不能陪在妈妈身边,我用css和js给妈妈做了一个爱心飘落

写在前面&#xff1a; 我是「扬帆向海」&#xff0c;这个昵称来源于我的名字以及女朋友的名字。我热爱技术、热爱开源、热爱编程。技术是开源的、知识是共享的。 这博客是对自己学习的一点点总结及记录&#xff0c;如果您对 Java、算法 感兴趣&#xff0c;可以关注我的动态&am…

妇女节到了,祝福所有女神 Happy Women‘s Day!

在每年&#xff13;月&#xff18;日人们庆祝妇女节 &#xff37;omens Day is cllebrated on March 8 every year. 国际妇女节(IWD)&#xff0c;中国内地称“三八”国际劳动妇女节或国际劳动妇女节。是在每年的3月8日为庆祝妇女在经济、政治和社会等领域作出的重要贡献和取得…

简单的python小程序祝福母亲,母亲节快乐!

简单的python小程序祝福母亲&#xff0c;母亲节快乐&#xff01; 今天是星期天&#xff0c;也是母亲节&#xff0c; 不禁意识到二十二岁的我如此年轻&#xff0c;四十多岁的母亲似乎不再年轻。 今天编写了一个简单的python小程序。 代码如下&#xff0c;仅供参考。 import …

母亲节快乐!程序员们也不要忘记把这份礼品送给母亲

母亲节快乐&#xff08;Happy Mothers Day&#xff09; 母亲节快乐&#xff01; 在这个特别的日子里&#xff0c;让我们一起庆祝母亲节。母亲是世界上最伟大的人&#xff0c;她们无私地付出&#xff0c;照顾我们的成长和幸福。母亲节是一个特别的机会&#xff0c;让我们向妈妈…

母亲节送什么礼物?ChatGPT4给你最佳建议

母亲节就快来了&#xff0c;母亲节是一年一度的特别节日&#xff0c;我们可以借此机会表达我们对妈妈的感激之情。但是&#xff0c;对于我们来说&#xff0c;选择一份特别的礼物来表达我们的感激和爱意是一件很困难的事情。毕竟&#xff0c;我们的妈妈们已经给予我们无私的关爱…

今天女神节,用python画个贺卡送给母亲吧

今天女神节&#xff0c;你给女神妈妈准备了什么祝福呢&#xff1f;如果还没有&#xff0c;那么画个贺卡送给她吧&#xff0c;在你眼里&#xff0c;她是一个什么样的人呢&#xff1f; 是"可爱"&#xff0c;“温柔”&#xff0c;“美丽”&#xff0c;“漂亮”&#xf…

母亲节快到啦 咱们今天用 Python 提前送上特殊的 母亲节祝福 吧

母亲节快到啦&#xff0c;做儿女的自然要为母亲送上节日的祝福&#xff0c;如果自己在母亲身边的话&#xff0c;可以直接说几句祝福的话以及送一些小礼物什么的&#xff0c;要是不在母亲身边的话&#xff0c;可以打个电话问候一下。 相关文件 小伙伴们可以关注小编的Python源…

祝老妈母亲节快乐的三段小程序

今天是2020年5月10日——母亲节。又到了一年一度忧愁给麻麻送什么礼物的时候。钱少买不到好礼物&#xff0c;钱多又怕她说“净乱花钱&#xff01;[&#xff40;Д]老妈给你的生活费不想要了&#xff1f;” 作为一个没有实现财务自由的学生党&#xff0c;最好的方法就是榨取自己…