Redis 网络模型

redis网络模型背景 1.进程分为用户空间和内核空间; 用户空间和内核空间共同目标是对系统资源的访问,为了提高IO效率,给用户空间和内核空间都加入了缓存;访问的流程为读写两部分,读:用户空间访问内核空间的缓存产看是否存在资源,若没有内核空间再对系统资源进行访问获取资源后存在缓存层,再读取到用户空间进行逻辑操作;写:将用户空间的缓存内容拷贝到内核空间缓存层,然后写入硬件中; 2.阻塞IO 阻塞IO指的是IO模型中等待数据的状态,发生在两个阶段,第一个阶段:用户空间执行recvfrom从内核空间中查找资源,内核缓存层并没有数据就进入到等待状态,第二个阶段:内核空间从硬件上也无法拷贝资源,进入等待状态; 3.非阻塞IO 非阻塞IO指的是用户进程执行recvfrom从内核空间查找数据,但是没有数据内核空间就会返回错误给用户,但其实内核空间的从缓存层拷贝数据也是处于等待状态,用户进程得到错误信息后会不断访问内核空间,知道内核空间拷贝数据成功后返回正确给用户进程,用户在进行逻辑调用;与阻塞IO的区别在于第一阶段等待与否,性能稍差,不如阻塞IO; 4.IO多路复用 无论阻塞IO还是非阻塞IO,存在一个问题是在第二个阶段都要进行等待,cpu的利用率不太好,IO多路复用解决了这一问题,使用单线程监听FD的状态,然后再调用recvfrom从内核空间拷贝资源到用户空间供用户进行使用; FD:用来关联linux中的文件,linux中一切皆为文件,FD是一个无符号整数 IO多路复用过程:用户调用select同时监听多个socekt,如果发现FD 是readable,就调用recvfrom从内核空间拷贝数据到用户供用户使用 IO多路复用采用select存在很多的缺点,例如:监听的FD不能超过1024,需要拷贝FD到内核空间并且要遍历所有的FD;而采用epoll不用遍历所有的FD,直接拷贝到用户空间,采用红黑树来存储FD,大小不上限,增删改查非常方便 ,性能不会因FD的数量受影响; Web服务使用Redis epoll 流程:用户空间的服务端创建实例epoll_create,severSocket得到FD,epoll_ctl 监听FD,注册所有FD到红黑树,如果监听到FD就绪,将就绪的FD存储链表中,epoll_wait 等待FD从链表中判断是否存在链表头,如果存在判断事件类型,如果是异常写出响应 ,如果是epollin判断ssfd是否可读,如果可读 accept接收客户端socket得到对应的FD然后到监听FD再到注册过程,如果ssfd不可读就直接读取请求参数作出响应。 异步IO:用户进程调用aio_read函数通知内核空间然后不再关心干其他事情,而内核空间进行等待数据带数据就绪拷贝数据到用户空间,递交aio的信号,信号函数处理信号到用户进程; 总结:所谓阻塞IO中的阻塞实际上是指第一阶段等待数据是否阻塞,都不阻塞的是异步IO;同步与异步是看第二阶段是否阻塞,阻塞与非阻塞IO都是同步IO; Redis网络模型核心是IO多路复用和事件派发,使用单线程,使用多线程的地方是两部分,一个是对命令的解析,还有就是写返回结果,性能的关键在于IO本身,与是否多线程关系不大。

matplotlib导入中文字体

path = os.path.dirname(os.path.dirname(os.path.dirname(__file__))) font_path = os.path.join(path, "SimHei.ttf") fm.fontManager.addfont(font_path) prop = fm.FontProperties(fname=font_path) plt.rcParams['font.family'] = 'sans-serif' # 使用字体中的无衬线体 plt.rcParams['font.sans-serif'] = prop.get_name() # 根据名称设置字体 plt.rcParams['axes.unicode_minus'] = False # 使坐标轴刻度标签正常显示正负号

智能搬运小车(自动抓取、循迹)

