2024年11月

来源:晓飞的算法工程笔记 公众号,转载请注明出处

论文: CLIP Adaptation by Intra-modal Overlap Reduction

创新点


  • 提出一种基于轻量级适配的新方法,直接在图像空间中减少
    CLIP
    中的模态内重叠(
    IMO
    )。新特征与任何利用缓存模型的无训练方法兼容,这些新特征提高了所有被检查的无训练方法的整体性能。
  • 表明直接减少模态内重叠(
    IMO
    )与性能之间存在正相关关系。
  • 探索了通过在监督和自监督方式下训练轻量级适配器来减少模态内重叠(
    IMO
    )的可能性。

内容概述


许多方法尝试将预训练的基础
CLIP
模型适应于少样本分类,因为
CLIP
在大规模语料库上进行训练,它能够通过适应少样本分类而具有良好的泛化能力。但当尝试在与预训练数据的分布差异显著的数据集上使用这一基础模型时,观察到性能并不理想。

论文分析了图像空间内的模态重叠,从嵌入表示的角度出发。由于对比训练最大化了配对图像和文本之间的余弦相似性(跨模态),而忽略了图像与图像之间的相似性(模态内),在图像空间中比较来自
CLIP
的嵌入是有问题的。这导致了非配对(不同类别的图像)和配对图像(同一类别的图像)之间存在显著的模态内重叠(
IMO
),这影响了依赖于图像空间相似性进行预测的少样本无训练分类方法的性能。

为了解决模态内的重叠,在
Google Open Images
数据集的通用样本集上训练一个轻量级适配器。只需训练一个
epoch
,即可提高少样本无训练分类的准确性。

通过广泛的证明了其有效性,减少模态内重叠可以带来 a ) 在多个标准数据集上提高性能,b ) 增强对分布变化的鲁棒性,以及 c ) 提高特征方差,使特征在下游任务中更具区分能力。

模态内重叠


模态内重叠分析

由于对比学习最大化了成对图像与文本之间的余弦相似度(模态间),但忽略了图像与图像之间的相似度(模态内),导致模态内重叠(
IMO
)。

