当前位置: 首页 > news >正文

3.11.样式迁移

样式迁移

​ 使用卷积神经网络,自动的将一个图像中的风格应用在另一图像之上,即样式迁移(style transfer)

​ 为了完成这一过程,我们需要两张输入图像:一张是内容图像,一张是风格图像,随后使用神经网络修改内容图像,使其在风格上接近风格图像。

在这里插入图片描述

1. 基于CNN的样式迁移

​ 奠基性工作

在这里插入图片描述

​ 首先初始化合成图像,例如将其初始化为内容图像,该合成图像是样式迁移过程中唯一需要更新的变量,即模型参数。随后选择一个预训练的卷积神经网络来抽取图像的特征,其中的模型参数在训练中无需更新。这个深度卷积神经网络用多个层逐级抽取图像的特征,可以选择其中某些层的输出作为内容特征或风格特征,例如上图中,有3个卷积层,第二层输出内容特征,第一层和第三层输出风格特征。

​ 接下来,通过前向传播(实线)计算损失函数,并通过反向传播(虚线)迭代模型参数,不断更新合成图像,样式迁移常用的损失函数由3部分组成:

  1. 内容损失使合成图像与内容图像在内容特征上接近
  2. 风格损失使合成图像与风格图像在风格特征上接近
  3. 全变分损失则有助于减少合成图像中的噪点

​ 最后,输出结果。

2. 代码实现

2.1 预处理和后处理

'''预处理和后处理'''rgb_mean = torch.tensor([0.485, 0.456, 0.406])
rgb_std = torch.tensor([0.229, 0.224, 0.225])#预处理函数对输入图像在RGB3个通道上分别作标准化,并将结果变换成卷积神经网络接受的输入格式
def preprocess(img, image_shape):transforms = torchvision.transforms.Compose([torchvision.transforms.Resize(image_shape),torchvision.transforms.ToTensor(),torchvision.transforms.Normalize(mean=rgb_mean, std=rgb_std)])return transforms(img).unsqueeze(0)#后处理函数将输出图像中的像素值还原回标准化之前的值,由于图像打印函数要求每个像素的浮点数值在0到1之间,则设置为边界
def postprocess(img):img = img[0].to(rgb_std.device)# 反标准化,乘上标准差加上方差img = torch.clamp(img.permute(1, 2, 0) * rgb_std + rgb_mean, 0, 1)# ToPILImage 将张量转换成PIL图像格式return torchvision.transforms.ToPILImage()(img.permute(2, 0, 1))

2.2 抽取图像特征

pretrained_net = torchvision.models.vgg19(weights=VGG19_Weights.IMAGENET1K_V1)# vgg19使用了5个卷积块,选择第四卷积快的最后一个卷积层作为内容层
# 因为越往上越全局,所以内容层尽量靠近输出,但样式有局部的也有全局的,所以都均匀取一下
style_layers, content_layers = [0, 5, 10, 19, 28], [25]# 只要到最高层之间的层数
net = nn.Sequential(*[pretrained_net.features[i] for i inrange(max(content_layers + style_layers) + 1)])# 保留内容层和风格层的输出
def extract_features(X, content_layers, style_layers):contents = []styles = []for i in range(len(net)):X = net[i](X)if i in style_layers:styles.append(X)if i in content_layers:contents.append(X)return contents, styles'''由于训练时无须改变预训练的VGG的模型参数,所以可以在训练开始之前就提取出内容特征和风格特征'''def get_contents(image_shape, device):content_X = preprocess(content_img, image_shape).to(device)contents_Y, _ = extract_features(content_X, content_layers, style_layers)return content_X, contents_Ydef get_styles(image_shape, device):style_X = preprocess(style_img, image_shape).to(device)_, styles_Y = extract_features(style_X, content_layers, style_layers)return style_X, styles_Y

2.3 损失函数

​ 由内容损失、风格损失核全变分损失3部分组成

内容损失

​ 内容损失通过平方误差函数衡量合成图像与内容图像在内容特征上的差异,平方误差函数的两个输入均为extract_features函数计算得到的内容层的输出

def content_loss(Y_hat, Y):# 我们从动态计算梯度的树中分离目标:# 这是一个规定的值,而不是一个变量。return torch.square(Y_hat - Y.detach()).mean()

风格损失

​ 为了表达风格层输出的风格,先通过extract_features函数计算风格层的输出。假设该输出的样本数为1,通道数为c,高和宽分别为h和w,我们可以将此输出转换为矩阵 X X X,其有 c c c行和 h w hw hw列,这个矩阵可以看作c个长度为 h w hw hw的向量 x 1 , ⋯ , x c x_1,\cdots,x_c x1,,xc组合而成的,其中向量 x i x_i xi代表了通道 i i i上的风格特征

​ 使用格拉姆矩阵来表示他们的相关性

在线性代数中,内积空间中一族向量 v 1 , ⋯ , v n v_1,\cdots ,v_n v1,,vn格拉姆矩阵(Gramian matrix、Gram matrix 或 Gramian)是内积的埃尔米特矩阵,其元素由 G i j = < v i , v j > G_{ij}=<v_i,v_j> Gij=<vi,vj>给出。

​ 即格拉姆矩阵中 i i i j j j列的元素 x i j x_{ij} xij即向量 x i x_i xi x j x_j xj的内积。需要注意的是,当 h w hw hw的值较大时,格拉姆矩阵中的元素容易出现较大的值,此外,格莱姆矩阵的高和宽皆为通道数 c c c,为了让风格损失不受这些值的大小影响,下面定义的gram函数将格拉姆矩阵除以了矩阵中元素的个数,即 c h w chw chw

def gram(X):#(批量大小,通道数,高,宽)num_channels, n = X.shape[1], X.numel() // X.shape[1]X = X.reshape((num_channels, n))return torch.matmul(X, X.T) / (num_channels * n)def style_loss(Y_hat, gram_Y):return torch.square(gram(Y_hat) - gram_Y.detach()).mean()

全变分损失

​ 有时合成图像中有大量高频噪点,即有特别亮或特别暗的颗粒像素,一种常见的去噪方法是全变分去噪(total variation denoising):

​ 假设 x i , j x_{i,j} xi,j表示坐标 ( i , j ) (i,j) (i,j)处的像素值,降低全变分损失
∑ i , j ∣ x i , j − x i + 1 , j ∣ + ∣ x i , j − x i , j + 1 ∣ \sum_{i,j}|x_{i,j}-x_{i+1,j}|+|x_{i,j}-x_{i,j+1}| i,jxi,jxi+1,j+xi,jxi,j+1
​ 能够尽可能使邻近的像素值相似

def tv_loss(Y_hat):return 0.5 * (torch.abs(Y_hat[:, :, 1:, :] - Y_hat[:, :, :-1, :]).mean() +torch.abs(Y_hat[:, :, :, 1:] - Y_hat[:, :, :, :-1]).mean())

损失函数

​ 计算三种损失的加权和,可通过调整权重超参数来调整相对重要性。

content_weight, style_weight, tv_weight = 1, 1e3, 10def compute_loss(X, contents_Y_hat, styles_Y_hat, contents_Y, styles_Y_gram):# 分别计算内容损失、风格损失和全变分损失contents_l = [content_loss(Y_hat, Y) * content_weight for Y_hat, Y in zip(contents_Y_hat, contents_Y)]styles_l = [style_loss(Y_hat, Y) * style_weight for Y_hat, Y in zip(styles_Y_hat, styles_Y_gram)]tv_l = tv_loss(X) * tv_weight# 对所有损失求和l = sum(10 * styles_l + contents_l + [tv_l])return contents_l, styles_l, tv_l, l

2.4 训练