智能搬运小车 目录 智能搬运小车 1 1.引言 1 1.1智能搬运小车研究的背景和目的: 1 1.2智能搬运小车的功能介绍: 1 2.总体方案及论证 1 2.1系统结构框图: 1 2.2具体设计: 2 2.2.1系统机械部分 2 2.2.2系统电路部分 5 单片机最小系统由复位电路、时钟振荡电路、数据采集接口和电机控制接口组成,单片机最小系统图如图10所示。 5 光电传感器与黑线位置关系示意图 14 3.数据分析处理: 15 4.实验效果及理论分析 15 智能搬运小车可以安装不同的末端以完成各种不同形状和状态的工件搬运工作,可以广泛应用于机床上下料,冲压机自动化生产线,自动装配流水线,码垛搬运,集装箱等的自动搬运,大大减轻了人类繁重的体力劳动,具有广阔的市场前景。 1.2智能搬运小车的功能介绍: 智能搬运小车希望能够希望得到可以自动抓取货物,循迹行进,自动卸货物的功能。 2.总体方案及论证 2.1系统结构框图: 图1.系统结构框图 2.2具体设计: 整个系统包括单片机控制模块、电机驱动模块、光电传感器模块、机械手模块、模拟电源模块、小车车体。将单片机控制模块,驱动模块固定在小车上端;光电电传感器安装在小车底部;将机械手安装在小车上部的前端;车架结构选择铝板。

coreutils 编译

因需要dd 工具(busybox dd工具参数不全)需要编译coreutils coreutils介绍 可参考: https://iamzero.blog.csdn.net/article/details/80270379 1.获取代码git clone git://git.sv.gnu.org/coreutils 2.编译步骤:(Ubuntu18.04编译环境) ./bootstrap 3…/configure && make -j8 ​ 编译后发现一直报编译错误“lib/acl-internal.c: In function ‘free_permission_context’: lib/acl-internal.c:479:1: error: function might be candidate for attribute ‘cons t’ [-Werror=suggest-attribute=const]” ./configure --disable-gcc-warnings(即可解决) make -j8

第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(济南)C Stone Game【题解】

牛客竞赛传送门: 本题链接:https://ac.nowcoder.com/acm/problem/216161?&headNav=acm 比赛完整题单:https://ac.nowcoder.com/acm/contest/10662 通过率:531/931 题目大意: 有n堆石头,每堆石头由1~3个石头组成,现在要把这n堆石头合并成1堆,每次操作只能两两合并,且会产生费用,求最小费用。费用计算方法:这两堆各含石头x个和y个,合并的费用为(x mod 3) * (y mod 3)。题目第一行给出三个数,第i个数表示由i个石头所组成的堆的堆数是多少。 知识点:贪心、思维题 思路: 因为合并只能两两合并,我们先看看两两合并会发生什么(本文 ~ 表示合并的意思) 1~1 费用为11~2 费用为22~2 费用为41~3 费用为02~3 费用为03~3费用为0(4等价为1,不需要继续枚举了)1~4(等价于1~1) 整理上面表格得: 1~1费用为1生成一个新堆,大小为2新堆等价大小为21~2费用为2生成一个新堆,大小为3新堆等价大小为32~2费用为4生成一个新堆,大小为4新堆等价大小为13~x费用为0生成一个新堆,大小为3+x新堆等价大小为x 因为我们要计算最后全部合并完的费用,如果剩下的堆的大小都等价为3,那么他们继续合并,就不会增加额外的费用,也就得到了最终答案。所以我们要以生成新堆的大小为3为短期目标,列表观察最小费用的合并方式。 1~1等价大小为2,要再于1合并(1~1)~1费用为1+2=3生成一个新堆,大小为31~2等价大小为3,无需继续合并 1~2费用为2生成一个新堆,大小为32~2等价大小为1,要再与2合并(2~2)~2费用为4+2=6生成一个新堆,大小为33~x等价大小为x 3~x费用为0生成一个新堆,大小为x 于是发现,我们以多次合并生成等价大小为3的堆作为循环节,费用最小的合并方式是1~2。 由此得到贪心策略: 1、先把所有的1与2合并了先; 2、之后就只剩下两种情况, ①d堆个数为1的堆和个数为3的堆。 ②d堆个数为2的堆和个数为3的堆。 那么就只能用(1~1)~1和(2~2)~2这两种策略分别处理; 3、处理后会分别得到三种情况(以剩下的堆是个数为1的 举例): ①d%3==0(即d==0),皆大欢喜,1与2合并后没有剩余。 ②d%3==1,也很欢喜,此时情况为:1个个数为1的堆,和很多个个数为3的堆 用3~x的策略,也不会产生新的费用。 ③d%3==2,此时情况为:2个个数为1的堆,和很多个个数为3的堆 这两个1合并会产生新的费用,要额外加上。 4、最后再用3~x的策略合并成1堆。这一步不会产生任何费用。这里的x可能为1,2,3。 样例图解: AC代码: #include <bits/stdc++.h> #define int long long using namespace std; signed main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int a, b, c; cin >> a >> b >> c; int ans = 0; if (a == b){ ans = a * 2; } else if (a > b){ int d = a - b;//剩下d堆个数为1的堆和个数为3的堆 if (d % 3 == 2)//1 1 3的情况 ans++; ans += b * 2 + (d - d % 3); } else{ // a<b int d = b - a;//剩下d堆个数为2的堆和个数为3的堆 if (d % 3 == 2)//2 2 3的情况 ans += 4; ans += a * 2 + (d - d % 3) * 2; } cout << ans << "

几何平均详解,及其与算术平均、调和平均、均方根的关系

2. 几何平均与算术平均的转换关系(附): 3.2 几何平均数适用于求连乘样本的均值,它是变化的中心,代表平均变化率;算术平均数适用于求连加样本的均值,它是数值的中心,代表平均数量;中位数适合求带有离群值样本的均值,它是位置的中心,代表平均位置。 例:假定某地储蓄年利率(按复利计算):5%持续1.5年,3%持续2.5年,2.2%持续1年。求此5年内该地平均储蓄年利率。 r1, r2, r3 = 1.05, 1.03, 1.022 # 各年利率 n1, n2, n3 = 1.5, 2.5, 1 # 各年利率持续时间 G = (r1**n1*r2**n2*r3**n3)**(1/(n1+n2+n3)) r_avg = G - 1 print('用几何级数计算平均年利率的误差:', (1+r_avg)**(n1+n2+n3) - r1**n1*r2**n2*r3**n3) # 几何平均数的n次方等于总量 A = (n1*r1+n2*r2+n3*r3)/(n1+n2+n3) r_avg = A - 1 print('用算术级数计算平均年利率的误差:', (1+r_avg)*(n1+n2+n3) - r1**n1*r2**n2*r3**n3) # 算术平均数的n倍等于总量 打印结果: 用几何级数计算平均年利率的误差: -2.220446049250313e-16 用算术级数计算平均年利率的误差: 3.9880648729242933 4 四种平均数的大小关系:调和平均 < 几何平均 < 算术平均 < 均方根 当yi=0时,上式为各点的四种平均数;当yi≠0时,上式为各残差点的四种平均数。 import numpy as np from scipy.

element中close和before-close

前言:我解决的问题 点击弹框提交按钮弹框可以不显示,点击弹框 “X” 的时候,弹框可以关闭。(我是父子组件写的) 其一: 输入内容,点击提交之后 其二: 我点击“X”关闭弹框的时候,它会调用close里面的方法 后来才明白: close是点击“X”关闭之前做的一些事情,比如:关闭弹框。 before-close是点击提交之后做的一些事情,比如:清空表格内容。(仅个人理解,这是我在敲项目的时候,遇到父子组件,点击提交按钮的时候,弹框没有办法关闭) close 和 before-close用相同的函数,但逻辑实现不了。 最后,我写了两个函数,是两个不同的逻辑,最后实现了弹框点击“X”或者提交的时候之后,弹框不会再显示。 结论:前端还是要多敲,之后才能发现问题~ 加油,槿玥。

如何用 SSH 登录 Kindle 系统

1.kindle必须是越狱的。 2.需要安装USBNetwork(需要安装MRPI和KUAL) 3.要登录的环境生成了密钥。 4.kindle连上了wifi,你的登录设备也在同一个局域网里。 这些可以看看书伴网的文章。 我是从WSL里登录kindle的,其他linux类似,把用户目录里的.ssh目录里的id_rsa.pub,复制到kindle的usbnet/etc目录里,更名为authorized_keys。 重启一下kindle,就可以用了。 我的是kindle7,可以看到linux内核版本是3.0.35。 这个ip地址,可以通过在搜索栏输入";711",回车,会出现一个网页,里面有kindle的ip地址。 711前面是个英文的分号,输入后要点回车。kindle7的页面要第2页才能看到ip地址。注意,kindle休眠时,网络会断开的。

查看会议/期刊是否被EI收录

点击以下链接下载2021EI收录的会议/期刊名单:https://www.elsevier.com/__data/assets/excel_doc/0007/56392/CPXSourceList112021.xlsx 或者在线查看表格: https://view.officeapps.live.com/op/view.aspxsrc=https%3A%2F%2Fwww.lib.tongji.edu.cn%2Fthemes%2F357%2Fuserfiles%2Fdownload%2F2021%2FEI07012021.xlsx&wdOrigin=BROWSELINK 也可以: 打开以下网址, Engineering Websites Index & Journals Database 再点击下图下方的“Compendex source list”即可下载EI收录的会议/期刊的表格。 参考资料:如何查询某个会议或者期刊是否被EI收录_程序员的博客-CSDN博客_如何查看会议是否被ei检索

大数据OLAP引擎

一、OLAP介绍 1. OLAP简介 OLAP(Online AnalyticalProcessing)是一种数据处理技术,专门设计用于支持复杂的分析操作,侧重对决策人员和高层管理人员的决策支持。数据仓库对外数据能力的一种重要的输出方式。 OLAP遵循以下准则 OLAP模型必须提供多维概念视图透明性准则存取能力准则稳定的报表能力客户/服务器体系结构维的等同性准则动态的稀疏矩阵处理准则多用户支持能力准则非受限的跨维操作直观的数据操纵灵活的报表生成不受限的维与聚集层次 OLAP场景的关键特征 大多数是读请求数据总是以相当大的批(> 1000 rows)进行写入不修改已添加的数据每次查询都从数据库中读取大量的行,但是同时又仅需要少量的列宽表,即每个表包含着大量的列较少的查询(通常每台服务器每秒数百个查询或更少)对于简单查询,允许延迟大约50毫秒列中的数据相对较小:数字和短字符串(例如,每个URL 60个字节)处理单个查询时需要高吞吐量(每个服务器每秒高达数十亿行)事务不是必须的对数据一致性要求低每一个查询除了一个大表外都很小查询结果明显小于源数据,换句话说,数据被过滤或聚合后能够被盛放在单台服务器的内存中 2. OLAP与OLTP OLTP系统强调数据库内存效率,强调内存各种指标的命令率,强调绑定变量,强调并发操作,强调事务性。典型作为后端服务的数据来源。 OLAP系统则强调数据分析,强调SQL执行时长,强调磁盘I/O,强调分区。典型作为数据报表、数据产品的数据来源。 OLTPOLAP使用场景在线业务服务数据分析,数据挖掘DB设计面向应用面向主题数据存储最新的数据历史的,多数据源的DB大小MB-GBGB-EB时间要求实时响应不严格要求数据模型关系模型(3范式)维度模型主要应用数据库数据仓库代表MySQLSQL on Hadoop、Kylin 3. OLAP常规操作 上卷(Roll Up)/聚合:选定某些维度,根据这些维度来聚合事实,如果用SQL来表达就是select dim_a, aggs_func(fact_b) from fact_table group by dim_a. 下钻(Drill Down):上卷和下钻是相反的操作。它是选定某些维度(维度之间有层级关系,典型如年、月、日),将这些维度拆解出小的维度(如年拆解为月,省份拆解为城市),之后聚合事实。 切片(Slicing、Dicing):选定某些维度,并根据特定值过滤这些维度的值,将原来的大Cube切成小cube。如dim_a in (‘CN’, ‘USA’) 旋转(Pivot/Rotate):维度位置的互换。 二、OLAP引擎分类 目前市面上主流的开源OLAP引擎包含不限于:Hive、Spark SQL、Presto、Kylin、Impala、Druid、Clickhouse、Doris等,可以说目前没有一个引擎能在数据量,灵活程度和性能上做到完美,用户需要根据自己的需求进行选型。 主流的 OLAP 可以分为3类:多维 OLAP ( Multi-dimensional OLAP )、关系型 OLAP ( Relational OLAP ) 和混合 OLAP ( Hybrid OLAP ) 三大类。 1. 多维OLAP MOLAP的典型代表是:Druid、Kylin,MOLAP一般会根据用户定义的数据维度、度量(也可以叫指标)在数据写入时生成预聚合数据;Query查询到来时,实际上查询的是预聚合的数据而不是原始明细数据。 优点:数据预处理,将原始数据按照指定的计算规则预先做聚合计算,这样避免了查询过程中出现大量的即使计算,提升了查询性能。 缺点:限制后期数据查询的灵活性 2. 关系OALP ROLAP的典型代表是:Presto,Impala,GreenPlum,Clickhouse,Elasticsearch,Hive,Spark SQL,Flink SQL,Doris。数据写入时,ROLAP并未使用像MOLAP那样的预聚合技术;ROLAP收到Query请求时,会先解析Query,生成执行计划,扫描数据,执行关系型算子,在原始数据上做过滤(Where)、聚合(Sum, Avg, Count)、关联(Join),分组(Group By)、排序(Order By)等,最后将结算结果返回给用户,整个过程都是即时计算,没有预先聚合好的数据可供优化查询速度,拼的都是资源和算力的大小。

Next.js-基于文件的路由

基于文件的路由 在 Next.js 中,一个 page(页面) 就是一个从 .js、jsx、.ts 或 .tsx 文件导出(export)的 React 组件 ,这些文件存放在 pages 目录下。每个 page(页面)都使用其文件名作为路由(route)。 示例: 如果你创建了一个命名为 pages/about.tsx 的文件并导出(export)一个如下所示的 React 组件,则可以通过 /about 路径进行访问。 import React from "react"; function About() { return <div>About</div> }; export default About; 默认路由 index.tsx总是被当作它所在文件夹的默认路由界面. 示例: 在pages目录下新建一个about文件夹, 里面创建一个index.tsx index.tsx import React from "react"; const About: React.FC = () => ( <div> <h1>The About Page</h1> </div> ); export default About; 访问 具有动态路由的页面 Next.js 支持具有动态路由的 pages(页面)。 示例:

日常学习记录——封校期的学习日常

日常学习记录——封校期的学习日常 前言1 继承和组合 ——《笨方法学python3》练习441.1 示例代码11.2 示例代码2 2 XGBoost分类算法2.1 参考文献2.2 实例代码2.3 运行结果 3 Use Brain Every Day3.1 John Resig的规则 —— Write Code Every Day3.2 锂盐块的规则 —— Use Brain Every Day 总结 前言 每天都为自己的个人项目做一点工作,而不是集中在每个周末。——《Write Code Every Day》 这篇博客为宿舍区封控后的第一个工作日上午的学习内容总结。 1 继承和组合 ——《笨方法学python3》练习44 1、隐式继承:对子类的行为意味着对父类的行为。 2、显示继承:子类上的操作会覆盖父类上的操作。 3、修改前后:显示继承的特殊形式,在父类版本运行之前或之后更改行为。 1.1 示例代码1 class Parent(object): def implicit(self): print("PARENT implicit()") def override(self): print("PARENT override()") def altered(self): print("PARENT altered()") class Child(Parent): def override(self): print("CHILD override()") def altered(self): print("CHILD, BEFORE PARENT altered()"

compression-webpack-plugin压缩前端代码&服务器nginx代理相关配置

一、compression-webpack-plugin压缩前端代码 安装插件: npm i -D compression-webpack-plugin.webpack配置 由于本人使用的是vue-cli,所以直接贴配置: // gzip压缩输出文件 config.plugin('compression').use(CompressionPlugin, [{ filename: '[path][base].gz', algorithm: 'gzip', test: /\.js$|\.css$|\.html$/, minRatio: 0.8, deleteOriginalAssets: true, }]) 进行打包 二、服务器nginx代理相关配置 找到nginx配置文件 find / -name nginx.conf修改配置,有压缩文件的情况下,自动返回给客户端压缩文件 http { gzip_static on; } 找到nginx服务,进行重启 nginx -V –sbin-path=‘/usr/sbin/nginx’ 进入到服务地址路径下: cd /usr/sbin ./nginx -s reload

cJSON函数用法

/* 以字符串形式返回cJSON的版本 / CJSON_PUBLIC(const char) cJSON_Version(void);/* 向cJSON提供malloc, realloc和free函数 / CJSON_PUBLIC(void) cJSON_InitHooks(cJSON_Hooks hooks);/* 提供一个JSON块,这将返回一个您可以查询的cJSON对象。*/ CJSON_PUBLIC(cJSON *) cJSON_ParseWithLength(const char *value, size_t buffer_length); cJSON_Print()函数 和 CJSON_Parse()函数的作用: 前者是 JSON 的数据格式转换为 JSON 字符串,用于 JSON 组装, 后者是 JSON 字符串转换为 JSON 的数据格式,用于 JSON 解析 /* 内存管理:调用者总是负责从所有变量的cJSON_Parse(使用cJSON_Delete)和 cJSON_Print(使用stdlib freallocated)中释放结果,调用者对缓冲区有完全的责任。*/ CJSON_PUBLIC(cJSON *) cJSON_Parse(const char *value); /* 将cJSON实体呈现为用于传输/存储的文本。 */ CJSON_PUBLIC(char *) cJSON_Print(const cJSON *item); /* 将cJSON实体呈现为文本,用于传输/存储,不需要任何格式化。*/ CJSON_PUBLIC(char *) cJSON_PrintUnformatted(const cJSON *item); /* 使用缓冲策略将cJSON实体渲染为文本。预缓冲是对最终大小的猜测。 猜中会减少再分配。Fmt =0表示未格式化,=1表示已格式化 */ CJSON_PUBLIC(char *) cJSON_PrintBuffered(const cJSON *item,

WSDM'23 | 基于实体对齐的文图检索优化算法

每天给你送来NLP技术干货! 来自:知识工场 图文检索是一项具有挑战性的跨模态任务,引起了人们的广泛关注。传统方法无法打破不同模态之间的障碍。视觉语言预训练模型(VLP)基于海量图文数据,大大提高了图文检索性能。尽管如此,基于VLP模型的方法仍然容易产生无法在跨模态数据上对齐实体的检索结果。并且在预训练阶段解决该问题的方法不仅昂贵,且欠缺应用性。 因此,我们提出了一种轻量级的实用方法AGREE,基于VLP模型,仅在微调和重排序阶段对齐图像-文本实体,以优化图文检索策略的性能。我们利用外部知识和工具构建额外的细粒度图像-文本对,并微调训练中通过对比学习和实体级mask建模来强调跨模式的实体对齐。我们同时提出了两种重排序策略,其中一种是专为零样本场景设计的。在多个中文和英文数据集上,及多个VLP模型的大量实验表明,我们的方法在几乎所有的设置下都能获得最先进的结果。目前该工作已被WSDM-2023主会接收。 一、研究背景 图文检索任务可以输入文本作为查询内容以进行图像检索,也可以输入图像作为查询内容以进行文本检索。在VLP模型执行下游图文检索任务时,希望在输入特定文本时,模型能够准确预测出该特定文本对应的图像文本样本对中的图像;同时,希望在输入特定图像时,模型能够准确预测出该特定图像对应的图像文本对中的文本。 如图1所示,左侧“查询”列和中间“真实数据”列所包括的图像-文本对,是用于进行VLP模型预训练时所使用的样本对。但图1所示的三个例子中,都发生了由于实体没有对齐而导致的错误预测。 图 1 在COCO-CN数据集微调后3个不匹配的图文检索案例 在第一个例子中,文本查询中的“菠萝”没有出现在预测图像中。同样,在第二个例子中,模型只关注“蔬菜”和“盘子”的匹配,而忽略了查询中的另一个重要实体“紫菜包饭”。另外,对盘子的数量也有误判。在第三个例子中,预测文本不包含在查询图像中可以明显观察到的“苹果”和“蛋糕”。 为了改善VLP的图文检索性能,最近的一些工作,如ROSITA,ERNIE-ViL分别从图像和文本中构建场景图,然后将它们对齐,其他一些工作利用外部知识,如OSCAR外部目标检测器或多语言数据集UC2,以改进细粒度跨模态匹配。尽管他们同样取得了成功,然而VLP模型的预训练成本极高,并且难以获取的预训练数据集也使得现有方法的实用性不高。 因此,考虑到VLP模型极高的预训练成本,本文提出了一种在无需重训VLP模型的情况下,仅仅通过微调,甚至在零样本场景下通过重排序而实现图像-文本实体的细粒度对齐,由此优化图文检索对策性能。具体地,可以在微调中通过对比学习和实体级掩模建模强调跨模式的实体对齐,并可以通过外部知识的引入进一步提升性能。可以通过重排序策略进一步改善图文检索结果。 二、方法部分 我们通过图2的流程图来展示AGREE,包含微调和重排序两部分内容。 图2 AGREE的总体框架 框架中的具体步骤包括: Step1:我们从文本中识别出文本实体,从图像中识别出视觉实体,然后通过预训练的VLP模型的编码器将它们与原始文本和图像一起进行编码。 Step2:在微调阶段,我们设计了三个不同的模块来学习跨模态实体之间的对齐: a. 视觉实体-图像对齐(VEA):通过整理Visual Genome的数据作为多模态知识库(MMKB),从中获取额外的视觉实体-图像对,通过对比学习和图像实体级区域掩模建模来学习视觉实体标签与其对应的细粒度图像之间的对齐。 b. 文本实体-图像对齐(TEA):通过每个文本中包含文本实体及其可视化属性(如颜色和数字)来构建句子,之后通过对比学习和文本实体掩模建模来学习句子与其对应的图像之间的对齐。 c. 文本-图像实体对齐(TIA):强调了跨模态实体对齐的重要性,通过随机掩模建模图像或文本中的实体,让模型对跨模态对齐实体的缺失更加敏感。 Step3:基于结果的重排序阶段,该阶段设计了两个不同的模块来细化top-𝑘排名结果: a. 文本-图像双向重排序(TBR):采用top-𝑘(𝑘=20)的检索结果进行反向图像-文本检索,其反向检索的结果排名随后被用于重新计算排名,进行重新排序。 b. 文本实体指导的重新排序(EGR):专门为零样本场景下设计的重排序结果,它采用top-𝑘检索结果来计算来自图像和文本的实体之间的相似性,然后考虑相似性来细化排序结果。 其中,AGREE的微调框架的架构如图3所示: 图3 AGREE微调框架的架构 视觉实体编码器的输入从Visual Genome中选择的实体图像。文本实体编码器的输入包含来自使用实体链接的文本的实体,以及来自 Visual Genome 的标签实体,具体的实体内容取决于不同的对齐任务。图片右上角的框指示了每个模块的视觉和文本输入。 如框架所示,基于跨模态实体对齐的方法计算了全局相似度和实体相似度,并之后对其进行融合,作为统一的训练目标。实体相似度是指基于VEA、TEA和TIA三个模块的跨模态实体比对,强调图像和文本之间的相似性。其中,VEA将从外部多模态知识库中获得的对应图像作为实体标签的输入,通过VEM和MVC两个子模块输出视觉图像与其标签之间的相似性。TEA由TEE和MEC两个子模块组成,接收以文本实体和图像为输入的文本,输出文本实体与图像之间的相似度。TIA也接受带有实体的原始图像和文本,但学习计算图像和文本实体之间的相似距离。 AGREE具体模块的技术介绍: PART 01 微调阶段 1)视觉实体-图像对齐(Visual Entity-Image Alignment,VEA)模块 与严重依赖对象检测模型用于细粒度交互的现有VLP模型不同,AGREE简单地将检测到的标签用作媒介并重建一个MMKB, 用于视觉知识以与其视觉图像对齐。我们选择Visual Genome来作为外部增强的知识库,并设计简单的启发式规则过滤图像来建立该object-image库。在微调过程中,为批次内𝑁幅图像所带有的𝑘个实体收集视觉标签集 ,并从MMKB中找出与实体的关联图像。 VEA遵循图文对比学习的范式,通过两个任务来学习每个视觉实体的实体-图像对齐,分别为VEM(视觉实体匹配Visual Entity Matching)和MVC(掩码视觉对象一致性对齐Masking Visual Object Consitency Alignment)。 用于优化每个标签文本对其关联图像的匹配,使用提示“a photo contains {entity}”的方法,优化视觉对象的标签文本 与其图像 的匹配; 包括用于表征带有掩码实体的标签文本的embedding与其关联图像的embedding的相似度与不带有掩码实体的标签文本的embedding与其关联图像的embedding的相似度差异的损失函数。我们利用实体标签提示与原始图像以及标签提示与带有掩码实体的图像之间计算的相似度分数的差异,最小化式(4)中视觉对象一致性学习的边际排序损失。 用于表示带掩码实体区域的图像和文本之间的相似性。 期望原始图像和对象标签的得分更高,以更多地强调那些缺失的视觉实体。 (4)

npm run build打包后页面空白报错:Failed to load resource: net::ERR_FILE_NOT_FOUND

原链接:npm run build打包后页面空白报错:Failed to load resource: net::ERR_FILE_NOT_FOUND_姜慧慧的博客-CSDN博客有效的解决了我的问题所以转载记录一下 vue-cli2报错 静态资源加载错误,原因是assetsPublicPath路径错误需要把assetsPublicPath:’./’再 npm run build就显示成功啦config文件夹下的index.jswebpack.prod.conf.js 中output添加参数publicPath:’./’ vue-cli3报错 再vue.config.js中加入 module.exports = { publicPath: './', }; 这个问题解决后页面还是空白但是没有报错信息 是history路由问题 = 如果你在创建项目时选择了history路由模式,打开Router内的index.js,也就是默认路由的配置文件,把history一行注释掉: const router = new VueRouter({ // mode: “history”, base: process.env.BASE_URL, routes });

ORACLE 11G用户账户和密码设置

用户密码有效期 ORA-28001:the password has expired ORACLE 数据库默认密码有效期为 180 天。 修改密码有效期为无限期 查看用户所属的profile SQL> SELECT USERNAME,PROFILE FROM DBA_USERS; 查看以上所述的概要文件的密码有效期设置 SQL> select * from dba_profiles a where a.profile='DEFAULT' and resource_name='PASSWORD_LIFE_TIME'; 将密码有效期修改为无限期 SQL> ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED; 修改后无需重启数据库,修改后立即生效 需要重新修改用户密码 SQL> alter user [username] identified by [password]; 修改密码有效期为固定期限 SQL> alter profile default limit PASSWORD_LIFE_TIME 60; –//修改密码有效期为60天 密码到期前的宽限时间 ORA-28002: the password will expire within 7 days 查看当前用户密码状态 SQL> select username,profile,password,account_status,lock_date,expiry_date from dba_users where username='GXSI'; USERNAME PROFILE PASSWORD ACCOUNT_STATUS LOCK_DATE EXPIRY_DATE ------------------------------ ------------------------------ ------------------------------ -------------------------------- ------------ ------------ GXSI DEFAULT EXPIRED(GRACE) 09-DEC-22 查看当前密码宽限期

Python数据分析-numpy

目录 一、创建数组 1.1 从列表传入:array() 1.2 生成全0数组:zeros() 1.3 生成全1数组:ones() 1.4 fill(x)函数将数组设定为x: 1.5 类型转换:astype() 1.6 生成整数序列:arange() 1.7 生成等差数列:linspace() 1.8 生成随机数:random.rand(),random.randn(),random.randint() 1.9 查看变量类型:type() 1.10 查看数据的类型:dtype() 1.11 查看变量的形状:shape,size,ndim 二、索引和切片 2.1 常规索引 2.2 省略参数 2.3 案例:计算一部电影的累计票房 三、多维数组及其属性 3.1 查看数组属性 3.2 多维数组索引: 3.3 多维数组切片: 四、花式索引 4.1 一维花式索引 4.2 二维花式索引 4.3 不完全索引 4.4 where语句 五、数组类型 六、数组操作(以豆瓣10部高分电影为例) 6.1 数组排序: 6.2 其他常见函数: 七、多维数组操作 7.1 数组形状,shape和reshape,reshape不会修改原有的数组,而会返回一个新的数组 7.2 转置 7.3 数组连接 7.4 numpy内置函数(部分函数) Numpy 是Python 的⼀种开源的数值计算拓展,这种⼯具可⽤来存储和处理⼤型矩阵。 Numpy的⼀个重要特性是数组计算。 导入numpy包的几种方法: import numpy import numpy as np #导入numpy包并重命名为np import numpy import * #导入numpy的所有函数,但若是大工程函数可能相同,会报错 一、创建数组 1.

python重命名文件夹内的图片

import os import shutil import sys src_dir = "/home/xxx/22-12-01/xxx_180to270/images" dst_dir = "/home/xxx/22-12-01/xxx_180to270/images_dst" if dst_dir is not os.path.exists: os.makedirs(dst_dir) else: shutil.rmtree(dst_dir) pic_list = os.listdir(src_dir) for pic in pic_list: print("\nold name: {}".format(pic)) pic_num = int(pic.split(".")[0].split("_")[-1]) prefix = pic.split(".")[0].split('_')[0] pic_num -= 40 # print("num: {}".format(pic_num)) new_name = prefix + "_%08d.png" % pic_num print("new name: {}".format(new_name)) shutil.copyfile(os.path.join(src_dir, pic),os.path.join(dst_dir, new_name))

CentOS 7部署nginx 离线安装nginx 在线安装nginx(nginx安装详细教程)

CentOS 7部署nginx 离线安装nginx 在线安装nginx(nginx安装详细教程) 文章目录 CentOS 7部署nginx 离线安装nginx 在线安装nginx(nginx安装详细教程)1 联网安装nginx2 离线安装Nginx2.1 安装gcc2.2 安装g++2.2.1 安装perl 2.3 安装openssl2.4 安装pcre2.5 安装zlib2.6 安装Nginx 3 开放80端口4 设置开机自启 玛卡,巴卡,阿卡,哇卡,米卡,玛卡,呣! 玛卡,巴卡,阿巴,雅卡,伊卡,阿卡,噢! 哈姆,达姆,阿卡嗙,咿呀呦~ 玛卡,巴卡,阿卡,哇卡,米卡,玛卡,呣! 1 联网安装nginx 安装先决条件 sudo yum install yum-utils 创建/etc/yum.repos.d/nginx.repo文件来设置yum存储库(先查看是否有再创建) cd /etc/yum.repos.d touch nginx.repo 将下列内容复制到nginx.repo中 [nginx-stable] name=nginx stable repo baseurl=http://nginx.org/packages/centos/$releasever/$basearch/ gpgcheck=1 enabled=1 gpgkey=https://nginx.org/keys/nginx_signing.key module_hotfixes=true [nginx-mainline] name=nginx mainline repo baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/ gpgcheck=1 enabled=0 gpgkey=https://nginx.org/keys/nginx_signing.key module_hotfixes=true 安装nginx命令如下 sudo yum install nginx 启动,启动目录在/usr/sbin 在该目录下有一个nginx cd /usr/sbin ./nginx 验证是否启动 ps -ef | grep nginx 验证本地是否可以访问 curl localhost:80 验证主机访问服务器的nginx ​ 在主机浏览器中输入服务器地址,如: 192.