通过适应校正模态内重叠(
IMO

为了在
CLIP
视觉编码器中校正模态内重叠(
IMO
),引入了瓶颈适配器并在来自
Google Open Images
数据集的小样本图像上以监督方式进行微调。适配器是轻量级组件,向模型中添加了
0.80%
(大约
1M
)的新参数。

微调得到新的
CLIP
视觉编码器(
VEimo
)后,利用它创建一个改进的缓存模型,类似于
Tip-Adapter
。使用校正了
IMO
的编码
N
个类别各
K
张的训练图像
\(G_{train} \in \mathbb{R}^{NK\times d}\)
,将这些编码作为键,它们对应的
one-hot
编码标签
\(L_k, k \in \{1, NK\}\)
作为值,以形成键值缓存模型,目的是增强
CLIP
模型的先验知识。

给定一个通过
VEimo
编码的测试图像
\(U_i \in \mathbb{R}^{d}\)

Affinity
矩阵
\(Y\)

Tip-Adapter
++(
TA
++)的对数计算如下(用于
softmax
标签预测):

\[\begin{equation}
Y = exp(-\beta(1-U_i G_{train}^T)), Y \in \mathbb{R}^{NK}
\label{eq:ta_affinity_modgap}
\end{equation}
\]

\[\begin{equation}
\text{TA++logits} = T_i W^T + \alpha YL_{train}, \text{TA++logits} \in \mathbb{R}^{N}
\end{equation}
\]

同样,通过用校正后的
IMO
矩阵
\(Y\)
替换标准
Tip-X
的亲和矩阵
\(A\)
来改进标准
Tip-X
,从而获得
Tip-X
++(
TX
++)的对数值(用于
softmax
标签预测):

\[\begin{equation}
\text{TX++logits} = T_i W^T + \alpha YL_{train} + \gamma \phi(-M) L_{train}, \text{TX++logits} \in \mathbb{R}^{N}
\end{equation}
\]

主要实验



如果本文对你有帮助,麻烦点个赞或在看呗~
更多内容请关注 微信公众号【晓飞的算法工程笔记】

work-life balance.

本博客所有文章除特别声明外,均采用
CC BY-NC-SA 4.0
许可协议。转载请注明来自
唯你

简介

cargo deny 是一个 Rust 工具,用于检查项目依赖项的许可证、安全性和其他合规性问题。在 Rust CI(持续集成)中,cargo deny 扮演着重要角色:

  • 许可证检查:
    确保项目使用的所有依赖项的许可证都符合项目的许可政策。
  • 安全漏洞扫描:
    检查依赖项是否存在已知的安全漏洞。
  • 依赖项合规性:
    验证依赖项是否符合项目的其他要求,如版本限制或来源限制。
  • 禁用特定依赖项:
    允许明确禁止使用某些依赖项。

在 CI 流程中,cargo deny 通常作为一个检查步骤运行,以确保项目在构建和部署之前满足所有合规性要求。这有助于维护项目的质量、安全性和法律合规性。

一句话:
cargo deny 让你合法合规放心使用第三方依赖

使用

cargo install --locked cargo-deny && cargo deny init && cargo deny check

常见错误

使用 cargo-deny 报错 failed to open advisory database

   Installed package `cargo-deny v0.16.1` (executable `cargo-deny.exe`)
PS E:\Rust\easy-publish> cargo deny check
2024-11-11 02:07:34 [ERROR] failed to fetch advisory database https://github.com/RustSec/advisory-db: An IO error occurred when talking to the server: error sending request for url (https://github.com/RustSec/advisory-db/info/refs?service=git-upload-pack)

方案一: 可以尝试:
1.  删除 ~/.cargo/advisory-db/ 目录,然后使用 cargo deny fetch / cargo deny check 重新下载它。多试几次?
2.  在 deny.toml 配置中的 git 地址修改为 gitee 上的镜像地址:
https://gitee.com/tyr-rust-bootcamp-mirror/advisory-db.git
3.  删掉 deny.toml,执行 cargo deny init 重新生成一个,然后按照你的需要修改。
4.  检查你的网络,想办法~

方案二:可以尝试通过运行:cargo deny check advisories 解决

升级最新版本,大量 this key has been removed

image.png
解决办法:

  1. 先删除原项目下的 deny.toml 配置文件
  2. 在项目根目录下运行命令行
    cargo deny init
    重新生成一份新版本 deny.toml 文件
  3. 在 deny.toml 中找到 allow 然后将原来 allow 中许可证,类似如下代码,拷贝到新 deny.toml 中即可
allow = [
    "MIT",
    "Apache-2.0",
    "Apache-2.0 WITH LLVM-exception",
    "Unicode-DFS-2016",
    "MPL-2.0",
    "BSD-2-Clause",
    "BSD-3-Clause",
    "ISC",
    "CC0-1.0",
    "OpenSSL",
]
  1. 运行
    cargo deny check
    重新检测一波,是否正常

前言

深度学习技术的不断发展,神经网络在各个领域得到了广泛应用。为了满足 .NET 开发的需求,推荐一款使用 C# 编写的神经网络计算图框架。

框架的使用方法接近 PyTorch,提供了丰富的示例和详细的文档,帮助大家快速上手。

框架介绍

项目完全使用 C# 编写,提供了一个透明的神经网络计算图框架。用户可以查看和理解框架内部的任何实现细节。

框架支持多种网络结构,包括卷积神经网络(CNN)、反向传播网络(BP)、全连接网络(FCN)、长短期记忆网络(LSTM)、卷积长短期记忆网络(ConvLSTM)和门控循环单元网络(GRU)。

每个示例都附带了所需的数据内容,确保用户能够快速上手并进行实验。

使用说明

  • 损失函数支持
    :MESLOSS、交叉熵损失 (Cross-Entropy)
  • 激活函数支持
    :ReLU、Tanh、Sigmoid、Softmax
  • 数据类型支持
    :二维数据 float[][] 和四维数据 float[][][,]
  • 池化支持
    :平均池化、最大池化
  • 其他支持
    :卷积层 (ConvLayer)、二维卷积层 (Conv2DLayer)、乘法层 (MulLayer)、转置卷积层 (ConvTranspose2DLayer)

部分代码示例

//声明两个ConvLayer 和一个激活函数SigmodLayer
ConvLayer cl1 = new ConvLayer(13, 5, true);

SigmodLayer sl
= newSigmodLayer();float lr = 0.5f;
ConvLayer cl2
= new ConvLayer(5, 1, true);int i = 0,a=0;while (a < 5000)
{
dynamic ff =cl1.Forward(x);
ff
=sl.Forward(ff);
ff
=cl2.Forward(ff);//计算误差 MSELoss mloss = newMSELoss();var loss =mloss.Forward(ff, y);

Console.WriteLine(
"误差:" +loss);dynamic grid =mloss.Backward();//反传播w2 dynamic w22 =cl2.backweight(grid);//反传播W1 dynamic grid1 =cl2.backward(grid);
grid1
=sl.Backward(grid1);dynamic w11 =cl1.backweight(grid1);//更新参数 cl2.weights =Matrix.MatrixSub(cl2.weights, Matrix.multiply(w22.grid, lr));
cl2.basicData
=Matrix.MatrixSub(cl2.basicData, Matrix.multiply(w22.basic, lr));

cl1.weights
=Matrix.MatrixSub(cl1.weights, Matrix.multiply(w11.grid, lr));
cl1.basicData
=Matrix.MatrixSub(cl1.basicData, Matrix.multiply(w11.basic, lr));
i
++;

a
++;
}

BP网络运行图

CNN网络95%识别成功率

lstm网络预测PM2.5空气质量

项目地址

Gitee:
https://gitee.com/UDCS/WeaveAI

最后

如果你觉得这篇文章对你有帮助,不妨点个赞支持一下!你的支持是我继续分享知识的动力。如果有任何疑问或需要进一步的帮助,欢迎随时留言。

也可以加入微信公众号
[DotNet技术匠]
社区,与其他热爱技术的同行一起交流心得,共同成长!
优秀是一种习惯,欢迎大家留言学习!

1、TLS 1.0 已启用

描述:

此 Web 服务器支持通过 TLS 1.0 加密。TLS 1.0 不被认为是“强密码术”。根据 PCI 数据安全标准 3.2(.1) 的定义和要求,在保护从网站往返的敏感信息时,TLS 1.0 并不被认为是 "强加密"。根据 PCI,"2018 年 6 月 30 日是禁用 SSL/早前 TLS 并实施更安全的加密协议 TLS 1.1 或更高版本(强烈建议 TLS v1.2) 的最后期限,以便满足 PCI 数据安全标准 (PCI DSS),保障支付数据的安全。

影响:

攻击者可能能够利用此问题实施中间人攻击,以及解密受影响的服务与客户端之间的通信。

推荐 :

建议禁用 TLS 1.0 并替换为 TLS 1.2 或更高版本。

解决方法:

Nginx 配置 TLSv1.2 或 TLSv1.3

首先查看openssl版本:

 openssl version

 # 输出
 OpenSSL 1.0.2k-fips  26 Jan 2017
 
 #Linux Centos7.9默认为以上版本, OpenSSL 1.1.1 及以上版本才支持TLS v1.3。

检测是否支持TLS1.2

openssl s_client -connect xxxx.xxx.com.cn:443 -tls1_2

Nginx配置:

ssl_protocols TLSv1.2; 
# 这里只使用1.2即可

# ssl_protocols TLSv1.2 TLSv1.3;

2、Nginx访问静态页面显示目录列表

描述:

目录列表是一个 Web 服务器功能,在特定网站目录中无索引文件时显示目录内容。Web 服务器上保 持此功能开启会导致信息泄露,因此相当危险。

影响:

用户可以从受影响的目录查看所有文件的列表,这可能会暴露敏感信息。

例如:

解决:

Nginx中默认不会开启目录浏览功能,若发现当前已开启该功能,可以编辑
nginx.conf
文件,删除如下两行:

autoindex on;
autoindex_exact_size on;

重启Nginx。

3、未实施 HTTP 严格传输安全 (HSTS)

描述:

HTTP 严格传输安全 (HSTS) 规定,浏览器只能使用 HTTPS 访问网站。检测到您的 Web 应用程序未实 施 HTTP 严格传输安全 (HSTS),因为响应中缺少严格传输安全报头。

影响:

HSTS 可以用于预防和/或缓解某些类型的中间人 (MitM) 攻击

解决:

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";
add_header Strict-Transport-Security  'max-age=63072000; includeSubDomains; preload';
#或者
add_header X-Frame-Options SAMEORIGIN always;
add_header Strict-Transport-Security  'max-age=63072000; includeSubDomains; preload' always;


# max-age=31536000 指定了 HSTS 策略的有效期,这里是一年。您可以根据需求调整有效期。
# includeSubDomains 表示 HSTS 策略将适用于所有的子域名。

4、未实施内容安全策略 (CSP)

描述:

内容安全策略 (CSP) 增加了额外的安全层,有助于检测和缓解某些类型的攻击,包括跨站脚本 (XSS) 和数据注入攻击。 内容安全策略 (CSP) 可通过添加 Content-Security-Policy 报头实施。此报头的值是一个字符串,其中 13 包含描述内容安全策略的策略指令。要实施 CSP,您应该为站点使用的所有资源类型定义允许的来源列表。例如,如果您有一个简单的站点,需要从 CDN 加载本地托管和 jQuery 库中的脚本、样式表和 图像,则 CSP 报头可能如下所示: Content-Security-Policy: default-src 'self'; script-src 'self'
https://code.jquery.com
; 检测到您的 Web 应用程序未实施内容安全策略 (CSP),因为响应中缺少 CSP 报头。建议在您的 Web 应 用程序中实施内容安全策略 (CSP)。

影响:

CSP 可用于预防和/或缓解涉及内容/代码注入的攻击,例如跨站脚本/XSS 攻击、需要嵌入恶意资源的 攻击、涉及恶意使用 iframe 的攻击(例如点击劫持攻击)等。

推荐 :

建议在您的 Web 应用程序中实施内容安全策略 (CSP)。配置内容安全策略涉及添加 Content-SecurityPolicy HTTP 报头到 Web 页面并为其赋值,以控制允许用户代理为该页面加载的资源。

解决:

在nginx配置文件中添加请求头
Content-Security-Policy

# 添加 CSP 头部
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline';";

default-src 'self': 指定默认允许加载资源的来源为当前域名('self'),这是一个基本的设置,确保只有当前网站的资源可以加载。
script-src 'self' 'unsafe-inline' 'unsafe-eval': 指定允许加载 JavaScript 的来源为当前域名,并允许内联脚本和使用 eval() 等不安全的 JavaScript 执行方式。注意,'unsafe-inline' 和 'unsafe-eval' 存在安全风险,建议尽量避免使用,而是优先考虑使用严格的 CSP 策略,如使用外部脚本加载方式。
style-src 'self' 'unsafe-inline': 指定允许加载样式表的来源为当前域名,并允许内联样式。同样地,'unsafe-inline' 也应该尽量避免使用,可以通过外部 CSS 文件加载来提高安全性。

# 根据以上信息,添加以下代码
# 添加 CSP 头部
add_header Content-Security-Policy "default-src 'self'; script-src 'self' https://xxx.xxxx.com.cn; style-src 'self' https://xxx.xxx.com.cn cdn.jsdelivr.net ; img-src 'self' https://xxx.xxx.com.cn data:; font-src 'self' data: https://xxx.com cdn.jsdelivr.net;";

#多个地址以空格后面拼接即可


title: Nuxt.js 应用中的 vite:extend 事件钩子详解
date: 2024/11/11
updated: 2024/11/11
author:
cmdragon

excerpt:
vite:extend 钩子允许开发者在 Vite 项目中扩展默认开发和构建配置。这使得开发者能够根据特定需求自定义 Vite 的行为,增强开发体验。

categories:

  • 前端开发

tags:

  • Nuxt
  • Vite
  • 钩子
  • 插件
  • 构建
  • 开发
  • 自定义


image
image

扫描
二维码
关注或者微信搜一搜:
编程智域 前端至全栈交流与成长

目录

  1. 概述
  2. vite:extend
    钩子的详细说明
      1. 钩子的定义与作用
      1. 调用时机
      1. 参数说明
  3. 具体使用示例
      1. 示例:基本用法
      1. 示例:添加插件
  4. 应用场景
      1. 自定义 Vite 插件
      1. 调整构建配置
      1. 动态修改开发服务器设置
  5. 注意事项
      1. 效能影响
      1. 版本兼容性
  6. 总结

1. 概述

vite:extend
钩子允许开发者在 Vite 项目中扩展默认开发和构建配置。这使得开发者能够根据特定需求自定义 Vite 的行为,增强开发体验。

2.
vite:extend
钩子的详细说明

2.1 钩子的定义与作用

vite:extend
钩子用于扩展 Vite 的上下文配置。通过这个钩子,开发者可以增加额外的配置、插件或其他需要的功能来满足项目需求。

2.2 调用时机

vite:extend
钩子通常是在 Vite 特定的配置阶段调用,这通常在 Vite 的插件阶段和构建阶段之间。这确保了所有附加的配置在构建或启动开发服务器之前生效。

2.3 参数说明

这个钩子通常接收一个
viteBuildContext
对象,该对象包含 Vite 的默认上下文和配置,允许开发者在其基础上进行修改。

3. 具体使用示例

3.1 示例:基本用法

// plugins/viteExtend.js
export default defineNuxtPlugin((nuxtApp) => {
  nuxtApp.hooks('vite:extend', (viteBuildContext) => {
    // 示例:改变 root 目录
    viteBuildContext.config.root = 'src';
  });
});

在这个示例中,我们修改了
viteBuildContext
中的根目录配置,以使其指向
src
目录。

3.2 示例:添加插件

// plugins/viteAddPlugin.js
import { defineConfig } from 'vite';
import somePlugin from 'some-vite-plugin';

export default defineNuxtPlugin((nuxtApp) => {
  nuxtApp.hooks('vite:extend', (viteBuildContext) => {
    viteBuildContext.config.plugins.push(somePlugin());
  });
});

在这个示例中,我们向 Vite 的配置中添加了一个新的插件
somePlugin

4. 应用场景

4.1 自定义 Vite 插件

使用
vite:extend
钩子,可以向 Vite 添加自定义插件,例如针对特定功能进行处理。

// plugins/customPlugin.js
import { defineConfig } from 'vite';

export default defineNuxtPlugin((nuxtApp) => {
  nuxtApp.hooks('vite:extend', (viteBuildContext) => {
    viteBuildContext.config.plugins.push({
      name: 'my-custom-plugin',
      transform(code, id) {
        // 插件逻辑
        return code.replace(/console.log/g, 'console.warn');
      },
    });
  });
});

4.2 调整构建配置

根据不同的环境,调整 Vite 的构建配置,例如设置不同的输出目录。

// plugins/viteAdjustBuild.js
export default defineNuxtPlugin((nuxtApp) => {
  nuxtApp.hooks('vite:extend', (viteBuildContext) => {
    if (process.env.NODE_ENV === 'production') {
      viteBuildContext.config.build.outDir = 'dist/prod';
    } else {
      viteBuildContext.config.build.outDir = 'dist/dev';
    }
  });
});

4.3 动态修改开发服务器设置

你可以动态调整开发服务器的设置,如端口或代理。

// plugins/viteModifyServer.js
export default defineNuxtPlugin((nuxtApp) => {
  nuxtApp.hooks('vite:extend', (viteBuildContext) => {
    viteBuildContext.config.server.port = 3001;

    viteBuildContext.config.server.proxy = {
      '/api': {
        target: 'http://localhost:4000',
        changeOrigin: true,
      },
    };
  });
});

5. 注意事项

5.1 效能影响

扩展 Vite 的上下文可能会影响构建和启动性能,因此应尽量避免不必要的配置和插件。

5.2 版本兼容性

确保使用的 Vite 插件与当前 Vite 版本兼容,以避免出现不可预测的错误。

6. 总结

通过使用
vite:extend
钩子,开发者可以灵活地扩展 Vite 的默认上下文,以满足特定的项目需求。这种自定义能力不仅提升了开发效率,还可以为项目的特殊需求提供更强的支持。

余下文章内容请点击跳转至 个人博客页面 或者 扫码关注或者微信搜一搜:
编程智域 前端至全栈交流与成长
,阅读完整的文章:
Nuxt.js 应用中的 vite:extend 事件钩子详解 | cmdragon's Blog

往期文章归档: