batchno(如何通过优化sql语句提高数据库查询效率)
资讯
2023-11-09
350
1. batchno,如何通过优化sql语句提高数据库查询效率?
通过优化SQL语句,提高数据库查询效率,我总结了有这么几个方面:
减少数据访问看起来像一句废话,少访问数据当然可以提高速度了,减少数据访问有这么几个方法:
创建并正确使用索引
我们经常用到的就是B-TREE索引,我们经常说到的【索引】也指的是【B-TREE索引】。
正确使用索引可以让查询效率翻倍,但是如果使用不正确,也会对效率降低很多,比如这几种情况就会造成索引失效:
不等于操作:<>? 、not in('')
进行了运算后的字段:column+1(简单的运算),function(column)(函数)
含前导模糊查询:like '%xxx'
IS NULL
隐式类型转换:column是char类型,但是写成column = 123(右边是另外一种类型)
只通过索引访问数据有些时候,我们只需要访问表中的某几个列的数据,我们可以为这几个字段建立一个组合索引,这样的话只通过索引就可以得到数据,可以较小IO的开销。比如:
select name,gender from users where age='25';
如果这个SQL用的频率很高,那么我们可以建立一个组合索引:
create index index_xxx on users(name,gender,age);
在执行这个sql的时候,数据全部都是通过索引找到的,都不需要访问users表。
优化SQL执行计划执行计划表示SQL在执行时候的算法,有的时候SQL语句很复杂,就需要优化SQL的执行计划去提高SQL的执行效率。
其他可能不和SQL有直接的关系,但确实效率提升很明显,比如:
数据分页处理只返回需要的字段减少交互次数(batch DML)使用绑定变量(可以减少数据库服务器CPU运算)但是要注意,对SQL不要过度优化,满足需求即可。
希望我的回答能够帮助到你!
2. no是生产日期吗?
batch-no是生产日期的意思。
3. 批号英文缩写?
批号
Batch No.
生产批号就是在工业生产中,虽然原料和工艺相同,但是每一批投料生产出来的产品,在质量和性能上还是有差异的。为了事后追踪这批产品的责任,避免混杂不清,所以每一批产品都有相应的批号。
表示同一天投料次数号。如1991年11月29日第一批投料生产的药品,即应为911129-1,同一天第六批投料生产的药品,即为911129-6。
4. dmesg命令详解?
linux dmesg命令参数及用法详解(linux显示开机信息命令)
功能说明:显示开机信息。
语 法:dmesg [-cn][-s <缓冲区大小>]
补充说明:kernel会将开机信息存储在ring buffer中。您若是开机时来不及查看信息,可利用dmesg来查看。开机信息亦保存在/var/log目录中,名称为dmesg的文件里。
参 数:
-c 显示信息后,清除ring buffer中的内容。
-s<缓冲区大小> 预设置为8196,刚好等于ring buffer的大小。
-n 设置记录信息的层级。扩展阅读一:dmesg命令主要用途
主要应用:
dmesg用来显示内核环缓冲区(kernel-ring buffer)内容,内核将各种消息存放在这里。在系统引导时,内核将与硬件和模块初始化相关的信息填到这个缓冲区中。内核环缓冲区中的消息对于诊断系统问题 通常非常有用。在运行dmesg时,它显示大量信息。通常通过less或grep使用管道查看dmesg的输出,这样可以更容易找到待查信息。例如,如果发现硬盘性能低下,可以使用dmesg来检查它们是否运行在DMA模式:
$dmesg | grep DMA
...
ide0: BM-DMA at 0xf000-0xf007, BIOS settings: hda:DMA, hdb:DMA
ide1: BM-DMA at 0xf008-0xf00f, BIOS settings: hdc:DMA, hdd:DMA
...上面几行可以说明每个IDE设备正在什么模式下运行。如果以太网连接出现问题,那么可以在dmesg日志中搜索eth:
$dmesg | grep eth
forcedeth.c: Reverse Engineered nForce
ethernet driver. Version 0.49.
eth0: forcedeth.c: subsystem: 0147b:1c00
bound to 0000:00:04.0
eth0: no IPv6 routers present如果一切正常,那么dmesg显示每个网卡的硬件配置信息。如果某项系统服务未能得到正确的配置,dmesg日志很快就填满错误消息,这是诊断故障的良好起点。
还可以用来探测系统内核模块的加载情况,比如要检测ACPI的加载情况,使用dmesg | grep acpi
dmesg |egrep -i ''(apm|acpi)''
Kernel command line: vga=274 quiet console=ttyS3,9600acpi=no-idleoot=/dev/hda3
ACPI: Core Subsystem version [20010208]
ACPI: Subsystem enabled
ACPI: System firmware supports: C2
ACPI: plvl2lat=99 plvl3lat=1001
ACPI: C2 enter=1417 C2 exit=354
ACPI: C3 enter=-1 C3 exit=-1
ACPI: Not using ACPI idle
ACPI: System firmware supports: S0 S1 S4 S5
扩展阅读二:dmesg命令使用示例
使用示例
示例一 将开机信息发邮件
man dmesg 写道
The program helps users to print out their bootup messages. Instead of copying the messages by hand, the user need only:
dmesg > boot.messages
and mail the boot.messages file to whoever can debug their problem.
[root@new55 ~]# dmesg >boot.messages
[root@new55 ~]# ls -l boot.messages
-rw-r--r-- 1 root root 15838 12-09 12 begin_of_the_skype_highlighting
15838 12-09 12 免费 end_of_the_skype_highlighting:55 boot.messages[root@new55 ~]# mail -s "Boot Log of Linux Server" public@web3q.net <boot.messages
[root@new55 ~]#示例二 浏览dmesg输出的信息
[root@new55 ~]# uname -a
Linux new55 2.6.18-194.el5 #1 SMP Tue Mar 16 21:52:43 EDT 2010 i686 i686 i386 GNU/Linux[root@new55 ~]# dmesg | less
Linux version 2.6.18-194.el5 (mockbuild@x86-007.build.bos.redhat.com) (gcc version 4.1.2 20080704 (Red Hat 4.1.2-48)) #1 SMP Tue Mar 16 21:52:43 EDT 2010
BIOS-provided physical RAM map:
BIOS-e820: 0000000000010000 - 000000000009fc00 (usable)
BIOS-e820: 000000000009fc00 - 00000000000a0000 (reserved)
BIOS-e820: 00000000000e0000 - 0000000000100000 (reserved)
BIOS-e820: 0000000000100000 - 000000001f7d0000 (usable)
BIOS-e820: 000000001f7d0000 - 000000001f7efc00 (reserved)
BIOS-e820: 000000001f7efc00 - 000000001f7fb000 (ACPI NVS)
BIOS-e820: 000000001f7fb000 - 000000001f800000 (reserved)
BIOS-e820: 00000000e0000000 - 00000000f0000000 (reserved)
BIOS-e820: 00000000fec00000 - 00000000fec02000 (reserved)
BIOS-e820: 00000000fed20000 - 00000000fed9b000 (reserved)
BIOS-e820: 00000000feda0000 - 00000000fedc0000 (reserved)
BIOS-e820: 00000000ffb00000 - 00000000ffc00000 (reserved)
BIOS-e820: 00000000fff00000 - 0000000100000000 (reserved)
0MB HIGHMEM available.
503MB LOWMEM available.
Memory for crash kernel (0x0 to 0x0) notwithin permissible range
disabling kdump
Using x86 segment limits to approximate NX protection
On node 0 totalpages: 128976
DMA zone: 4096 pages, LIFO batch:0
Normal zone: 124880 pages, LIFO batch:31
DMI 2.3 present.
Using APIC driver default
ACPI: RSDP (v000 HP ) @ 0x000fe270
ACPI: RSDT (v001 HP 30C4 0x31100620 HP 0x00000001) @ 0x1f7efc84
ACPI: FADT (v002 HP 30C4 0x00000002 HP 0x00000001) @ 0x1f7efc00
ACPI: MADT (v001 HP 30C4 0x00000001 HP 0x00000001) @ 0x1f7efcb8
ACPI: MCFG (v001 HP 30C4 0x00000001 HP 0x00000001) @ 0x1f7efd14
ACPI: SSDT (v001 HP HPQPpc 0x00001001 MSFT 0x0100000e) @ 0x1f7f6698
ACPI: DSDT (v001 HP DAU00 0x00010000 MSFT 0x0100000e) @ 0x00000000
ACPI: PM-Timer IO Port: 0x1008
ACPI: Local APIC address 0xfec01000
ACPI: LAPIC (acpi_id[0x01] lapic_id[0x00] enabled)
Processor #0 6:13 APIC version 20
ACPI: LAPIC_NMI (acpi_id[0x01] high edge lint[0x1])
ACPI: IOAPIC (id[0x01] address[0xfec00000] gsi_base[0])
IOAPIC[0]: apic_id 1, version 32, address 0xfec00000, GSI 0-23
:
示例三 查看dmesg尾部的信息
[root@new55 ~]# dmesg | tail
Bluetooth: L2CAP ver 2.8
Bluetooth: L2CAP socket layer initialized
Bluetooth: RFCOMM socket layer initialized
Bluetooth: RFCOMM TTY layer initialized
Bluetooth: RFCOMM ver 1.8
Bluetooth: HIDP (Human Interface Emulation) ver 1.1
eth0: no IPv6 routers present
Installing knfsd (copyright (C) 1996 okir@monad.swb.de).
NFSD: Using /var/lib/nfs/v4recovery as the NFSv4 state recovery directory
NFSD: starting 90-second grace period
[root@new55 ~]#
示例四 安装SS7卡驱动时的内核日志
[root@localhost ss7dpklnx]# cd SS7HD_DRIVER/
[root@localhost SS7HD_DRIVER]# ls
bbdddlnx_iss.h bbd_hbi.h bbd_ioc.c bbd_isr.c bbd_pci.c BSD_license.txt GPL_V2-only_license.txt install_ss7hd.sh Makefile26
bbd_def.h bbd_hs.c bbd_ioc.h bbd_lnx.c bbd_pro.h build_ss7hd.sh i21555.h Makefile24
[root@localhost SS7HD_DRIVER]# ./build_ss7hd.sh
make: Entering directory `/usr/src/kernels/2.6.9-22.EL-i686'
CC [M] /root/setup/ss7dpklnx/SS7HD_DRIVER/bbd_hs.o
CC [M] /root/setup/ss7dpklnx/SS7HD_DRIVER/bbd_ioc.o
CC [M] /root/setup/ss7dpklnx/SS7HD_DRIVER/bbd_isr.o
CC [M] /root/setup/ss7dpklnx/SS7HD_DRIVER/bbd_pci.o
CC [M] /root/setup/ss7dpklnx/SS7HD_DRIVER/bbd_lnx.o
LD [M] /root/setup/ss7dpklnx/SS7HD_DRIVER/ss7hddvr26.o
Building modules, stage 2.
MODPOST
CC /root/setup/ss7dpklnx/SS7HD_DRIVER/ss7hddvr26.mod.o
LD [M] /root/setup/ss7dpklnx/SS7HD_DRIVER/ss7hddvr26.ko
make: Leaving directory `/usr/src/kernels/2.6.9-22.EL-i686'http://www.linuxso.com/command/dmesg.html[root@localhost SS7HD_DRIVER]# ./install_ss7hd.sh
[root@localhost SS7HD_DRIVER]# lsmod | grep ss7
ss7hddvr26 25808 0
[root@localhost SS7HD_DRIVER]# dmesg | tail
ACPI: PCI interrupt 0000:02:0d.0[?] -> GSI 9 (level, low) -> IRQ 9
BBD[0] 64bit
SS7HD[0] - suspend
Dialogic SS7HD Device Driver V100.00 (Source V1.21)
Copyright (C) Dialogic Corporation 2003-2010. All Rights Reserved
Using major device number 251.
ACPI: PCI interrupt 0000:02:0d.0[?] -> GSI 9 (level, low) -> IRQ 9
BBD[0] 64bit
[root@localhost SS7HD_DRIVER]# ./install_ss7hd.sh remove
[root@localhost SS7HD_DRIVER]# lsmod | grep ss7
[root@localhost SS7HD_DRIVER]# dmesg | tail
BBD[0] 64bit
SS7HD[0] - suspend
Dialogic SS7HD Device Driver V100.00 (Source V1.21)
Copyright (C) Dialogic Corporation 2003-2010. All Rights Reserved
Using major device number 251.
ACPI: PCI interrupt 0000:02:0d.0[?] -> GSI 9 (level, low) -> IRQ 9
BBD[0] 64bit
SS7HD[0] - suspend
[root@localhost SS7HD_DRIVER]#
示例五 打印并清除内核环形缓冲区
[root@new55 ~]# dmesg -c
Linux version 2.6.18-194.el5 (mockbuild@x86-007.build.bos.redhat.com) (gcc version 4.1.2 20080704 (Red Hat 4.1.2-48)) #1 SMP Tue Mar 16 21:52:43 EDT 2010
BIOS-provided physical RAM map:
BIOS-e820: 0000000000010000 - 000000000009fc00 (usable)
BIOS-e820: 000000000009fc00 - 00000000000a0000 (reserved)
BIOS-e820: 00000000000e0000 - 0000000000100000 (reserved)
BIOS-e820: 0000000000100000 - 000000001f7d0000 (usable)
BIOS-e820: 000000001f7d0000 - 000000001f7efc00 (reserved)
BIOS-e820: 000000001f7efc00 - 000000001f7fb000 (ACPI NVS)
BIOS-e820: 000000001f7fb000 - 000000001f800000 (reserved)
BIOS-e820: 00000000e0000000 - 00000000f0000000 (reserved)
BIOS-e820: 00000000fec00000 - 00000000fec02000 (reserved)
BIOS-e820: 00000000fed20000 - 00000000fed9b000 (reserved)
BIOS-e820: 00000000feda0000 - 00000000fedc0000 (reserved)
BIOS-e820: 00000000ffb00000 - 00000000ffc00000 (reserved)
BIOS-e820: 00000000fff00000 - 0000000100000000 (reserved)
0MB HIGHMEM available.
503MB LOWMEM available.
Memory for crash kernel (0x0 to 0x0) notwithin permissible range
disabling kdump
Using x86 segment limits to approximate NX protection
On node 0 totalpages: 128976
DMA zone: 4096 pages, LIFO batch:0
Normal zone: 124880 pages, LIFO batch:31
DMI 2.3 present.省略输出
Bluetooth: HIDP (Human Interface Emulation) ver 1.1
eth0: no IPv6 routers present
Installing knfsd (copyright (C) 1996 okir@monad.swb.de).
NFSD: Using /var/lib/nfs/v4recovery as the NFSv4 state recovery directory
NFSD: starting 90-second grace period
[root@new55 ~]# dmesg[root@new55 ~]# less /var/log/dmesg
Linux version 2.6.18-194.el5 (mockbuild@x86-007.build.bos.redhat.com) (gcc version 4.1.2 20080704 (Red Hat 4.1.2-48)) #1 SMP Tue Mar 16 21:52:43 EDT 2010
BIOS-provided physical RAM map:
BIOS-e820: 0000000000010000 - 000000000009fc00 (usable)
BIOS-e820: 000000000009fc00 - 00000000000a0000 (reserved)
BIOS-e820: 00000000000e0000 - 0000000000100000 (reserved)
BIOS-e820: 0000000000100000 - 000000001f7d0000 (usable)
BIOS-e820: 000000001f7d0000 - 000000001f7efc00 (reserved)
BIOS-e820: 000000001f7efc00 - 000000001f7fb000 (ACPI NVS)
BIOS-e820: 000000001f7fb000 - 000000001f800000 (reserved)
BIOS-e820: 00000000e0000000 - 00000000f0000000 (reserved)
BIOS-e820: 00000000fec00000 - 00000000fec02000 (reserved)
BIOS-e820: 00000000fed20000 - 00000000fed9b000 (reserved)
BIOS-e820: 00000000feda0000 - 00000000fedc0000 (reserved)
BIOS-e820: 00000000ffb00000 - 00000000ffc00000 (reserved)
BIOS-e820: 00000000fff00000 - 0000000100000000 (reserved)
0MB HIGHMEM available.
503MB LOWMEM available.
Memory for crash kernel (0x0 to 0x0) notwithin permissible range
disabling kdump
Using x86 segment limits to approximate NX protection
On node 0 totalpages: 128976
DMA zone: 4096 pages, LIFO batch:0
Normal zone: 124880 pages, LIFO batch:31
DMI 2.3 present.
Using APIC driver default
ACPI: RSDP (v000 HP ) @ 0x000fe270
ACPI: RSDT (v001 HP 30C4 0x31100620 HP 0x00000001) @ 0x1f7efc84
ACPI: FADT (v002 HP 30C4 0x00000002 HP 0x00000001) @ 0x1f7efc00
ACPI: MADT (v001 HP 30C4 0x00000001 HP 0x00000001) @ 0x1f7efcb8
ACPI: MCFG (v001 HP 30C4 0x00000001 HP 0x00000001) @ 0x1f7efd14
ACPI: SSDT (v001 HP HPQPpc 0x00001001 MSFT 0x0100000e) @ 0x1f7f6698
ACPI: DSDT (v001 HP DAU00 0x00010000 MSFT 0x0100000e) @ 0x00000000
ACPI: PM-Timer IO Port: 0x1008
ACPI: Local APIC address 0xfec01000
ACPI: LAPIC (acpi_id[0x01] lapic_id[0x00] enabled)
Processor #0 6:13 APIC version 20
ACPI: LAPIC_NMI (acpi_id[0x01] high edge lint[0x1])
ACPI: IOAPIC (id[0x01] address[0xfec00000] gsi_base[0])
IOAPIC[0]: apic_id 1, version 32, address 0xfec00000, GSI 0-23
[root@new55 ~]#
5. 如何通过距离度量学习解决Street?
本文从街道到商店(street-to-shop)问题的定义开始——从用户图像中识别衣服,并从网上商店找出它。你可曾有过这样的经历,在大街上看到某个人,然后不禁感叹,「哇哦,多么漂亮的衣服,我在哪里能买到它呢?」本文作者虽然没有过这样的经历,但是对其而言,尝试使用距离度量学习技术是一项很酷的任务。希望你也会觉得这很有趣。
Dataset数据集
首先,我们需要数据集。实际上,当我发现Aliexpress上有很多用户图像的时候我就有了这个想法。我心里想,「哇,我可以通过使用这种数据来搜索,当然是仅仅为了有趣」。为了简便,我决定重点关注女装。
下面是我所使用的类别:
连衣裙衬衣&衬衫卫衣和运动衫夹克和外套我使用requests(https://pypi.python.org/pypi/requests)和beautifualSoup(https://pypi.python.org/pypi/beautifulsoup4)来爬取图像。卖家的图像可从商品页面上获得,但是为了得到用户图像,我们需要浏览反馈页面。在商品页面上有一个叫做「colors」的属性,指的是另一种不同的颜色或者甚至是另一件商品,所以我们需要将不同颜色的衣服视为不同的商品。
商品页面上的「颜色」。
你可以在github上找到我用来得到关于一件服饰的所有信息的代码(https://github.com/movchan74/street_to_shop_experiments/blob/master/get_item_info.py)(它爬取到的信息甚至比我们任务中需要的信息还要多)。
我们需要做的就是通过每一个类别取浏览对应的页面,拿到所有商品的URL,然后使用上面提到的函数取得有关每个商品的信息。最终,我们得到了每个商品的两个图片集合:来自于卖家的图片(商品页面上每个「colors」对应的元素)以及来自于用户的图片(商品页面上每个「feedbacks」对应的元素)。
对于每个 color,我们只有一张卖家图片,但是可能具有多于一个的用户图像(然而有时候根本没有用户图像)。
很棒现在我们有数据了。然而得到的数据集有噪声:
用户图像中含有噪声(包裹箱子的照片,商品中一些无关区域的照片,以及刚拆开包装的照片)。用户数据中的噪声示例
为了减轻这个问题,我们给5000张图像打了两种不同类别的标签:好图片和噪声图片。起初,我计划训练一个分类器来清洗数据集。但是后来我决定将数据清洗分类器这项工作留在后面,仅仅将干净的数据用在测试集和验证集中。
第二个问题是,一些商品有好几个卖家。这些卖家有时候甚至用的是相同图像(经过轻微编辑)。那么如何处理这个问题呢?最简单的方法就是对数据不做任何处理,使用一个鲁棒的距离度量学习算法。但是这会影响到验证,因为在这种情况下,我们在验证数据和训练数据中有相同的商品。因此这就造成了数据泄露。另一种方式就是使用某种方法来寻找相似的(甚至完全相同的)商品,并将其合并。我们可以使用感知哈希来寻找相同的图像(例如phash和whash)。或者我们可以在噪声数据集上训练一个模型来寻找相似的图像。我选择了后者,因为这种方法可以合并经过轻微编辑的图像。距离度量学习
最常用的距离度量算法之一就是triplet loss:
其中, max(x, 0)是hinge函数,d(x, y)是x和y之间的距离函数。 F(x)是一个深度神经网络,M是边际,a是anchor,p是正例点,n是反例点。
F(a), F(p), F(n)都是由深度神经网络产生的高维空间中的向量。值得提及的是,为了让模型应对对照变化的时候更加鲁棒以及训练过程中具有更好的稳定性,这些向量需进行正则化处理,以拥有相同的长度,例如||x|| = 1。anchor和正例样本属于同一类别,反例点属于其他类别。
所以 triplet loss的主要思想就是使用一个距离边际M来区分正例对(anchor 和positive)的向量。
但是如何选择元组(a, p, n)呢?我们可以随机选择一个triplet,但是这样会导致以下问题。首先,存在N³种可能的triplet。这意味着我们需要花费很多时间来遍历所有可能的triplet。但是实际上我们没必要这么做,因为经过少数几次的训练迭代之后,很多元triplet已经符合triplet限制(例如0损失)。这意味着这些triplet在训练中式没用的。
最常用的triplet选择的方式就是hard negative mining:
实际上,选择最严格的负样本会在训练早期导致糟糕的局部最小值。尤其是,它能够导致一个收缩的模型(例如 F(x) = 0)),为了缓解这个问题,我们使用 semi-hard negative mining(半严格负样本最小化)。
半严格负样本要比anchor离正样本更加远,但是它们仍然是严格的(违背了triplet 限制),因为它们在边际M内部。
半严格负样本的triplet的限制条件。
下面是生成半严格和严格负样本的两种方式:在线和离线。
在线方式意味着我们从数据集中随机地选择样本作为一个mini-batch,并从这个Mini-batch中选择triplet。然而,在线方法需要一个较大的mini-batch。在我的情况中是不可能的,因为我只有一块具有8GB显存的GTX 1070。在离线方式中,我们需要在一段时间之后停止训练,为一定数量的样本预测向量,从中选择triplet并为这些triplet训练模型。这意味着我们要进行两次,然而这就是离线方法的代价。好了,现在我们可以开始用triplet loss和离线半严格负样本最小化来训练模型了。但是,为了成功地解决street-to-shop问题,我们还需要一个技巧。我们面临的任务是找到与用户照片最相似的卖家图像。然而,通常卖家的图像具有更高的质量,所以我们有两个域:卖家图像和用户图像。为了得到更有效的模型,我们需要减小这两个域之间的差距。这个问题就叫做域适应。
左边是用户的图像;右边是卖家的图像
我想出了一个非常简单的方法来减少这种域差距:我们在卖家图像中选择anchor,从用户图像中选择正例样本和负例样本。这个方法简单有效。
实现
为了实现我的想法并快速实验,我使用了基于TensorFlow的Keras库。
我选择inception V3作为模型的基本卷积网络。像往常一样我使用ImageNet权重初始化卷积神经网络。我在使用L2正则化的全局池化之后又加了两个全连接层,向量的维度是128。
def get_model(): no_top_model = InceptionV3(include_top=False, weights='imagenet', pooling='avg') x = no_top_model.output x = Dense(512, activation='elu', name='fc1')(x) x = Dense(128, name='fc2')(x) x = Lambda(lambda x: K.l2_normalize(x, axis=1), name='l2_norm')(x) return Model(no_top_model.inputs, x)
我们还需要实现triple 损失函数。我们传递一个anchor,正样本和负样本作为一个mini-batch,在损失函数中将其分为三个张量。距离函数就是欧氏距离的平方。
def margin_triplet_loss(y_true, y_pred, margin, batch_size): out_a = tf.gather(y_pred, tf.range(0, batch_size, 3)) out_p = tf.gather(y_pred, tf.range(1, batch_size, 3)) out_n = tf.gather(y_pred, tf.range(2, batch_size, 3)) loss = K.maximum(margin + K.sum(K.square(out_a-out_p), axis=1) - K.sum(K.square(out_a-out_n), axis=1), 0.0) return K.mean(loss)
并优化模型:
#utility function to freeze some portion of a function's argumentsfrom functools import partial, update_wrapperdef wrapped_partial(func, *args, **kwargs): partial_func = partial(func, *args, **kwargs) update_wrapper(partial_func, func) return partial_funcopt =keras.optimizers.Adam(lr=0.0001)model.compile(loss=wrapped_partial(margin_triplet_loss, margin=margin, batch_size=batch_size), optimizer=opt)
实验结果
结果:第一列-查询(用户图像),后五列-最相似的卖家图像。
性能衡量指标是R@K。
我们来看一下R@K是如何计算的。验证集里面的每张用户图像作为一次查询,我们需要找到对应的卖家图像。我们不仅使用了验证集中的卖家图像,还使用了训练集中的图像,因为这样可以使我们增加干扰数量,使得我们的任务更加具有挑战性。
所以我们就有一张查询图像,以及一些很相似的卖家图像。如果在K个最相似的图像中有对应的卖家数据,我们就返回1,否则就返回0。现在我们需要为验证集中的每一次查询返回这么一个结果,然后找到每次查询的平均得分。这就是R@K。
正如我之前讲到的,我从噪声图像中清洗了一部分用户图像。所以我在两个验证集上衡量了一下模型的质量:完整的验证集只包含干净数据的子验证集。
验证数据中的R@K
结果距离理想情况还很远,还有很多需要做:
从噪声数据中清洗用户图像。我在第一步中已经做了一部分。更加准确地合并相似的图像(至少在验证集中)。降低域差距。假设可以通过特定域增强的方法(例如亮度增强)以及其他特定的方法完成(例如这篇论文中的方法https://arxiv.org/abs/1409.7495)。应用其他的距离指标学习技术。我试了这篇论文中的方法(https://arxiv.org/abs/1703.07464),但是比我所用的方法性能要差一些。当然,要收集更多的数据。DEMO,代码和训练好的模型
我做了一个demo。你可以在这里看到vps389544.ovh.net:5555。你可以上传你自己的图像或者随便使用验证集中的图像来搜索。
代码和训练好的模型在这里:https://github.com/movchan74/street_to_shop_experiments。
6. no是出厂编号吗?
这个是生产批号,具体生产日期要看你买的什么东西,然后找到查询那个东西的官网,把这个批号输进去,上面就会显示生产日期是多久了。
生产日期是指商品在生产线上完成所有工序,经过检验并包装成为可在市场上销售的成品时的日期和时间,现在大多数企业都逐渐把产品的生产日期和生产批号统一化,另外,现行的强制性国家标准GB7718-2004《预包装食品标签通则》对生产日期(制造日期)给出了明确的定义:食品成为最终产品的日期。
7. chili口红底部标签?
底部标签为“Made in Italy”,“Net Wt. 0.12 oz/3.5g”,“Batch No.”和“Exp. Date”等信息。 因为这些信息是必须标注在化妆品包装上的,以确保消费者的安全和健康。其中,“Made in Italy”表示该产品的生产地,而“Net Wt. 0.12 oz/3.5g”则表示该产品的净重。而“Batch No.”和“Exp. Date”则是为了方便消费者追溯产品的生产批次和保质期。 此外,消费者在购买化妆品时,也需要注意这些标签信息,以确保产品的质量和安全。
本站涵盖的内容、图片、视频等数据系网络收集,部分未能与原作者取得联系。若涉及版权问题,请联系我们删除!联系邮箱:ynstorm@foxmail.com 谢谢支持!
1. batchno,如何通过优化sql语句提高数据库查询效率?
通过优化SQL语句,提高数据库查询效率,我总结了有这么几个方面:
减少数据访问看起来像一句废话,少访问数据当然可以提高速度了,减少数据访问有这么几个方法:
创建并正确使用索引
我们经常用到的就是B-TREE索引,我们经常说到的【索引】也指的是【B-TREE索引】。
正确使用索引可以让查询效率翻倍,但是如果使用不正确,也会对效率降低很多,比如这几种情况就会造成索引失效:
不等于操作:<>? 、not in('')
进行了运算后的字段:column+1(简单的运算),function(column)(函数)
含前导模糊查询:like '%xxx'
IS NULL
隐式类型转换:column是char类型,但是写成column = 123(右边是另外一种类型)
只通过索引访问数据有些时候,我们只需要访问表中的某几个列的数据,我们可以为这几个字段建立一个组合索引,这样的话只通过索引就可以得到数据,可以较小IO的开销。比如:
select name,gender from users where age='25';
如果这个SQL用的频率很高,那么我们可以建立一个组合索引:
create index index_xxx on users(name,gender,age);
在执行这个sql的时候,数据全部都是通过索引找到的,都不需要访问users表。
优化SQL执行计划执行计划表示SQL在执行时候的算法,有的时候SQL语句很复杂,就需要优化SQL的执行计划去提高SQL的执行效率。
其他可能不和SQL有直接的关系,但确实效率提升很明显,比如:
数据分页处理只返回需要的字段减少交互次数(batch DML)使用绑定变量(可以减少数据库服务器CPU运算)但是要注意,对SQL不要过度优化,满足需求即可。
希望我的回答能够帮助到你!
2. no是生产日期吗?
batch-no是生产日期的意思。
3. 批号英文缩写?
批号
Batch No.
生产批号就是在工业生产中,虽然原料和工艺相同,但是每一批投料生产出来的产品,在质量和性能上还是有差异的。为了事后追踪这批产品的责任,避免混杂不清,所以每一批产品都有相应的批号。
表示同一天投料次数号。如1991年11月29日第一批投料生产的药品,即应为911129-1,同一天第六批投料生产的药品,即为911129-6。
4. dmesg命令详解?
linux dmesg命令参数及用法详解(linux显示开机信息命令)
功能说明:显示开机信息。
语 法:dmesg [-cn][-s <缓冲区大小>]
补充说明:kernel会将开机信息存储在ring buffer中。您若是开机时来不及查看信息,可利用dmesg来查看。开机信息亦保存在/var/log目录中,名称为dmesg的文件里。
参 数:
-c 显示信息后,清除ring buffer中的内容。
-s<缓冲区大小> 预设置为8196,刚好等于ring buffer的大小。
-n 设置记录信息的层级。扩展阅读一:dmesg命令主要用途
主要应用:
dmesg用来显示内核环缓冲区(kernel-ring buffer)内容,内核将各种消息存放在这里。在系统引导时,内核将与硬件和模块初始化相关的信息填到这个缓冲区中。内核环缓冲区中的消息对于诊断系统问题 通常非常有用。在运行dmesg时,它显示大量信息。通常通过less或grep使用管道查看dmesg的输出,这样可以更容易找到待查信息。例如,如果发现硬盘性能低下,可以使用dmesg来检查它们是否运行在DMA模式:
$dmesg | grep DMA
...
ide0: BM-DMA at 0xf000-0xf007, BIOS settings: hda:DMA, hdb:DMA
ide1: BM-DMA at 0xf008-0xf00f, BIOS settings: hdc:DMA, hdd:DMA
...上面几行可以说明每个IDE设备正在什么模式下运行。如果以太网连接出现问题,那么可以在dmesg日志中搜索eth:
$dmesg | grep eth
forcedeth.c: Reverse Engineered nForce
ethernet driver. Version 0.49.
eth0: forcedeth.c: subsystem: 0147b:1c00
bound to 0000:00:04.0
eth0: no IPv6 routers present如果一切正常,那么dmesg显示每个网卡的硬件配置信息。如果某项系统服务未能得到正确的配置,dmesg日志很快就填满错误消息,这是诊断故障的良好起点。
还可以用来探测系统内核模块的加载情况,比如要检测ACPI的加载情况,使用dmesg | grep acpi
dmesg |egrep -i ''(apm|acpi)''
Kernel command line: vga=274 quiet console=ttyS3,9600acpi=no-idleoot=/dev/hda3
ACPI: Core Subsystem version [20010208]
ACPI: Subsystem enabled
ACPI: System firmware supports: C2
ACPI: plvl2lat=99 plvl3lat=1001
ACPI: C2 enter=1417 C2 exit=354
ACPI: C3 enter=-1 C3 exit=-1
ACPI: Not using ACPI idle
ACPI: System firmware supports: S0 S1 S4 S5
扩展阅读二:dmesg命令使用示例
使用示例
示例一 将开机信息发邮件
man dmesg 写道
The program helps users to print out their bootup messages. Instead of copying the messages by hand, the user need only:
dmesg > boot.messages
and mail the boot.messages file to whoever can debug their problem.
[root@new55 ~]# dmesg >boot.messages
[root@new55 ~]# ls -l boot.messages
-rw-r--r-- 1 root root 15838 12-09 12 begin_of_the_skype_highlighting
15838 12-09 12 免费 end_of_the_skype_highlighting:55 boot.messages[root@new55 ~]# mail -s "Boot Log of Linux Server" public@web3q.net <boot.messages
[root@new55 ~]#示例二 浏览dmesg输出的信息
[root@new55 ~]# uname -a
Linux new55 2.6.18-194.el5 #1 SMP Tue Mar 16 21:52:43 EDT 2010 i686 i686 i386 GNU/Linux[root@new55 ~]# dmesg | less
Linux version 2.6.18-194.el5 (mockbuild@x86-007.build.bos.redhat.com) (gcc version 4.1.2 20080704 (Red Hat 4.1.2-48)) #1 SMP Tue Mar 16 21:52:43 EDT 2010
BIOS-provided physical RAM map:
BIOS-e820: 0000000000010000 - 000000000009fc00 (usable)
BIOS-e820: 000000000009fc00 - 00000000000a0000 (reserved)
BIOS-e820: 00000000000e0000 - 0000000000100000 (reserved)
BIOS-e820: 0000000000100000 - 000000001f7d0000 (usable)
BIOS-e820: 000000001f7d0000 - 000000001f7efc00 (reserved)
BIOS-e820: 000000001f7efc00 - 000000001f7fb000 (ACPI NVS)
BIOS-e820: 000000001f7fb000 - 000000001f800000 (reserved)
BIOS-e820: 00000000e0000000 - 00000000f0000000 (reserved)
BIOS-e820: 00000000fec00000 - 00000000fec02000 (reserved)
BIOS-e820: 00000000fed20000 - 00000000fed9b000 (reserved)
BIOS-e820: 00000000feda0000 - 00000000fedc0000 (reserved)
BIOS-e820: 00000000ffb00000 - 00000000ffc00000 (reserved)
BIOS-e820: 00000000fff00000 - 0000000100000000 (reserved)
0MB HIGHMEM available.
503MB LOWMEM available.
Memory for crash kernel (0x0 to 0x0) notwithin permissible range
disabling kdump
Using x86 segment limits to approximate NX protection
On node 0 totalpages: 128976
DMA zone: 4096 pages, LIFO batch:0
Normal zone: 124880 pages, LIFO batch:31
DMI 2.3 present.
Using APIC driver default
ACPI: RSDP (v000 HP ) @ 0x000fe270
ACPI: RSDT (v001 HP 30C4 0x31100620 HP 0x00000001) @ 0x1f7efc84
ACPI: FADT (v002 HP 30C4 0x00000002 HP 0x00000001) @ 0x1f7efc00
ACPI: MADT (v001 HP 30C4 0x00000001 HP 0x00000001) @ 0x1f7efcb8
ACPI: MCFG (v001 HP 30C4 0x00000001 HP 0x00000001) @ 0x1f7efd14
ACPI: SSDT (v001 HP HPQPpc 0x00001001 MSFT 0x0100000e) @ 0x1f7f6698
ACPI: DSDT (v001 HP DAU00 0x00010000 MSFT 0x0100000e) @ 0x00000000
ACPI: PM-Timer IO Port: 0x1008
ACPI: Local APIC address 0xfec01000
ACPI: LAPIC (acpi_id[0x01] lapic_id[0x00] enabled)
Processor #0 6:13 APIC version 20
ACPI: LAPIC_NMI (acpi_id[0x01] high edge lint[0x1])
ACPI: IOAPIC (id[0x01] address[0xfec00000] gsi_base[0])
IOAPIC[0]: apic_id 1, version 32, address 0xfec00000, GSI 0-23
:
示例三 查看dmesg尾部的信息
[root@new55 ~]# dmesg | tail
Bluetooth: L2CAP ver 2.8
Bluetooth: L2CAP socket layer initialized
Bluetooth: RFCOMM socket layer initialized
Bluetooth: RFCOMM TTY layer initialized
Bluetooth: RFCOMM ver 1.8
Bluetooth: HIDP (Human Interface Emulation) ver 1.1
eth0: no IPv6 routers present
Installing knfsd (copyright (C) 1996 okir@monad.swb.de).
NFSD: Using /var/lib/nfs/v4recovery as the NFSv4 state recovery directory
NFSD: starting 90-second grace period
[root@new55 ~]#
示例四 安装SS7卡驱动时的内核日志
[root@localhost ss7dpklnx]# cd SS7HD_DRIVER/
[root@localhost SS7HD_DRIVER]# ls
bbdddlnx_iss.h bbd_hbi.h bbd_ioc.c bbd_isr.c bbd_pci.c BSD_license.txt GPL_V2-only_license.txt install_ss7hd.sh Makefile26
bbd_def.h bbd_hs.c bbd_ioc.h bbd_lnx.c bbd_pro.h build_ss7hd.sh i21555.h Makefile24
[root@localhost SS7HD_DRIVER]# ./build_ss7hd.sh
make: Entering directory `/usr/src/kernels/2.6.9-22.EL-i686'
CC [M] /root/setup/ss7dpklnx/SS7HD_DRIVER/bbd_hs.o
CC [M] /root/setup/ss7dpklnx/SS7HD_DRIVER/bbd_ioc.o
CC [M] /root/setup/ss7dpklnx/SS7HD_DRIVER/bbd_isr.o
CC [M] /root/setup/ss7dpklnx/SS7HD_DRIVER/bbd_pci.o
CC [M] /root/setup/ss7dpklnx/SS7HD_DRIVER/bbd_lnx.o
LD [M] /root/setup/ss7dpklnx/SS7HD_DRIVER/ss7hddvr26.o
Building modules, stage 2.
MODPOST
CC /root/setup/ss7dpklnx/SS7HD_DRIVER/ss7hddvr26.mod.o
LD [M] /root/setup/ss7dpklnx/SS7HD_DRIVER/ss7hddvr26.ko
make: Leaving directory `/usr/src/kernels/2.6.9-22.EL-i686'http://www.linuxso.com/command/dmesg.html[root@localhost SS7HD_DRIVER]# ./install_ss7hd.sh
[root@localhost SS7HD_DRIVER]# lsmod | grep ss7
ss7hddvr26 25808 0
[root@localhost SS7HD_DRIVER]# dmesg | tail
ACPI: PCI interrupt 0000:02:0d.0[?] -> GSI 9 (level, low) -> IRQ 9
BBD[0] 64bit
SS7HD[0] - suspend
Dialogic SS7HD Device Driver V100.00 (Source V1.21)
Copyright (C) Dialogic Corporation 2003-2010. All Rights Reserved
Using major device number 251.
ACPI: PCI interrupt 0000:02:0d.0[?] -> GSI 9 (level, low) -> IRQ 9
BBD[0] 64bit
[root@localhost SS7HD_DRIVER]# ./install_ss7hd.sh remove
[root@localhost SS7HD_DRIVER]# lsmod | grep ss7
[root@localhost SS7HD_DRIVER]# dmesg | tail
BBD[0] 64bit
SS7HD[0] - suspend
Dialogic SS7HD Device Driver V100.00 (Source V1.21)
Copyright (C) Dialogic Corporation 2003-2010. All Rights Reserved
Using major device number 251.
ACPI: PCI interrupt 0000:02:0d.0[?] -> GSI 9 (level, low) -> IRQ 9
BBD[0] 64bit
SS7HD[0] - suspend
[root@localhost SS7HD_DRIVER]#
示例五 打印并清除内核环形缓冲区
[root@new55 ~]# dmesg -c
Linux version 2.6.18-194.el5 (mockbuild@x86-007.build.bos.redhat.com) (gcc version 4.1.2 20080704 (Red Hat 4.1.2-48)) #1 SMP Tue Mar 16 21:52:43 EDT 2010
BIOS-provided physical RAM map:
BIOS-e820: 0000000000010000 - 000000000009fc00 (usable)
BIOS-e820: 000000000009fc00 - 00000000000a0000 (reserved)
BIOS-e820: 00000000000e0000 - 0000000000100000 (reserved)
BIOS-e820: 0000000000100000 - 000000001f7d0000 (usable)
BIOS-e820: 000000001f7d0000 - 000000001f7efc00 (reserved)
BIOS-e820: 000000001f7efc00 - 000000001f7fb000 (ACPI NVS)
BIOS-e820: 000000001f7fb000 - 000000001f800000 (reserved)
BIOS-e820: 00000000e0000000 - 00000000f0000000 (reserved)
BIOS-e820: 00000000fec00000 - 00000000fec02000 (reserved)
BIOS-e820: 00000000fed20000 - 00000000fed9b000 (reserved)
BIOS-e820: 00000000feda0000 - 00000000fedc0000 (reserved)
BIOS-e820: 00000000ffb00000 - 00000000ffc00000 (reserved)
BIOS-e820: 00000000fff00000 - 0000000100000000 (reserved)
0MB HIGHMEM available.
503MB LOWMEM available.
Memory for crash kernel (0x0 to 0x0) notwithin permissible range
disabling kdump
Using x86 segment limits to approximate NX protection
On node 0 totalpages: 128976
DMA zone: 4096 pages, LIFO batch:0
Normal zone: 124880 pages, LIFO batch:31
DMI 2.3 present.省略输出
Bluetooth: HIDP (Human Interface Emulation) ver 1.1
eth0: no IPv6 routers present
Installing knfsd (copyright (C) 1996 okir@monad.swb.de).
NFSD: Using /var/lib/nfs/v4recovery as the NFSv4 state recovery directory
NFSD: starting 90-second grace period
[root@new55 ~]# dmesg[root@new55 ~]# less /var/log/dmesg
Linux version 2.6.18-194.el5 (mockbuild@x86-007.build.bos.redhat.com) (gcc version 4.1.2 20080704 (Red Hat 4.1.2-48)) #1 SMP Tue Mar 16 21:52:43 EDT 2010
BIOS-provided physical RAM map:
BIOS-e820: 0000000000010000 - 000000000009fc00 (usable)
BIOS-e820: 000000000009fc00 - 00000000000a0000 (reserved)
BIOS-e820: 00000000000e0000 - 0000000000100000 (reserved)
BIOS-e820: 0000000000100000 - 000000001f7d0000 (usable)
BIOS-e820: 000000001f7d0000 - 000000001f7efc00 (reserved)
BIOS-e820: 000000001f7efc00 - 000000001f7fb000 (ACPI NVS)
BIOS-e820: 000000001f7fb000 - 000000001f800000 (reserved)
BIOS-e820: 00000000e0000000 - 00000000f0000000 (reserved)
BIOS-e820: 00000000fec00000 - 00000000fec02000 (reserved)
BIOS-e820: 00000000fed20000 - 00000000fed9b000 (reserved)
BIOS-e820: 00000000feda0000 - 00000000fedc0000 (reserved)
BIOS-e820: 00000000ffb00000 - 00000000ffc00000 (reserved)
BIOS-e820: 00000000fff00000 - 0000000100000000 (reserved)
0MB HIGHMEM available.
503MB LOWMEM available.
Memory for crash kernel (0x0 to 0x0) notwithin permissible range
disabling kdump
Using x86 segment limits to approximate NX protection
On node 0 totalpages: 128976
DMA zone: 4096 pages, LIFO batch:0
Normal zone: 124880 pages, LIFO batch:31
DMI 2.3 present.
Using APIC driver default
ACPI: RSDP (v000 HP ) @ 0x000fe270
ACPI: RSDT (v001 HP 30C4 0x31100620 HP 0x00000001) @ 0x1f7efc84
ACPI: FADT (v002 HP 30C4 0x00000002 HP 0x00000001) @ 0x1f7efc00
ACPI: MADT (v001 HP 30C4 0x00000001 HP 0x00000001) @ 0x1f7efcb8
ACPI: MCFG (v001 HP 30C4 0x00000001 HP 0x00000001) @ 0x1f7efd14
ACPI: SSDT (v001 HP HPQPpc 0x00001001 MSFT 0x0100000e) @ 0x1f7f6698
ACPI: DSDT (v001 HP DAU00 0x00010000 MSFT 0x0100000e) @ 0x00000000
ACPI: PM-Timer IO Port: 0x1008
ACPI: Local APIC address 0xfec01000
ACPI: LAPIC (acpi_id[0x01] lapic_id[0x00] enabled)
Processor #0 6:13 APIC version 20
ACPI: LAPIC_NMI (acpi_id[0x01] high edge lint[0x1])
ACPI: IOAPIC (id[0x01] address[0xfec00000] gsi_base[0])
IOAPIC[0]: apic_id 1, version 32, address 0xfec00000, GSI 0-23
[root@new55 ~]#
5. 如何通过距离度量学习解决Street?
本文从街道到商店(street-to-shop)问题的定义开始——从用户图像中识别衣服,并从网上商店找出它。你可曾有过这样的经历,在大街上看到某个人,然后不禁感叹,「哇哦,多么漂亮的衣服,我在哪里能买到它呢?」本文作者虽然没有过这样的经历,但是对其而言,尝试使用距离度量学习技术是一项很酷的任务。希望你也会觉得这很有趣。
Dataset数据集
首先,我们需要数据集。实际上,当我发现Aliexpress上有很多用户图像的时候我就有了这个想法。我心里想,「哇,我可以通过使用这种数据来搜索,当然是仅仅为了有趣」。为了简便,我决定重点关注女装。
下面是我所使用的类别:
连衣裙衬衣&衬衫卫衣和运动衫夹克和外套我使用requests(https://pypi.python.org/pypi/requests)和beautifualSoup(https://pypi.python.org/pypi/beautifulsoup4)来爬取图像。卖家的图像可从商品页面上获得,但是为了得到用户图像,我们需要浏览反馈页面。在商品页面上有一个叫做「colors」的属性,指的是另一种不同的颜色或者甚至是另一件商品,所以我们需要将不同颜色的衣服视为不同的商品。
商品页面上的「颜色」。
你可以在github上找到我用来得到关于一件服饰的所有信息的代码(https://github.com/movchan74/street_to_shop_experiments/blob/master/get_item_info.py)(它爬取到的信息甚至比我们任务中需要的信息还要多)。
我们需要做的就是通过每一个类别取浏览对应的页面,拿到所有商品的URL,然后使用上面提到的函数取得有关每个商品的信息。最终,我们得到了每个商品的两个图片集合:来自于卖家的图片(商品页面上每个「colors」对应的元素)以及来自于用户的图片(商品页面上每个「feedbacks」对应的元素)。
对于每个 color,我们只有一张卖家图片,但是可能具有多于一个的用户图像(然而有时候根本没有用户图像)。
很棒现在我们有数据了。然而得到的数据集有噪声:
用户图像中含有噪声(包裹箱子的照片,商品中一些无关区域的照片,以及刚拆开包装的照片)。用户数据中的噪声示例
为了减轻这个问题,我们给5000张图像打了两种不同类别的标签:好图片和噪声图片。起初,我计划训练一个分类器来清洗数据集。但是后来我决定将数据清洗分类器这项工作留在后面,仅仅将干净的数据用在测试集和验证集中。
第二个问题是,一些商品有好几个卖家。这些卖家有时候甚至用的是相同图像(经过轻微编辑)。那么如何处理这个问题呢?最简单的方法就是对数据不做任何处理,使用一个鲁棒的距离度量学习算法。但是这会影响到验证,因为在这种情况下,我们在验证数据和训练数据中有相同的商品。因此这就造成了数据泄露。另一种方式就是使用某种方法来寻找相似的(甚至完全相同的)商品,并将其合并。我们可以使用感知哈希来寻找相同的图像(例如phash和whash)。或者我们可以在噪声数据集上训练一个模型来寻找相似的图像。我选择了后者,因为这种方法可以合并经过轻微编辑的图像。距离度量学习
最常用的距离度量算法之一就是triplet loss:
其中, max(x, 0)是hinge函数,d(x, y)是x和y之间的距离函数。 F(x)是一个深度神经网络,M是边际,a是anchor,p是正例点,n是反例点。
F(a), F(p), F(n)都是由深度神经网络产生的高维空间中的向量。值得提及的是,为了让模型应对对照变化的时候更加鲁棒以及训练过程中具有更好的稳定性,这些向量需进行正则化处理,以拥有相同的长度,例如||x|| = 1。anchor和正例样本属于同一类别,反例点属于其他类别。
所以 triplet loss的主要思想就是使用一个距离边际M来区分正例对(anchor 和positive)的向量。
但是如何选择元组(a, p, n)呢?我们可以随机选择一个triplet,但是这样会导致以下问题。首先,存在N³种可能的triplet。这意味着我们需要花费很多时间来遍历所有可能的triplet。但是实际上我们没必要这么做,因为经过少数几次的训练迭代之后,很多元triplet已经符合triplet限制(例如0损失)。这意味着这些triplet在训练中式没用的。
最常用的triplet选择的方式就是hard negative mining:
实际上,选择最严格的负样本会在训练早期导致糟糕的局部最小值。尤其是,它能够导致一个收缩的模型(例如 F(x) = 0)),为了缓解这个问题,我们使用 semi-hard negative mining(半严格负样本最小化)。
半严格负样本要比anchor离正样本更加远,但是它们仍然是严格的(违背了triplet 限制),因为它们在边际M内部。
半严格负样本的triplet的限制条件。
下面是生成半严格和严格负样本的两种方式:在线和离线。
在线方式意味着我们从数据集中随机地选择样本作为一个mini-batch,并从这个Mini-batch中选择triplet。然而,在线方法需要一个较大的mini-batch。在我的情况中是不可能的,因为我只有一块具有8GB显存的GTX 1070。在离线方式中,我们需要在一段时间之后停止训练,为一定数量的样本预测向量,从中选择triplet并为这些triplet训练模型。这意味着我们要进行两次,然而这就是离线方法的代价。好了,现在我们可以开始用triplet loss和离线半严格负样本最小化来训练模型了。但是,为了成功地解决street-to-shop问题,我们还需要一个技巧。我们面临的任务是找到与用户照片最相似的卖家图像。然而,通常卖家的图像具有更高的质量,所以我们有两个域:卖家图像和用户图像。为了得到更有效的模型,我们需要减小这两个域之间的差距。这个问题就叫做域适应。
左边是用户的图像;右边是卖家的图像
我想出了一个非常简单的方法来减少这种域差距:我们在卖家图像中选择anchor,从用户图像中选择正例样本和负例样本。这个方法简单有效。
实现
为了实现我的想法并快速实验,我使用了基于TensorFlow的Keras库。
我选择inception V3作为模型的基本卷积网络。像往常一样我使用ImageNet权重初始化卷积神经网络。我在使用L2正则化的全局池化之后又加了两个全连接层,向量的维度是128。
def get_model(): no_top_model = InceptionV3(include_top=False, weights='imagenet', pooling='avg') x = no_top_model.output x = Dense(512, activation='elu', name='fc1')(x) x = Dense(128, name='fc2')(x) x = Lambda(lambda x: K.l2_normalize(x, axis=1), name='l2_norm')(x) return Model(no_top_model.inputs, x)
我们还需要实现triple 损失函数。我们传递一个anchor,正样本和负样本作为一个mini-batch,在损失函数中将其分为三个张量。距离函数就是欧氏距离的平方。
def margin_triplet_loss(y_true, y_pred, margin, batch_size): out_a = tf.gather(y_pred, tf.range(0, batch_size, 3)) out_p = tf.gather(y_pred, tf.range(1, batch_size, 3)) out_n = tf.gather(y_pred, tf.range(2, batch_size, 3)) loss = K.maximum(margin + K.sum(K.square(out_a-out_p), axis=1) - K.sum(K.square(out_a-out_n), axis=1), 0.0) return K.mean(loss)
并优化模型:
#utility function to freeze some portion of a function's argumentsfrom functools import partial, update_wrapperdef wrapped_partial(func, *args, **kwargs): partial_func = partial(func, *args, **kwargs) update_wrapper(partial_func, func) return partial_funcopt =keras.optimizers.Adam(lr=0.0001)model.compile(loss=wrapped_partial(margin_triplet_loss, margin=margin, batch_size=batch_size), optimizer=opt)
实验结果
结果:第一列-查询(用户图像),后五列-最相似的卖家图像。
性能衡量指标是R@K。
我们来看一下R@K是如何计算的。验证集里面的每张用户图像作为一次查询,我们需要找到对应的卖家图像。我们不仅使用了验证集中的卖家图像,还使用了训练集中的图像,因为这样可以使我们增加干扰数量,使得我们的任务更加具有挑战性。
所以我们就有一张查询图像,以及一些很相似的卖家图像。如果在K个最相似的图像中有对应的卖家数据,我们就返回1,否则就返回0。现在我们需要为验证集中的每一次查询返回这么一个结果,然后找到每次查询的平均得分。这就是R@K。
正如我之前讲到的,我从噪声图像中清洗了一部分用户图像。所以我在两个验证集上衡量了一下模型的质量:完整的验证集只包含干净数据的子验证集。
验证数据中的R@K
结果距离理想情况还很远,还有很多需要做:
从噪声数据中清洗用户图像。我在第一步中已经做了一部分。更加准确地合并相似的图像(至少在验证集中)。降低域差距。假设可以通过特定域增强的方法(例如亮度增强)以及其他特定的方法完成(例如这篇论文中的方法https://arxiv.org/abs/1409.7495)。应用其他的距离指标学习技术。我试了这篇论文中的方法(https://arxiv.org/abs/1703.07464),但是比我所用的方法性能要差一些。当然,要收集更多的数据。DEMO,代码和训练好的模型
我做了一个demo。你可以在这里看到vps389544.ovh.net:5555。你可以上传你自己的图像或者随便使用验证集中的图像来搜索。
代码和训练好的模型在这里:https://github.com/movchan74/street_to_shop_experiments。
6. no是出厂编号吗?
这个是生产批号,具体生产日期要看你买的什么东西,然后找到查询那个东西的官网,把这个批号输进去,上面就会显示生产日期是多久了。
生产日期是指商品在生产线上完成所有工序,经过检验并包装成为可在市场上销售的成品时的日期和时间,现在大多数企业都逐渐把产品的生产日期和生产批号统一化,另外,现行的强制性国家标准GB7718-2004《预包装食品标签通则》对生产日期(制造日期)给出了明确的定义:食品成为最终产品的日期。
7. chili口红底部标签?
底部标签为“Made in Italy”,“Net Wt. 0.12 oz/3.5g”,“Batch No.”和“Exp. Date”等信息。 因为这些信息是必须标注在化妆品包装上的,以确保消费者的安全和健康。其中,“Made in Italy”表示该产品的生产地,而“Net Wt. 0.12 oz/3.5g”则表示该产品的净重。而“Batch No.”和“Exp. Date”则是为了方便消费者追溯产品的生产批次和保质期。 此外,消费者在购买化妆品时,也需要注意这些标签信息,以确保产品的质量和安全。
本站涵盖的内容、图片、视频等数据系网络收集,部分未能与原作者取得联系。若涉及版权问题,请联系我们删除!联系邮箱:ynstorm@foxmail.com 谢谢支持!