class SynthesizedImage(nn.Module):#将合成的图像视为模型参数,所以前向传播只需返回模型参数即可def __init__(self, img_shape, **kwargs):super(SynthesizedImage, self).__init__(**kwargs)self.weight = nn.Parameter(torch.rand(*img_shape))def forward(self):return self.weightdef get_inits(X, device, lr, styles_Y):gen_img = SynthesizedImage(X.shape).to(device)#初始化为图像Xgen_img.weight.data.copy_(X.data)trainer = torch.optim.Adam(gen_img.parameters(), lr=lr)#风格图像在各个风格层的格拉姆矩阵styles_Y_gram将在训练前预先计算好。styles_Y_gram = [gram(Y) for Y in styles_Y]return gen_img(), styles_Y_gram, trainer'''训练模型'''
def train(X, contents_Y, styles_Y, device, lr, num_epochs, lr_decay_epoch):X, styles_Y_gram, trainer = get_inits(X, device, lr, styles_Y)scheduler = torch.optim.lr_scheduler.StepLR(trainer, lr_decay_epoch, 0.8)animator = d2l.Animator(xlabel='epoch', ylabel='loss',xlim=[10, num_epochs],legend=['content', 'style', 'TV'],ncols=2, figsize=(7, 2.5))for epoch in range(num_epochs):trainer.zero_grad()contents_Y_hat, styles_Y_hat = extract_features(X, content_layers, style_layers)contents_l, styles_l, tv_l, l = compute_loss(X, contents_Y_hat, styles_Y_hat, contents_Y, styles_Y_gram)l.backward()trainer.step()scheduler.step()if (epoch + 1) % 10 == 0:animator.axes[1].imshow(postprocess(X))animator.add(epoch + 1, [float(sum(contents_l)),float(sum(styles_l)), float(tv_l)])return Xdevice, image_shape = d2l.try_gpu(), (300, 450)
net = net.to(device)
content_X, contents_Y = get_contents(image_shape, device)
_, styles_Y = get_styles(image_shape, device)
output = train(content_X, contents_Y, styles_Y, device, 0.3, 500, 50)
d2l.plt.show()

相关文章:

3.11.样式迁移

样式迁移 ​ 使用卷积神经网络&#xff0c;自动的将一个图像中的风格应用在另一图像之上&#xff0c;即样式迁移(style transfer) ​ 为了完成这一过程&#xff0c;我们需要两张输入图像&#xff1a;一张是内容图像&#xff0c;一张是风格图像&#xff0c;随后使用神经网络修…...

Spring统一返回类型中关于String的问题

文章目录 1. 问题铺垫2. 解决方法3. 问题分析4 解决方法解释 1. 问题铺垫 首先设置了以下代码统一处理返回类型 ControllerAdvice public class ResponseAdvice implements ResponseBodyAdvice {Overridepublic boolean supports(MethodParameter returnType, Class converte…...

Python酷库之旅-第三方库Pandas(065)

目录 一、用法精讲 256、pandas.Series.sparse方法 256-1、语法 256-2、参数 256-3、功能 256-4、返回值 256-5、说明 256-6、用法 256-6-1、数据准备 256-6-2、代码示例 256-6-3、结果输出 257、pandas.DataFrame.sparse方法 257-1、语法 257-2、参数 257-3、功…...

Go语言标准库中的双向链表的基本用法

什么是二分查找区间&#xff1f; 什么是链表&#xff1f; 链表节点的代码实现&#xff1a; 链表的遍历&#xff1a; 链表如何插入元素&#xff1f; go语言标准库的链表&#xff1a; 练习代码&#xff1a; package mainimport ("container/list""fm…...

Cocos Creator2D游戏开发(9)-飞机大战(7)-爆炸效果

这个爆炸效果我卡在这里好长时间,视频反复的看, 然后把代码反复的测试,修改,终于给弄出来 视频中这段,作者也是修改了好几次, 跟着做也走了不少弯路; 最后反正弄出来了; 有几个坑; ① 动画体创建位置是enemy_prefab ② enemy_prefab预制体下不用放动画就行; ③ 代码中引用Anima…...

Redis入门概述

Redis 概述 Redis 是速度非常快的非关系型&#xff08;NoSQL&#xff09;基于内存的键值数据库。 键的类型只能为字符串&#xff0c;值可以支持五种数据类型&#xff1a;字符串&#xff08;stirng&#xff09;、列表&#xff08;list&#xff09;、集合(set)、散列表(hash)、有…...

Cursor搭配cmake实现C++程序的编译、运行和调试

Cursor搭配cmake实现C程序的编译、运行和调试 Cursor是一个开源的AI编程编辑器&#xff0c;开源地址https://github.com/getcursor/cursor &#xff0c;它其实是一个集成了Chat-GPT的VS Code。 关于VS Code和VS的对比可以参考这篇文章VS Code 和 Visual Studio 哪个更好&…...

读零信任网络:在不可信网络中构建安全系统09用户信任

1. 用户信任 1.1. 将设备身份和用户身份混为一谈会导致一些显而易见的问题 1.1.1. 特别是当用户拥有多台设备时&#xff0c;而这种情况很普遍 1.1.2. 应该针对不同类型的设备提供相匹配的凭证 1.1.3. 在存在共用终端设备的情况下&#xff0c;所有的这些问题将更加凸显 1.2…...

二叉树的实现 c语言

注&#xff1a;层序所需的队列文件请参考 C语言 实现栈(顺序表)和队列(链表)-CSDN博客 一、 BTree.h 函数包含&#xff1a; // 通过前序遍历的数组"ABD##E#H##CF##G##"构建二叉树 // 二叉树销毁 // 二叉树节点个数 // 二叉树叶子节点个数 // 二叉树第k层节点个数 /…...

【Git】如何优雅地使用Git中的tag来管理项目版本

目录 tagtag 和 branch区别操作命令打tag&#xff0c;当前分支标记tag提交到远程服务器删除本地tag删除远程tag切换到特定的tag查看所有tag查看标签详细信息 好书推荐 tag Git中的tag&#xff08;标签&#xff09;用于给项目在特定时间点&#xff08;某个版本发布&#xff09;…...

白骑士的PyCharm教学进阶篇 2.3 测试与自动化

系列目录 上一篇&#xff1a;白骑士的PyCharm教学进阶篇 2.2 高级调试技术 在现代软件开发中&#xff0c;测试和自动化是保证代码质量和项目稳定性的重要环节。PyCharm作为一款强大的Python IDE&#xff0c;提供了丰富的工具来支持单元测试和自动化测试。本篇将详细介绍单元测…...

spark写入redis报错空指针

aused by: java.lang.NullPointerException 1、spark集群 每个executor是否 与redis集群 网络策略是否通 2、写入redis的数据是否 有 null值 需要把null值 转成空字符串 3、可以用 pipleline 并行写数据...

【Material-UI】Autocomplete中的禁用选项:Disabled options

文章目录 一、简介二、基本用法三、进阶用法1. 动态禁用2. 提示禁用原因3. 复杂的禁用条件 四、最佳实践1. 一致性2. 提供反馈3. 优化性能 五、总结 Material-UI的Autocomplete组件提供了丰富的功能&#xff0c;包括禁用特定选项的能力。这一特性对于限制用户选择、提供更好的用…...

力扣287【寻找重复数】

给定一个包含 n 1 个整数的数组 nums &#xff0c;其数字都在 [1, n] 范围内&#xff08;包括 1 和 n&#xff09;&#xff0c;可知至少存在一个重复的整数。 假设 nums 只有 一个重复的整数 &#xff0c;返回 这个重复的数 。 你设计的解决方案必须 不修改 数组 nums 且只用常…...

学习笔记一

vector 在创建时指定初始大小和初始值&#xff1a; vector<int> a(5, 1) // 包含 5 个整数的 vector&#xff0c;每个值都为 1 可以使用 push_back 方法向 vector 中添加元素&#xff1a; a.push_back(7) // 将整数 7 添加到 vector 的末尾 可以使用 size(…...

星纪魅族双轮驱动遇阻:AI手机与造车梦能否照进现实?

在科技行业风起云涌的浪潮中&#xff0c;星纪魅族近期的一系列动作引起了广泛关注。从高层换血到全面押注AI&#xff0c;再到宣布造车计划&#xff0c;每一步都显得雄心勃勃&#xff0c;但深入剖析后不难发现&#xff0c;其未来发展之路实则布满荆棘。 星纪魅族选择“All in AI…...

深入理解 C 语言中的联合体

目录 引言 一、 联合体的定义与基本用法 1.联合体的定义 2.基本用法 二、 联合体与结构体的区别 1.结构体 2.联合体 3.对比 三、联合体的优势 1. 节省内存 2. 提高效率 3. 代码简洁性 四、联合体的存储细节 1.内存对齐 2.大小计算 五、联合体的高级用法 1.匿…...

Unity3D 物体圆周运动

Unity3D 实现一个 2D 物体沿着圆周进行运动。 物体圆周运动 前段时间在开发一个小游戏时&#xff0c;需要实现火箭沿着一个圆形轨道进行圆周运动。 以前面试的时候也被问到过这类问题&#xff08;如何让一个 2D 物体做圆周运动&#xff09;&#xff0c;所以还是记录一下实现…...

无人机无人车固态锂电池技术详解

随着无人机和无人车技术的飞速发展&#xff0c;对高性能、高安全性电池的需求日益迫切。固态锂电池作为下一代电池技术的代表&#xff0c;正逐步从实验室走向市场&#xff0c;为无人机和无人车等应用领域带来革命性的变化。相比传统液态锂电池&#xff0c;固态锂电池在能量密度…...

策略模式的一次应用

项目的需求是将一组图像按照相似度分类。 采用了模板匹配计算相似度的实现方式。 #include <opencv2/core.hpp> #include <openev2/core/utility.hpp> #include <opencv2/highqui.hpp> #include <openav2/imgproc.hpp> cv::Mat image matched; double …...

终极指南:3D 数据科学系统和工具

该蓝图分享了 AI 方法、算法、工具、模板和 6 步系统&#xff0c;用于为 3D 模型构建数据科学解决方案&#xff1a;3D 数据采集、分析、建模、可视化和部署。 ​ 3D 数据科学系统的核心组件和交叉学科 欢迎来到雲闪世界。建立 3D 数据科学项目涉及结合数据工程、数据分析和可视…...

Docker Container(容器)

一、概念 容器是镜像的运行实体。镜像是静态的只读文件&#xff0c;而容器带有运行时需要的可写文件层&#xff0c;并且容器中的进程属于运行状态。即容器运行着真正的应用进程。容器有初建、运行、停止、暂停和删除五种状态。 虽然容器的本质是主机上运行的一个进程&#xf…...

确保Apache Flink流处理的数据一致性和可靠性

Apache Flink是一个用于大规模数据流处理的开源框架&#xff0c;它提供了多种机制来保证在分布式环境中数据的一致性和可靠性。在实时流处理中&#xff0c;数据的一致性和可靠性是至关重要的&#xff0c;因为它们直接影响到数据处理结果的准确性和系统的稳定性。本文将详细介绍…...

MUSE Multi-View Contrastive Learningfor Heterophilic Graphs

发表于:CIKM 推荐指数: #paper/⭐ 一句话总结:融合了GCN(A,X)和GCN(A,I),创新性不足,因此只能B会 流程: 融合部分: h i f h i s λ i h i c h_i^fh_i^s\lambda_ih_i^c hif​his​λi​hic​ 由于有n个 λ \lambda λ.因此作者加了如下优化: L ϕ ∑ i 1 N λ i s ( h i …...

搭建pxe网络安装环境实现服务器自动部署

一&#xff1a;主机查看本地镜像挂载的位置 [rootnginx ~]# df [rootnginx ~]# cd /rhe17 [rootnginx rhe17]# ls [rootnginx rhe17]# cd isolinux/ [rootnginx isolinux]# ls文件内容指定了触法镜像&#xff0c;内核&#xff0c;显示界面等 二&#xff1a;通过网络将以上文件…...

在VScode中导入conda环境的记录【原创】

今天在vscode编辑器中运行一个python代码&#xff0c;发现终端可以运行&#xff0c;但是编辑器中点击Run会显示缺包&#xff0c;但是python包明明是有的&#xff0c;在自己的conda环境中。后来发现&#xff0c;是vscode没有发现我自己创建的conda环境&#xff0c;在vscode中导入…...

机器学习 第10章-降维与度量学习

机器学习 第10章-降维与度量学习 10.1 k近邻学习 k近邻(k-Nearest Neighbor,简称kNN)学习是一种常用的监督学习方法其工作机制非常简单:给定测试样本&#xff0c;基于某种距离度量找出训练集中与其最靠近的k个训练样本&#xff0c;然后基于这k个“邻居”的信息来进行预测。通…...

手机三要素接口怎么对接呢?(二)

一、什么是手机三要素&#xff1f; 手机三要素又叫运营商三要素&#xff0c;运营商实名认证&#xff0c;运营商实名核验&#xff0c;手机三要素实名验证&#xff0c;手机三要素实名核验&#xff0c;每个人的称呼都不同&#xff0c;但是入参和出参是一样的。 输入姓名、身份证…...

【Devops】CertD 完全免费、自动申请、自动部署SSL证书一站式管理工具 | 自动化HTTPS | 3个月SSL自动轮换

CertD CertD 是一个免费全自动申请和自动部署更新SSL证书的工具。 后缀D取自linux守护进程的命名风格&#xff0c;意为证书守护进程。 关键字&#xff1a;证书自动申请、证书自动更新、证书自动续期、证书自动续签 一、特性 本项目不仅支持证书申请过程自动化&#xff0c;还…...

高级Vue.js面试指南:关键概念、最佳实践和性能优化策略

目录 1. 什么是 Vue.js? 2. Vue的生命周期钩子是什么? 3. 计算属性和侦听器有什么区别? 4. 什么是虚拟DOM? 5. 解释 Vue 的响应式系统原理。 6. Vue中的v-if和v-show有什么区别? 7. 如何在 Vue 中使用路由? 8. 描述组件间的通信方式。 9. 什么是单文件组件? 10…...

MySQL基础练习题21-按日期分组销售产品

目录 题目 准备数据 分析数据 总结 题目 找出每个日期、销售的不同产品的数量及其名称。每个日期的销售产品名称应按词典序排列。 返回按 sell_date 排序的结果表。 准备数据 ## 创建库 create database db; use db;## 创建表 Create table If Not Exists Activities (s…...

oracle(19c)用户管理

简介 本文介绍 Oracle 中的用户管理&#xff0c;包含以下内容&#xff1a; 概念介绍 系统用户 解锁 hr 用户 创建用户 用户相关案例 使用 Profile 管理用户口令 Oracle 的认证方式 重置管理员(sys)密码 1. 概念介绍 使用前可以自行安装oracle数据库 oracle19c安装&a…...

数学建模--禁忌搜索

目录 算法基本原理 关键要素 应用实例 实现细节 python代码示例 总结 禁忌搜索算法在解决哪些具体类型的组合优化问题中最有效&#xff1f; 禁忌搜索算法的邻域结构设计有哪些最佳实践或案例研究&#xff1f; 如何动态更新禁忌表以提高禁忌搜索算法的效率和性能&#…...

RabbitMQ动态创建生产者动态创建消费者

生产者 controller package org.log.rabbitmqdemo1.demos.web.producer;import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;RestController public class Produc…...

HTML-07.表格标签

一、要制作的表格如下 二、代码如下 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>表格标签<…...

[Git][分支管理][下]详细讲解

目录 1.合并冲突2.分支管理策略3.分支策略1.基本原则2.bug分支3.删除临时分支 1.合并冲突 在实际分⽀合并的时候&#xff0c;有时候可能会遇到代码冲突的问题&#xff0c;例如&#xff1a; dev分支在写一部分代码&#xff0c;而master分支也没闲着&#xff0c;也在写着同一份代…...

Python面试宝典第27题:全排列

题目 给定一个不含重复数字的数组nums&#xff0c;返回其所有可能的全排列 。备注&#xff1a;可以按任意顺序返回答案。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1]] 示例 2&#xff1a; 输…...

C语言调试宏全面总结(六大板块)

C语言调试宏进阶篇&#xff1a;实用指南与案例解析C语言调试宏高级技巧与最佳实践C语言调试宏的深度探索与性能考量C语言调试宏在嵌入式系统中的应用与挑战C语言调试宏在多线程环境中的应用与策略C语言调试宏在并发编程中的高级应用 C语言调试宏进阶篇&#xff1a;实用指南与案…...

C++学习之路(1)— 第一个HelloWorld程序

C学习之路&#xff08;1&#xff09;— 第一个HelloWorld程序 一、前言 C在C语言的基础上添加了对面向对象编程和泛型编程的支持&#xff0c;在 20世纪90年代便是最重要的编程语言之一&#xff0c;并在21世纪仍保持强劲势头。C继承了C语言高效、简洁、快速和可移植性的传统。 …...

Ionic 滑动框:实现高效移动应用交互体验

Ionic 滑动框:实现高效移动应用交互体验 Ionic 是一个强大的开源框架,用于构建高性能、高质量的移动端和网页应用。它以其优雅的UI组件和强大的功能而闻名,其中滑动框(Slider)是Ionic UI组件库中的一个重要组成部分。滑动框提供了一种直观、互动的方式来展示图片、文本或…...

书生大模型实战营第三期——入门岛

第一关&#xff1a;Linux基础知识 任务如下&#xff1a; 任务描述闯关任务完成SSH连接与端口映射并运行hello_world.py可选任务 1将Linux基础命令在开发机上完成一遍可选任务 2使用 VSCODE 远程连接开发机并创建一个conda环境可选任务 3创建并运行test.sh文件 1. 使用密码进行…...

Android入门之路 - WebView加载数据的几种方式

之前客户端加载H5时遇到了一些问题&#xff0c;我为了方便解决问题&#xff0c;所以将对应场景复刻到了Demo中&#xff0c;从之前的网络加载模拟为了本地加载Html的方式&#xff0c;但是没想到无意被一个基础知识点卡了一些时间&#xff0c;翻看往昔笔记发现未曾记录这种基础场…...

git的rebase 和 merge 的区别

rebase 和 merge 的区别 Merge&#xff08;合并&#xff09;和 Rebase&#xff08;变基&#xff09;是 Git 中两种常用的分支整合方式&#xff0c;它们有不同的工作原理和适用场景&#xff1a; Merge&#xff08;合并&#xff09;&#xff1a; ● Merge 操作将两个分支的不同提…...

科普文:JUC系列之Java中7种阻塞队列BlockingQueue的双锁源码解读

概叙 Queue接口与List、Set同一级别&#xff0c;都是继承了Collection接口**。队列是一种数据结构&#xff0e;它有两个基本操作&#xff1a;在队列尾部加人一个元素&#xff0c;和从队列头部移除一个元素&#xff0c;队列以一种先进先出的方式管理数据。 队列分为两种&#x…...

Kafka生产者(二)

1、生产者消息发送流程 1.1 发送原理 在消息发送的过程中&#xff0c;涉及到了两个线程——main 线程和 Sender 线程。在 main 线程中创建了一个双端队列 RecordAccumulator。main 线程将消息发送给 RecordAccumulator&#xff0c;Sender 线程不断从 RecordAccumulator 中拉取…...

ReentrantLock源码分析

文章目录 一、AQS1、state属性2、等待队列3、条件变量 二、ReentrantLock1、非公平锁实现原理1.1 获取锁1.2 释放锁1.3 可重入原理1.4 可打断原理不可打断可打断 1.5 公平锁实现原理1.6 条件变量原理awaitsignal 一、AQS AQS全称是 AbstractQueuedSynchronizer&#xff0c;是阻…...

(四十一)大数据实战——spark的yarn模式生产环境部署

前言 Spark 是一个开源的分布式计算系统。它提供了高效的数据处理能力&#xff0c;支持复杂的数据分析和处理任务&#xff0c;是一种基于内存的快速、通用、可扩展的大数据分析计算引擎。Spark Core&#xff1a;实现了Spark的基本功能&#xff0c;包含任务调度、内存管理、错误…...

反转链表 II(LeetCode)

题目 给你单链表的头指针 和两个整数 和 &#xff0c;其中 。请你反转从位置 到位置 的链表节点&#xff0c;返回 反转后的链表 。 解题 class ListNode:def __init__(self, value0, nextNone):self.value valueself.next nextdef reverseBetween(head: ListNode, lef…...

Spring Boot 整合 Dubbo3 + Nacos 2.4.0

准备工作&#xff1a;Nacos 一、前置工作 安装Nacos&#xff0c;参考&#xff1a;Nacos 快速开始 此次安装 Nacos 最新版本&#xff1a;2.4.0 单机版 安装教程&#xff1a;Linux 安装 nacos 2.4.0-CSDN博客 二、创建配置文件 创建命名空间 新增配置文件 dubbo:application:i…...

力扣-200.岛屿数量

刷力扣热题–第二十四天:200.岛屿数量 新手第二十四天 奋战敲代码&#xff0c;持之以恒&#xff0c;见证成长 1.题目描述 2.题目解答 这道题刚开始想的确实想的绞尽脑汁的&#xff0c;看了相关解答才明白的&#xff0c;三种方法&#xff0c;这里想先用两种方法进行实现&#…...