圈圈
易百纳技术社区
易百纳技术社区
2.7w 访问量
8 原创专栏
8 资料
1 粉丝
个性签名:此E友还没有留下个性签名哦~
加入易百纳时间:2022-05-17

个人成就

易百纳技术社区 共获得 3 个点赞
易百纳技术社区 共获得 1 个收藏
易百纳技术社区 共获得 1 次评论/回复

个人勋章

分类专栏

Ta擅长的领域

暂无
按发布时间
按阅读量
按点赞量
  • 飞行时间 (ToF) 传感器用于一系列应用,包括机器人导航、车辆监控、人数统计和物体检测。它们依靠飞行时间原理来计算传感器与目标之间的距离,由于飞行时间传感器仅检测物体的存在,不捕获图像、视频或音频,因此它们无法识别人脸或跟踪个人的动作,也不会收集任何个人数据。这些传感器使用的信号是匿名的,不能链接到特定的个人。1 Terabee人流量统计器Terabee人流量统计器不会测量进出计数区域的人的身高,也不会收集有关性别,外貌,服装或其他个人数据的任何信息。2 Milesight人流统计测试报告测试覆盖区域安装高度、FoV以及覆盖区域测试结果一般场景下测试结果带帽时照明场景下环境的适应性影响因素结论使用3D人传感器技术,能有效的用于人流量统计,但是有些因素会影响检测结果,包括类人物体,光直射以及安装不当。
    2023-11-18
    0 0 926
  • 01 概述星闪技术作为新一代无线短距通信技术,标准化工作主要在星闪联盟进行。星闪标准体系主要由星闪接入层规范、基础服务层规范、基础应用层规范及其配套的支撑性规范构成。02 标准体系及关键技术星闪技术标准框架由星闪接入层、基础服务层、基础应用层构成。星闪接入层为上层数据提供无线通信传输目前, 星闪接入层可以提供两种无线短距通信接口(SLB 和 SLE)。两种技术面向不同的无线短距通信应用场景,互相补充并且将根据业务需求进行持续演进。SLB 主要用于承载以车载主动降噪、全景环视、车载娱乐为代表的业务场景,其显著特征是低时延、高可靠、精同步和高并发等。SLB 使用正交多载波(OFDM)波形支持极低时延无线帧;空口单向数据传输时延 小于 20.833us(业界最低时延);单载波支持 20MHz 带宽,最大支持 16 载波共 320MHz 带宽;最高速率支持编码速率 0.92 的信道编码、1024QAM 调制和 8 流多 路并行传输;最深覆盖支持编码速率 1/8 的信道编码和 QPSK 调制;SLB 支持数 据链路层数据透传模式,极大减小系统开销,提升系统多节点接入容量; SLB 支 持优化的接入资源配置,支持多用户低时延接入系统; •SLB 的相关标准化工作已经完成,性能指标评估结果参见表 2。SLE 主要用于承载包括胎压监测、无钥匙进入、无线电池管理系统在内的具备低功耗要求的业务场景。SLE 使用单载波传输。带宽支 持 1MHz、2MHz 和 4MHz; 调制方式支持 GFSK、BPSK、QPSK 和 8PSK;相比现有低 功耗无线短距技术,SLE 在相同深覆盖条件下可稳定支持 128kbps 音频传输;支 持更高速率(峰值 12Mbps);支持无损音频传输;支持可靠组播传输;支持数 百量级节点接入;SLE 的标准化工作将于 2021 年底完成,性能指标分析见表 3。基础服务层包含控制面和用户面控制面包括:通用类短距服务(设备与服务发现、连接管理、QoS 管理、测量管理、安全管理)通用类扩展服务(多域协调、5G融合)用户面包括:实时流、数据透传、数据广播、可靠传输。基础服务层通过定义不同的功能单元可为上层车载应用功能提供模块化服务。整体架构基于底层接入技术特性及上层业务需求进行适配设计以及跨层优化,构建相比传统无线短距技术的独特竞争力。基础应用层用于实现各类应用功能服务于包括智能网联汽车领域在内等不同场景。
    2023-11-18
    0 0 1480
  • 华为的Wifi技术解决方案一直处于领先地位,国内大部分使用的Wifi 6传输技术都是华为的研发成果。在制裁中,美国剥离了华为Wifi连接协议,华为只能做出了另起炉灶与国际组织抗争。在这方面,华为不得不潜心研究出一个近距离网络传输的新技术,于是星闪应运而生。但很多人对星闪一无所知,这个东西以后是有可能干掉蓝牙Wifi的。虽然蓝牙诞生29年,Wifi诞生了27年,设备生态已经根深蒂固,想要干掉它们不是一两天就能完成的。但星闪Nearlink这一个功能,就能干蓝牙和Wifi的事,并且比它们强很多倍。它将彻底颠覆无线连接方式,实现高速传输、低时延和高抗干扰能力,点亮万物互联的未来。你可以把它看作是WiFI和蓝牙两种技术的融合。星闪的两种无线通信接口,SLE星闪低功耗接入技术和SLB星闪基础接入技术精准对应了蓝牙和WiFi的应用场景,前者主要满足低功耗轻量级的连接需求,后者则负责处理高速率、富媒体场景的通信需求。目前蓝牙的连接范围是20米,星闪直接干到了600米。在传输距离下传输功率也大大加倍,蓝牙50Mbps,Wifi 500Mbps,星闪直接干到了900Mbps。这意味着星闪可以瞬间传输大量数据,包括高清视频和大文件,实现几乎实时的传输。延迟这方面,蓝牙是20毫秒,Wifi的延迟是100毫秒,而星闪是20微秒,这意味着星闪可以实现即时响应,在游戏竞技和语音通话等方面遥遥领先。星闪技术不仅可以连接数个设备,而且可以连接大量设备,这为智能家居和物联网等领域带来了很大的应用前景。蓝牙可以连接8个设备,Wifi可以连接256个设备,而星闪直接支持4096个设备同时连接。一毫秒内完成80个用户数据并发,这一点就是纯纯的降维打击。在人流密集、Wi-Fi密布的环境中,传统的无线连接技术常常受到干扰,会导致连接不稳定或音质下降。而星闪技术有高抗干扰能力,能带来更好的无线音频体验,甚至将音质提升到录音室级别。功耗低传输快,延迟低、链接稳、链接快、组网多,抗干扰性强,诸多优点集于一身,但使用星闪需要特制的芯片。现在已经有300家企业进行合作研发,这是为了开启下一个时代的到来。
    2023-11-17
    0 0 889
  • 内容简介本文介绍在BS25 1.0.T20.12版本开发工具下,默认的SDK无法编译的问题。此问题在之前版本的开发工具(比如BS25 1.0.T20.10)上没有发现,只有在本次更新中出现,至于后续版本,由于还没有拿到,自然也没有测试,不过大概率应该是会在后续版本中把此问题解决掉的。测试工具Operating system:Windows 10 homedeveco-device-tool-all-in-one:1.1.1_beta2DevTools_CFBB:1.0.5Compiler:CFBB IDE 1.0.3Sdk:20230928BurnTool:5.0.34DebugKits_CFBB:3.0.98Python:3.8.10VSCode:1.66.2Here we go在安装完必要的工具后(具体参考之前的文档),如果尝试build默认的sdk,会发现有以下错误:解决方法如下:修改以下文件:C:\Program Files\Huawei\DevEco-Device-Tool\platforms\platform-cfbb\builder\frameworks\cmake.py第57行的第二个PIPE改成STDOUT:注意,上述问题在之前版本上未发现,目前只有sdk-20230928(1.0.T20.12)上有发现,后续版本不确定会有。
    2023-11-15
    1 0 2220
  • 内容简介本文介绍如何选择和编译海思星闪BS25 SDK下的sle mouse工程。本文假设开发环境已经搭建完毕,具体搭建流程请参考《遥遥领先,华为海思星闪芯片BS25开发环境搭建》。测试工具Operating system:win10 homeCompiler:CFBB IDE 1.0.3Sdk:--BurnTool:NULLDebugKits:NULLPython:3.8VSCode:1.66.2Here we goSDK下有很多工程,具体编译哪个是需要配置的。找到DevTools_CFBB_V1.0.5下的env_start.bat并运行:运行后如图:切换到SDK目录:用以下命令进行编译的配置:回车后如下:选择Application:一步步下去,选择mouse或者dongle:选择哪个应该就会编译哪个,这个好像还不能都选。完成后按“S”键保存并按“Q”键退出。配置完成后,打开VSCode,重新编译工程,如何编译参考《遥遥领先,华为海思星闪芯片BS25开发环境搭建》。编译成功:将开发板(或鼠标板)和串口连接到电脑。工程配置中选择upload_port:设置烧录波特率:单击Upload进行烧录:点击后需要在150s内复位开发板:烧录成功后:完成后需要再次复位开发板。前面配置的是mouse程序,接下去配置dongle。Menuconfig配置程序为sle mouse dongle:完成后编译烧录。将dongle连接电脑,可以看到设备管理器中多了一个HID鼠标设备:从串口上可以看到dongle的log:此时把mouse上电后就可以看到SLE连接上的log了:这个时候,如果mouse的硬件和sensor跟默认程序匹配的话,就可以看到鼠标能够正常使用了。如果硬件与原始程序不匹配,则需要修改硬件相关的代码;上述串口的log也是建立在默认程序与硬件匹配的前提下的,如果log打印不正常,则需要分析串口硬件与代码是否匹配,这些会在以后的文章中一一介绍。
    2023-11-13
    0 0 1884
  • 内容简介星闪(SparkLink)不多做介绍,有兴趣可以自行查找资料,简单来说就是一种新型的无线规范,用于取代Bluetooth和Wifi,并且解决了一些蓝牙和wifi的痛点。BS25是海思推出的一颗支持星闪的SOC,本文介绍如何搭建海思星闪BS25开发环境。本文提到的软件需要自行向官方获取。测试工具Operating system:win10 homeCompiler:CFBB IDE 1.0.3Sdk:--BurnTool:NULLDebugKits:NULLPython:3.8VSCode:1.66.2Here we go第一步是安装DevEco Device Tool,双击deveco-device-tool-all-in-one-local-1.0.3-release.exe进行安装:安装目录不能有中文和特殊字符:这里会要求安装依赖:这里会检查python和VSCode,点击安装,这里安装会自动完成:然后再点击安装:等待安装完成。以管理员身份打开VSCode,关闭自动更新功能:Update:mode设置为manual:Ps:VScode设置为中文的办法:在扩展中搜索“Chinese (Simplified) (简体中文) Language Pack for Visual Studio Code”并做相应设置即可。如果遇到设置出错的情况,可以参考官方文档《BS25V100 SDK开发环境搭建用户指南00B02.pdf》里面有相应的解决方法。后续如果打开工具,出现提示升级的情况:一定一定不要升级,直接关掉即可!接下去是配置和编译把DevTools_CFBB_V1.0.3拷贝到和DevEco工具同一个目录下(也可以在其他目录下,这个无所谓):注意:上图中把DevTools_CFBB_V1.0.3放到了C盘,老司机强烈建议不要放C盘,否则会有意想不到的错误,下面文章中如出现在C盘,同样也请自行绕道,不过仅限于DevTools_CFBB,DevEco-Device-Tool可以放在C盘不受影响。然后解压SDK,并放到你喜欢的目录下,不要有中文路径。打开VSCode:选择导入工程,并选择路径:注意,如果之前已经导入过这个工程的话,需要删除以下两个文件后重新导入:当然也可以采用以前的配置直接导入。选择SO型号:导入完成后如下:打开工程配置选项:配置compiler_bin_path(路径就是前面拷贝的DevTools_CFBB_V1.0.3路径):然后就可以点击“PROJECT TASKS”中的“Build”进行编译了。等待编译成功:编译成功后,就可以将程序烧录到开发板中测试了,至于如何烧录,会在后续的文章中介绍。
    2023-11-10
    0 0 4226
  • 目录一:烧写uboot二:烧写内核三:烧写文件系统并设置启动参数四:查看我们的boot信息及内存说明五:执行挂载,进行应用程序开发拿到板卡后我们一般都会上电看到串口打印的信息,这个表示我们的板子里面已经有了boot文件,内核文件,操作系统文件,那么如何烧写我们的呢?下面手拉手带你一探究竟。一:烧写uboot拿到裸机芯片的第一次如果没有uboot那么就要使用hitools这个工具来烧写uboot了(hitools是海思提供的比较实用的工具,如果其他的板卡可能就要使用仿真器来完成烧写啦),我们的板子已经有了boot,我们直接使用网口tftp工具完成烧写即可,板子启动过程中点击任意键进入uboot命令模式:进入如下界面后:执行下面指令:mw.b 0x82000000 0xff 0x100000 tftp 0x82000000 u-boot-hi3516dv300.bin sf probe 0;sf erase 0x0 0x100000;sf write 0x82000000 0x0 0x100000 这里一个小插曲:因为我选错了uboot文件导致系统烧写失败,烧写失败是下面这个样子(一直上返00):那么接下来不好意思我就得使用hitools来烧写啦使用工具烧写时也有三种方式烧写1、  按分区烧写,烧写时选用好相关文件器件类型写spi nor 文件系统none 开始地址写0文件长度选1M,开始烧写断电上电2、  按地址烧写flash类型选spi nor 地址写0长度随便填读取文件后会相应变化选择相关文件点击开始烧写,断电上电3、  烧写fastboot方式烧写,选择器件spinor选择相关文件,断电上电,烧写成功重新烧写uboot成功后,以前的uboot就没用啦,这里就需要重新设置板卡的ip和服务器的ipsetenv serverip 192.168.2.102setenv ipaddr 192.168.2.100uboot启动成功是下面样子:笔记:这里来一个经验讲解:我第一次操作的时候在这里犯了错误,主要原因是自己太菜哈,这里设置服务器ip的时候很多开发者大佬都会说他们都是设置的主机ip地址,他们说这个的原因是他们一般都会把烧写文件放在window系统下打开一个tftp工具,然后将烧写文件放在这个工具目录下然后被tftp服务器找到,其实我们这里也可以把服务器ip设置为我们的虚拟机ip的,然后把我们的烧写文件放在tftpboot文件夹下,这是两个方法都可行哈,一定要注意把烧写文件放在对应文件夹下,不然传输错误是下面这样的(然后我一直认为传输正确):其实传输正确是这个样子的,会显示数据大小二:烧写内核ping下主机地址或者虚拟机地址第一次ping是alive就好,烧写内核,使用如下指令:mw.b 0x82000000 0xff 0x400000 tftp 0x82000000 uImage_hi3516dv300 sf probe 0;sf erase 0x100000 0x400000;sf write 0x82000000 0x100000 0x400000 烧写成功后如下样子:三:烧写文件系统并设置启动参数烧写内核时执行如下指令:mw.b 0x82000000 0xff 0x1b00000 tftp 0x82000000 rootfs_hi3516dv300_64k.jffs2 sf probe 0;sf erase 0x500000 0x1b00000;sf write 0x82000000 0x500000 0x1b00000 烧写完成后保证我们板卡启动,此时需要设置启动参数,(设置两点:boot向内核传递的启动参数,boot启动的命令)setenv bootargs 'mem=128M console=ttyAMA0,115200 coherent_pool=2M root=/dev/mtdblock2 rootfstype=jffs2 rw mtdparts=hi_sfc:1M(boot),4M(kernel),27M(rootfs)' setenv bootcmd 'sf probe 0;sf read 0x82000000 0x100000 0x400000;bootm 0x82000000' saveenv 然后输入reset启动,启动完成后如下:四:查看我们的boot信息及内存说明启动完成后使用printenv指令查看启动信息如下:这里的内存地址简单说一下,一般来说我们芯片直接交互的是内存数据哈,还是没有片上内存所以这里的都是DDR内存地址,所以一般来说拿到板子后我们应该查看我们的flash存储类型及大小,DDR的存储及大小,上面的烧写无非都是将数据传输到DDR地址然后再讲数据从ddr地址写到外部flash地址,经常搞电子的一般都会看得懂的,还是回到说存储吧,先说我们的flash,现在我们的flash用的是32M的,大家也可以用64M,128M的随便,我们的32M是留了1M给boot(sf erase 0x0 0x100000)这里擦除1M空间,我们的内核是给了4M的(sferase 0x100000 0x400000)我们剩余的的27M是给了文件系统的(sf erase 0x500000 0x1b00000),我们为什么要使用0x82000000这个地址,这个地址是ddr的地址,在这里可以看做是我们的内存地址。板卡一般的SDRAM是64M或者是256M的这些都懂的,说64M吧整体地址是80000000-83FFFFFF,这里一部分使用了为linux内存(系统使用的80000000-81ffffff)另一部分呢就是MMZ内存,我们是不占用系统使用的那一部分内存的,所以就从82000000开始啦五:执行挂载,进行应用程序开发当我们的板卡正常启动后此时ping我们的服务器(linux端)ping 192.168.2.11然后执行挂载命令:mount -t nfs 192.168.2.11:/home/dream/ipc /mnt-o nolock成功如下:
    2023-11-10
    0 0 1979
  • 前言:在平常的项目开发中我们编写的程序往往可能需要提供给别人使用,我们提供给第三方使用时可能就需要封装成SDK来供别人使用,在我们所有使用的IDE中都集成有封装成函数库的人机交互界面,因为这些IDE的基本编译工具都是GCC,下面我们就看下如何在Linux下使用GCC将我们的文件编译成静态库或者动态库吧。一、生成静态库生成静态库最终的文件是.a文件主要经过如下几个步骤:1、先用我们需要的工具生成o文件,表示我们的源文件没有语法错误,可以使用makefile文件管理,也可以使用GCC命令如下:arm-himix200-linux-gcc -c -o gpio.o gpio.c生成的o文件如下:2、接着我们使用指令将我们生成的o文件转换为静态库:arm-himix200-linux-ar crs gpio.a gpio.o(这里可以使用多个o文件具有调用关系的)生成的静态库文件如下:3、调用我们生成的静态库文件arm-himix200-linux-gcc -o mian.o gpio.a如果我们的a文件不在我们这个目录下后面需要加-L/目录/gpio.a二、生成动态库文件1、首先依旧是生成o文件,我们可以通过如下命令生成o文件或者通过makefile文件生成:arm-himix200-linux-gcc -c -o main.o main.c2、然后使用o文件来生成我们需要的so动态库文件:arm-himix200-linux-gcc -shared -o main.so main.o生成的动态库文件如下:三、注意事项    1、出错第一次生成动态库不成功的原因报错如下,说的是需要我加-fPIC选型,所以在生成o文件的时候我们需要加入这个选项,报错情况如下,希望大家借鉴:2、解决:编译时需要arm-himix200-linux-gcc -fPIC-shared -o main.o main.c这样编译才有效或者是在make文件中CFLAGS += -fPIC添加这个编译选型,这样再来生成库就不会报错了。3、这个fPIC是个什么选项(摘自网上):-fPIC 作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code),则产生的代码中,没有绝对地址,全部使用相对地址,故而代码可以被加载器加载到内存的任意位置,都可以正确的执行。这正是共享库所要求的,共享库被加载时,在内存的位置不是固定的。gcc -shared -fPIC -o 1.so 1.cPIC使.so文件的代码段变为真正意义上的共享如果不加-fPIC,则加载.so文件的代码段时,代码段引用的数据对象需要重定位, 重定位会修改代码段的内容,这就造成每个使用这个.so文件代码段的进程在内核里都会生成这个.so文件代码段的copy.每个copy都不一样,取决于 这个.so文件代码段和数据段内存映射的位置.也就是不加fPIC编译出来的so,是要再加载时根据加载到的位置再次重定位的.(因为它里面的代码并不是位置无关代码)。
    2023-11-10
    0 0 981
  • OFN 传感器概述。(A) OFN传感系统示意图;(B) 传感器未接触时的输出光照片,(C) 受到法向力,以及 (D) 同时受到法向力和摩擦力双手拥有一种令人惊叹的能力,可以非常准确地感知摩擦力,这都要归功于皮肤内的机械感受器。这种天生的天赋使人们能够灵巧地处理物品,毫不费力地使用工具,为日常生活注入令人愉快的灵活性。但是,如果这种触觉能力可以在机器人身上解锁呢?想象一下这样一个世界,机器人拥有探测和理解摩擦和滑动的神奇能力,就像我们一样。这个诱人的概念推动了对柔性触觉检测的追求,这是一个前沿领域,旨在为机器人配备类似于我们自己的触觉。通过巧妙地驾驭错综复杂的摩擦,机器人可以精确而优雅地征服各种各样的操作。想象一下这样一个世界,机器人拥有探测和理解摩擦和滑动的神奇能力,就像我们一样。这个诱人的概念推动了对柔性触觉检测的追求,这是一个前沿领域,旨在为机器人配备类似于我们自己的触觉。通过巧妙地驾驭错综复杂的摩擦,机器人可以精确而优雅地征服各种各样的操作。两个机器人触觉手指的照片和手指的分解图从绳结中获得灵感,一个有趣的想法出现了——聚合物光纤绳结。绳结的三维结构打破了纤维原来的圆形对称性,重新分配了纤维表面的负荷。反过来,这使得单个纤维单元能够对来自不同方向的力刺激做出独特的反应,从而有望创造复杂的3D力传感设备。聚合物光纤具有许多优点:紧凑、坚固、简化制造工艺和成本效益。这项研究揭示了它们对定向力的反应,并展示了它们在三维力测量方面的潜力。在这些知识的基础上,精心设计了一系列纤维结,并将其带入生活,实现了成功的3D力检测。通过将这些传感器集成到机器人的指尖,可以获得包括压力、摩擦和滑动在内的触觉信息。机器人手可以利用这种智能完美地执行高级任务,如自适应抓取和工具操作。这项工作发表在《光电进展》杂志上,介绍了一种通过结合结和光纤构建3D力传感器的新策略。通过对结的结构力学分析,研究人员成功地改进了结对压力、摩擦和滑移的传感性能。这种方法简化了系统的复杂性,克服了与信号解耦相关的计算挑战。机器人操作刀具和钥匙时的快照变化点检测算法的集成使实时数据处理和选择成为可能,从而形成机器人操作的触觉反馈系统。该系统测量法向和剪切力,并检测滑移,使机器人能够自适应地抓取物体和操作工具。本文展示的演示包括对移动物体的自适应抓取以及用双指机械手灵巧地操纵刀和钥匙。聚合物光纤的使用使结传感器重量轻,灵活,廉价。这种传感器的非金属性质使它不受电磁干扰。制造过程很简单,不需要复杂的微/纳米加工技术,大大降低了传感器生产的障碍。此外,聚合物光纤不仅可以作为传感元件,还可以作为信号传输通道。这一特点简化了传感器阵列的信号采集过程,有利于系统集成。此外,单个聚合物光纤可用于创建多个光纤结,通过结合功能材料或策略(如多波长信号复用)实现额外功能。
    2023-11-04
    0 0 659
  • AMD推出了7000系列Ryzen Threadipper处理器,将其5纳米Zen 4核应用于高端台式机和工作站。与上一代Threadipper部件一样,这些芯片大量借鉴了我们去年11月审查的Epyc数据中心对应产品,并采用了熟悉的计算和I/O芯片组合。与Epyc 4一样,工作站级Threadipper Pro具有12到96个内核,这取决于您是需要更多线程还是更高的时钟速度。AMD还延续了其传统,即在Threadipper部件上提供更高的升压时钟,根据SKU的不同,升压时钟为5.1至5.3GHz。以下是今天公布的Threadipper Pro零件明细:Threadipper Pro 7995WX:96核/192线程,基本时钟为2.5GHz,升压时钟为5.1GHz,热设计功率(TDP)为350W,总缓存为480MB。Threadipper Pro 7985WX:64核/128线程,基本时钟为3.2GHz,提升时钟为5.1GHz,TDP为350W,总缓存为320MB。Threadipper Pro 7975WX:32核/64线程,基本时钟为4GHz,提升时钟为5.3GHz,TDP为350W,总缓存为160MB。Threadipper Pro 7965WX:24核/48线程,基本时钟为4.2GHz,提升时钟为5.3GHz,TDP为350W,总缓存为152MB。Threadipper Pro 7955WX:16核/32线程,基本时钟为4.5GHz,提升时钟为5.3GHz,TDP为350W,总缓存为80MB。Threadipper Pro 7945WX:12核/24线程,基本时钟为4.7GHz,提升时钟为5.3GHz,TDP为350W,总缓存为76MB。AMD声称,与英特尔的工作站部件相比,更高的内核数量和时钟速度可以带来相当大的性能提升。AMD的96核7995WX与英特尔的56核W9-3495相比,在AutoCAD、Solidworks、Ansys Mechanical和Chaos V-Ray方面分别领先38%、43%、92%和123%。尽管提升时钟更高,但这不仅仅是一个更快的Epyc——I/O功能已经大幅缩减。Epyc 4具有128条PCIe 5.0通道,支持12通道DDR5 4800MT/秒内存和6TB RAM。Threadipper Pro保留了128个PCIe通道,但仅限于8个通道的DDR5和2TB的DDR5。内存带宽的损失可以通过本地对更快的5200mt /s内存的支持得到一定程度的补偿,而且使用AMD的EXPO预设,你可以获得更快的内存。升压时钟似乎也没有导致更高的TDP,因为芯片的额定功率都是350瓦。然而,如果有足够的冷却和电源,AMD的台式机部件的消耗量远远超过其规定的TDP并不罕见。与上一代Threadipper Pro零件不同,它具有工作站特定的sWRX8插座,所有7000系列零件都使用通用的sTR5插座。这意味着,除了支持AMD工作站级WRX90主板芯片组外,该芯片还可以用于主流TRX50板。如果你可以用更少的内核、PCIe通道和内存通道,AMD还更新了其非pro Threadripper系列,推出了针对高端桌面市场的三款cpu。这些芯片可以有24核、32核和64核的变体。和它们的Pro兄弟一样,它们都能提升到5.1到5.3 GHz之间——至少对于轻线程任务来说是这样。与其同类产品相比,7000系列Threadripper的I/O已经进一步减少到1TB内存,分布在DDR5 5,200MT/秒dimm的4通道和PCIe 5.0的48通道上。这比AMD上一代HEDT cpu Threadripper 3000的64通道少了16个通道。这意味着7000系列TRX50主板将仅限于三个全速x16 PCIe插槽。但这些车道的速度是上一代的两倍,所以应该没问题。
    2023-10-21
    0 0 616
  • 北京理工大学的科学家回顾了生物机器混合机器人的各种供能方法生物机器混合机器人(BHR)代表了新一代微型飞行器,通过在生物和人工系统之间建立接口来控制。与传统的仿生机器人相比,它们没有复杂的机械结构,并且由于直接采用动物身体,它们具有优越的运动特性和更低的能量需求。因此,BHR可以应用于许多重要场景,例如城市和荒野救援行动,环境监测和危险区域调查。为了实现长时间的任务续航能力,必须考虑控制背包的能量供给。由于不同的生物载体对能源设备的要求不同,BHRs的供电是一个重要的问题。北京理工大学的科学家们在一篇综述文章中总结了BHRs研究中供应装置的进展。这篇发表在《半机械人与仿生系统》(Cyborg and Bionic Systems)杂志上的新评论论文全面概述了BHRs研究中的各种能量供应方法,从为不同的生物载体选择化学电池到各种能量收集器的开发和应用。“你可能无法想象,有一天当你被困在野外时,第一个注意到你的求救信息并拯救你的将是一只动物。但这将在未来成为现实,”该研究的作者、北京理工大学教授赵杰良解释说。长期以来,仿生学科学家一直期望能够模仿大自然的生物结构。尽管科学家们已经设计和制造出各种各样的机器人来模仿自然界中动物的运动,但还没有仿生机器人能与动物身体本身的效率和可操作性相媲美。生物机器混合机器人(BHRs)已成为另一种新方法。BHRs利用动物作为载体,通过构建生物力学接口来调节载体的运动,以完成特定场景的任务。赵杰良说,用于为BHRs携带的控制背包和电子元件供电的能源供应单元决定了BHRs未来的发展和实际应用。新发表的综述分析了BHRs研究中的各种能量供应方法。该研究的作者将能源供应设备分为五类:化学电池、太阳能电池、生物燃料电池、生物热能采集器和生物振动采集器。他们分别分析了不同载体动物在化学电池选择中的关注点。例如,在为飞虫选择电池时,除了满足基本的电气要求外,还需要考虑整个电池的重量和尺寸,以确保载虫能够正常飞行。虽然电池的尺寸一直在减小,但较小的电池不能为bhr提供持续的能量,而且频繁充电会影响动物的寿命。因此,一些研究人员开始开发太阳能电池、生物燃料电池、生物热能收集器和生物振动能量收集器,为BHRs提供能量。在这篇综述中,他们的团队对BHRs自供电设备的当前研究进行了总结概述。“能量收集器可以有效地从周围环境或动物本身收集不同形式的能量,这可以实现BHRs的自供电,”赵杰良说。展望未来,该团队认为需要克服五个重要挑战。一是研制高能量密度供能装置。他们认为,随着新材料的创造和微纳米技术的进步,复合材料和微尺度结构设计是提高能量密度的主要方向。第二个考虑是开发能源供应装置的生物相容性,以避免可能影响动物寿命的严重免疫反应。第三个问题是复合能源供应。通过合理收集多种环境能源,应用多种能量转换机制,可以有效提高供能装置的空间利用效率,增加功率输出。第四个考虑因素是能源供应的稳定性,因为能源供应系统的长期稳定是有效控制BHRs的基本要求。最后要考虑的是环境友好型能源供应。由于BHRs在自然环境中使用,解决能源供应系统对环境的影响是一个至关重要的挑战。“BHRs能源供应的研究领域仍处于起步阶段,”赵杰良说。大多数研究只在实验室进行。BHRs作为一种新型概念机器人,在动物监测和野生动物救援等未来场景中具有重要的应用前景。能源供应系统直接决定了BHRs的实际应用。这一综述呼吁更多的研究人员关注这一领域,共同努力,克服能源供应方面的挑战,促进BHRs的实际应用。
    2023-10-21
    0 0 712
  • 目录一、平台/软件介绍和环境搭建RuyiStudio环境搭建网络训练方式的选择二、例程YOLOv3NNIE前向计算过程例程中对YOLOv3网络模型的初始化操作三、Blob(源Blob、输出Blob)和YOLOv3的输出关系图像的输入NNIE输出数据的内存分布图网络的NMS处理性能分析和优化思路结果获取和处理过程本文目标有两个:海思平台/软件做一个介绍和环境搭建。对例程YOLOv3NNIE前向计算过程的分析。一、平台/软件介绍和环境搭建Hi3516DV300 作为新一代行业专用 Smart HD IP 摄像机 SOC,集成新一代 ISP、业界最新的 H.265 视频压缩编码器,同时集成高性能 NNIE 引擎,使得 Hi3516DV300 在低码率、高画质、智能处理和分析、低功耗等方面引领行业水平。SVP(Smart Vision Platform)是海思媒体处理芯片智能视觉异构加速平台。该平台包含了CPU、DSP、NNIE(Neural Network Inference Engine)等多个硬件处理单元和运行在这些硬件上 SDK 开发环境,以及配套的工具链开发环境。NNIE(Neural Network Inference Engine)是海思媒体SoC中专门针对神经网络特别是深度学习卷积神经网络进行加速处理的硬件单元。目前NNIE配套软件及工具链仅支持以Caffe框架,且以Caffe-1.0版本为基础。使用其他框架的网络模型需要转化为Caffe框架下的模型。nnie_mapper,简称mapper,该工具将用户通过开源深度学习框架训练得到的模型转化成在Hi35xx芯片上或者在仿真库中可以加载的数据指令文件(*.wk)。RuyiStudio集成windows版的NNIE mapper、Runtime mapper和仿真库,具有生成NNIE wk功能、Runtime wk功能和仿真NNIE功能,同时具有代码编辑、编译、调试、执行功能、网络拓扑显示、目标检测画框、向量相似度对比、调试定位信息获取等功能。查看《指南》可知,YOLOv3中的特殊网络层(如Shortcut、Route、Upsample等)都已经被SVP工具支持(或可被类似功能网络层替换),这极大地方便了我们的移植,但如果想获得更高的性能,则必须进行二次开发,详见后文。在Windows平台上仿真网络模型所需的RuyiStudio和Mapper、仿真库之间的关系如下图1-1所示:图1-1 SVP-NNIE工具关系图RuyiStudio环境搭建具体的安装步骤可以分为:(1)安装wget-1.11.4-1-setup.exe(2)解压MinGW-w64-x86_64-7.3.0-release-posix-seh-rt_v5-rev0.7z到C:\mingw64目录。(3)解压msys+7za+wget+svn+git+mercurial+cvs-rev13.7z到C:\msys目录。(4)将HiSVP_PC_V1.2.0.0\tools\nnie\windows\ruyi_env_setup-2.0.41目录拷贝到C:\ruyi_env_setup目录下,该目录将作为最终SVP所需Python3.5+Caffe目录使用。(5)拷贝libraries_v140_x64_py35_1.1.0.tar.bz2文件到C:\ruyi_env_setup目录下。(6)在当前目录下建立python35目录,拷贝随文资源中Ruyi Python35 Lib Needed目录下所有压缩包到此目录,并执行C:\ruyi_env_setup\setup_python.bat。网络训练方式的选择最终的网络模型移植将在RuyiStudio工具中完成。因此我们应选取Caffe1.0神经网络计算框架或将最终模型文件转化为Caffe1.0的格式。整体的训练和开发流程如下图1-2所示:由上图可知,网络训练的重点在于如何得到网络的Caffe模型(*.caffemodel + *.prototxt)。在海思SVP开发SDK中,提供了可用于学习的YOLOv1~YOLOv3预训练模型的caffemodel文件和prototxt文件,它是从YOLO的Darknet版本生成的网络模型转化而来得到的。由此不难想到几种网络训练方式(叙述以YOLO为例):使用Darknet或其它框架(如Pytorch或Keras)训练网络,最后使用如Darknet2Caffe等工具对模型进行转化;查找已有的可训练版本的Caffe实现,适配编译得到的Caffe进行训练得到最终的模型;基于Caffe源码中的examples,编写YOLOv3的训练描述文件,适配编译得到的Caffe进行训练得到最终的模型。Python的版本(Python2.7 v.s. Python3.5)、CUDA版本和操作系统(Windows v.s. Linux)多种多样,故上述训练方式有众多的可组合路径。由于网络最终需要转换为Caffe模型,因此无论采用上述哪种方式,均需Caffe环境并为其添加Upsample,Focus等必要的算子。二、例程YOLOv3NNIE前向计算过程本节以SVP-NNIE例程中对YOLOv3的处理过程为例,简要记录整个处理流程及其中关键之处,并为后面使用NNIE加速网络预测打好基础。由于文档的形式并不适合解读源码,因此这里仅叙述一些程序理解上的关键之处。你在阅读源码的时候应该至少关注以下问题:使用NNIE加速神经网络模型的处理流程是怎样的?待检测图像是如何输入到网络模型中的?从NNIE中输出的预测结果数据的内存分布图是怎样的,与Pytorch框架下的网络输出结果是否一致?从网络输出到最终结果需要做怎样的NMS处理?示例程序的运行速度如何、主要性能瓶颈在哪里,以及实时性优化可以从哪些方面入手?例程中对YOLOv3网络模型的初始化操作阅读NNIE例程的时候,需要明白一些重要概念:网络分层网络分段的描述可参见《HiSVP API参考05版(2019-06-25)》P29。YOLOv3网络属于端到端的One-Stage网络模型,且在例程中由应用程序处理网络的最终输出,因此仅有一个网络分段。一个网络分段中可以包含众多的网络层。三、Blob(源Blob、输出Blob)和YOLOv3的输出关系YOLOv3模型具有一个输入层和3个输出层(YOLO层),因此具有一个源blob和3个输出blobs。Blob是Caffe框架中的基本类,用于网络层之间的数据传递。因此获取网络段的输出blob即为获取网络的最终输出数据。和大部分程序一样,在平台上运行网络模型同样遵循“初始化-使用-去初始化”的流程,在例程中,初始化完成的工作主要有:复制网络模型到MMZ内存并加载;为NNIE硬件计算申请所需内存,该片内存分为三个部分:模型计算所需要的辅助内存(u32TmpBufSize),具体大小由加载模型时得到的模型描述结构体提供;网络模型中各分段任务缓冲区(u32TotalTaskBufSize),具体大小通过调用 HI_MPI_SVP_NNIE_GetTskBufSize API获得;在各网络段之间传输的源Blob和输出Blob所占空间(astBlobSize),如原始图像和网络段输出等。为软件计算初始化必要的参数,并为用于处理网络输出数据的辅助空间申请所需内存。辅助空间存放从网络段输出Blobs得到的原始数据,这些数据经过后级计算、排序和NMS等操作,得到最终的输出结果(s32DstRoi、st32DstScore、u32ClassRoiNum)。辅助空间由两部分组成:用于存放从网络输出Blob获取的和计算过程中的临时数据的空间(u32TmpBufTotalSize),具体大小在例程库中通过 SAMPLE_SVP_NNIE_Yolov3_GetResultTmpBuf 函数计算。该部分空间又由三部分组成:用于完整获取各输出Blob的内存空间,空间大小为各网络段输出Blob的最大值;用于存储所有原始输出Blobs(即网络的3个YOLO层)的所有网格(即13×13、26×26、52×52)的所有输出目标(对应3个锚框)的信息(即4bbox+1objectness+80classes)的内存空间;其它临时变量(例程中为快排操作所需的SAMPLE_SVP_NNIE_STACK_S类型的结构体空间)。用于存放最终过滤后的目标结果的空间(u32DstRoiSize+u32DstScoreSize+u32ClassRoiNumSize)。图像的输入在程序初始化网络模型的硬件参数时,将申请的源blob内存空间地址记录在了 s_stYolov3NnieParam.astSegData[0].astSrc[0] 中,因此按照网络训练时的输入图像格式将待检测图像拷贝到源blob地址空间即可完成图像输入,而后需刷新MMZ缓存以同步数据。NNIE输出数据的内存分布图由于例程中使用的YOLOv3网络模型是从原作者Darknet网络预训练权重直接转化而来,因此网络输出数据格式也遵循了原网络输出。所不同的是:海思NNIE为了更好地进行加速,对每行数据进行了对齐操作(参见《HiSVP API参考05版(2019-06-25)》P30)。因此获取网络输出时需要略过这些用于对齐的无效字节。和输入一样,申请的输出blob内存空间地址记录在了astSegData[0].astDst[0:2]中,对应着YOLOv3网络的3个YOLO层。以13×13的YOLO网络层举例,其输出张量(13 × 13 × [ 3 × ( 4 + 1 + 80 ) ] 13×13×[3×(4+1+80)]13×13×[3×(4+1+80)])在内存中的存储布局如下图1-3所示:图 1-3 SVP-NNIE-YOLOv3网络输出内存分布图-1将数据按照特征图每行排列可以更直观地看到输出内存空间的全貌,如下图1-4所示:图 1-4  SVP-NNIE-YOLOv3网络输出内存分布图-2网络的NMS处理知道了输出数据在内存中的存储格式,那么例程又是如何对数据进行处理的呢?图 1-5 SVP-NNIE-YOLOv3网络后级处理如上图所示,处理函数遍历了3个YOLO网络层输出,每一次遍历将blob暂存在 pstSoftwareParam->stGetResultTmpBuf (在处理函数 SVP_NNIE_Yolov3_GetResult 中为 pf32Permute 指针)指向的空间内,而后对该blob数据进行Sigmoid计算和映射关系计算,得到每个网格针对每个锚框预测的bbox信息。遍历结束后,对这些bbox进行快排和NMS等操作即得到最终的输出结果。通过阅读转换函数可知,存储在 pf32Permute 指向的空间中的数据组织形式为:图 1-6 SVP-NNIE-YOLOv3网络结果转换blob临时空间内存分布图性能分析和优化思路在Hi3516DV300平台上执行YOLOv3实例程序是主要部分耗时如下:前向计算过程结果获取和处理过程例程使用的测试图像包含的目标较少,因此快排和NMS没有明显耗时,但从上述结果来看,网络的前项推理和后续对各输出blob的遍历的确花费了大量的时间。阅读代码可知,例程中遍历了所有网格(13×13、26×26、52×52)的所有预测(3个),并对坐标、置信度和类概率执行了Sigmoid计算,对宽高做了exp计算。仅浮点计算次数就以百万计,这其中不乏大量的空预测和无效预测,不加区分地处理每个输出严重浪费了处理器性能。对于例程中采用的结果处理方法,有以下几种改进策略:先进行过滤处理,再对有效预测结果做激活和映射等浮点运算每个网格会为每个尺度的anchorbox预测结果输出80个分类的类概率,而最终处理又仅会选取其中得分最大的作为最终结果类别,因此可先进行数值比较再对单一分类的结果做浮点计算。重新训练网络,减少网络预测的分类数减少网络分类数也就减少了网络的输出张量,进而在加快前向计算的同时降低了后级处理的开销。网络前向计算速度则快很多,但100ms+的耗时依然没有达到实时性要求,好在对于目标任务,我们并不需要像YOLOv3这样“完美”的网络,因此在网络深度和输出上有不少可裁剪甚至重新设计的空间。例如考虑到监控摄像头所处角度较高,因此拍摄到的目标较小,甚至不会占满半个屏幕,因此可以裁剪特征图较小的输出层;视频监控不需要严格定位目标的边界,而更倾向于对目标的检测和类别的识别,因此可以减少骨干网络后用于特征合并和坐标预测的网络层;另外,诸如“使用深度可分离卷积替换常规卷积核”和“对网络进行剪枝”等方法可能会对减小网络模型体积、提升网络预测速度有帮助。事实上,YOLO系列发展至今,从工程应用出发,基于YOLOv3改进已经没有太大的必要性了,在该系列后面的文章中,我们将看到一个更快、更轻、更好的YOLOv5模型,它将比YOLOv3更适合实时性的工程应用。附录(在caffe上添加网络层)添加网络层的一般步骤简述为:实现网络层的C++代码、头文件和CUDA代码,将头文件放在 /include/caffe/layers 目录下,将源文件放在 /src/caffe/layers 目录下;修改Caffe原型文件 src/caffe/proto/caffe.proto ,在 message LayerParameter 结构中增加新网络层定义,并分配不同于现有的标号;message LayerParameter{ # 早先的定义 ... optional NewLayerParameter newlayer_param = 1111; # 分配号不可重复,一般按顺序分配,此处仅为示例 }3.接上一步,在文件中(如最末尾处)为新网络层添加message LayerParameter描述,以告知网络层所需的参数; message UpsampleParameter{ optional 变量类型 变量名 = 变量值 [default = 默认值]; ... }4.在VS工程中增加对新网络层的编译,或重新生成VS工程;5.重新编译Caffe
    2023-10-13
    1 1 3869
  • 这是深度学习和神经网络的初学者指南。本文将讨论深度学习和神经网络的含义。特别是,这里将专注于深度学习在一些实践中的应用。深度学习到底是什么?您是否曾经想过Google的翻译器应用程序如何在几毫秒内将整个段落从一种语言翻译成另一种语言?Netflix和YouTube如何确定我们在电影或视频中的品味并提供适当的建议?甚至自动驾驶汽车又怎么可能做到驾驶建议?所有得这些都是深度学习和人工神经网络的产品。深度学习和神经网络的定义将在下面介绍。让我们首先从深度学习的定义开始。深度学习是机器学习的子集,而另一方面,机器学习是人工智能的子集。人工智能是一个通用术语,指的是使计算机能够模仿人类行为的技术。机器学习表示在数据上训练的一组算法,这些使所有这些成为可能。AI与ML与DL另一方面,深度学习只是受人脑结构启发的一种机器学习。深度学习算法试图通过不断分析具有给定逻辑结构的数据来得出与人类相似的结论。为此,深度学习使用称为神经网络的算法的多层结构。典型的神经网络神经网络的设计基于人脑的结构。就像我们使用大脑来识别模式并分类不同类型的信息一样,可以教会神经网络对数据执行相同的任务。神经网络的各个层也可以被认为是一种过滤器,其作用范围从整体到微小,都增加了检测和输出正确结果的可能性。人脑的工作与此类似。每当我们收到新信息时,大脑都会尝试将其与已知对象进行比较。深度神经网络也使用相同的概念。神经网络使我们能够执行许多任务,例如聚类,分类或回归。使用神经网络,我们可以根据数据中样本之间的相似性对未标记的数据进行分组或排序。或者在分类的情况下,我们可以在标记的数据集上训练网络,以便将该数据集中的样本分类为不同的类别。通常,神经网络可以执行与经典机器学习算法相同的任务。但是,事实并非如此。人工神经网络具有独特的功能,使深度学习模型能够解决机器学习模型无法解决的任务。为什么深度学习如此受欢迎?近年来,人工智能的所有最新进展都归因于深度学习。没有深度学习,我们就不会有自动驾驶汽车,聊天机器人或Alexa和Siri这样的私人助手。Google翻译应用程序将继续像10年前一样原始(在Google切换到该应用程序的神经网络之前),而Netflix或Youtube不知道我们喜欢还是不喜欢哪部电影或电视连续剧。所有这些技术的背后都是神经网络。我们甚至可以说,在人工神经网络和深度学习的推动下,今天正在发生一场新的工业革命。归根结底,深度学习是到目前为止我们对真实机器智能的最好的,最明显的方法。为什么深度学习和人工神经网络在当今行业如此强大和独特?最重要的是,为什么深度学习模型比机器学习模型更强大?下面向您解释。相比机器学习,深度学习的第一个优势是所谓的特征提取是不必要的。在使用深度学习之前,很早就开始使用传统的机器学习方法。例如决策树,SVM,朴素贝叶斯分类器和逻辑回归。这些算法也称为平面算法。这里的平面表示这些算法通常不能直接应用于原始数据(例如.csv,图像,文本等)。我们需要一个称为特征提取的预处理步骤。特征提取的结果是给定原始数据存在的规律进行的表示,这些原始数据现在可以被这些经典的机器学习算法用来执行任务。例如,将数据分类为几个类别。特征提取通常非常复杂,并且需要详细的统计和复杂网络知识。为了获得最 佳结果,必须对该预处理层进行多次调整,测试和完善。另一方面是深度学习的人工神经网络门类,这些门类不需要特征提取步骤。此外,这些神经网络层能够直接或独立地学习原始数据的隐式表示。在这里,原始数据越来越抽象和压缩的表示在人工神经网络的多层上的产生方式。输入数据的这种压缩表示会被用于产生结果,而该结果如同将输入数据分类为不同的类别。仅ML算法才需要特征提取换句话说,我们也可以说特征提取步骤已经是属于人工神经网络中进行的过程的一部分。在训练过程中,神经网络还优化了此步骤,以获得输入数据的最 佳可能抽象表示。因此,这意味着深度学习的模型几乎不需要或不需要人工来执行和优化特征提取过程。下面来看一个具体的例子。例如,如果您想使用机器学习模型来确定特定图像是否在显示汽车,我们人类首先需要确定汽车是汽车的独特特征(例如:汽车的形状,大小,窗户,车轮等),提取这些特征并将其作为输入数据提供给算法。这样,算法将对图像进行分类。也就是说,在机器学习中,工程师必须直接干预动作才能得出模型结论。在深度学习模型的情况下,完全不需要特征提取步骤。该模型将识别汽车的这些独特的特征并做出正确的预测。这就完全没有人类的帮助!实际上,避免提取数据特征适用于您将使用神经网络执行的所有其他任务。只要将原始数据提供给神经网络,其余的就由模型完成。大数据时代…深度学习的第二个巨大优势,以及了解深度学习为何如此受欢迎的关键部分是它由海量数据提供支持。技术的“大数据时代”将为深度学习新的创新提供大量机会。根据中国主要搜索引擎百度的首席科学家,谷歌大脑项目的负责人之一吴安德说,“ 与深度学习的类比是,火箭引擎是深度学习模型,而燃料是我们可以馈送到这些算法的大量数据。”深度学习算法随着数据量的增加而变得更好深度学习模型倾向于随着训练数据量的增加而提高其准确性,传统的机器学习模型(例如SVM和Naive Bayes分类器)在达到饱和点后就停止改善。生物神经网络在我们进一步使用人工神经网络之前,这里介绍一下生物神经网络背后的概念,因此当讨论人工神经网络时,我们可以看到与生物学模型的相似之处。人工神经网络的灵感来自大脑中的生物神经元。实际上,人工神经网络以非常简单的方式模拟了我们大脑中神经网络的一些基本功能。首先让我们看一下生物神经网络,以得出与人工神经网络相似的东西。简而言之,生物神经网络由众多神经元组成。生物神经网络模型典型的神经元由细胞体,树突和轴突组成。树突是从细胞体内出来的薄结构。轴突是从该细胞体中出现的细胞延伸。大多数神经元通过树突接收信号,并沿轴突发出信号。在大多数突触中,信号从一个神经元的轴突穿越到另一个神经元的树突。由于维持其膜中的电压梯度,所有神经元均具有电兴奋性。如果电压在很短的间隔内变化足够大,则神经元会生成称为动作电位的电化学脉冲。该电位沿轴突快速传播,并在到达突触时激活突触连接。人工神经网络现在我们对生物神经网络的功能有了基本的了解,让我们看一下人工神经网络的体系结构。神经网络通常由一组连接的单元或节点组成。我们称这些节点为神经元。这些人工神经元松散地模拟了我们大脑的生物神经元。人工前馈神经网络神经元用数字值(例如1.2、5.0、42.0、0.25等)的图形表示。两个人工神经元之间的任何连接都可以视为真实生物大脑中的轴突。神经元之间的连接是通过所谓的权重实现的,这些权重也不过是数值。当人工神经网络学习时,神经元之间的权重会发生变化,连接强度也会改变。含义:给定训练数据和特定任务(例如,数字分类),我们正在寻找允许神经网络执行某些确定的权重分类。如果每个任务和每个数据集的权重集都不同,我们无法预先预测这些权重的值,但是神经网络必须学习它们,学习的这一过程也称为培训。神经网络架构我们称第一层为输入层,输入层接收输入x,即神经网络从中学习的数据。在我们之前的手写数字分类示例中深度学习基础4:Tensorflow2.0数据集与神经网络的初探,这些输入x将代表这些数字的图像(x基本上是整个矢量,其中每个条目都是一个像素)。输入层具有与向量x中相同的神经元数量。含义:每个输入神经元代表向量x中的一个元素。前馈神经网络的结构最后一层称为输出层,输出层输出向量y,表示神经网络产生的结果。此向量中的条目表示输出层中神经元的值。在分类的情况下,最后一层的每个神经元将代表不同的类别。在这种情况下,输出神经元的值给出了特征x给出的手写数字属于一种可能类别(数字0–9之一)的可能性。可以想象,输出神经元的数量必须与类相同。为了获得预测向量y,网络必须执行某些数学运算。这些操作在输入和输出层之间的层中执行。我们称这些层为隐藏层。现在让我们讨论各层之间的连接如何。层连接下面考虑一个仅由两层组成的神经网络的较小示例。输入层具有两个输入神经元,而输出层则包含三个神经元。层连接如以上所述:两个神经元之间的每个连接都由一个数值表示,我们称它为权重。如图所示,两个神经元之间的每个连接都由不同的权重w表示。这些权重w中的每一个具有的索引值,这些索引的第一个值表示用来连接所源自的层中神经元的数量,第二个值表示连接所导致的层中神经元的数量。两个神经网络层之间的所有权重都可以由称为权重矩阵的矩阵表示。权重矩阵权重矩阵的条目数与神经元之间的连接数相同。权重矩阵的尺寸由通过该权重矩阵连接的两层的大小得出。行数对应于连接所源自的层中神经元的数量;列数对应于连接所导致的层中神经元的数量。在此特定示例中,权重矩阵的行数对应于输入层的大小为2,而列数对应于输出层的大小为3。神经网络中的学习过程现在我们更好地了解了神经网络架构,我们可以直观地学习神经网络的学习过程。让我们一步一步地做。通过上述,您已经知道第一步:对于给定的输入特征向量x,神经网络计算一个预测向量,在这里我们称之为h。正向传播此步骤也称为正向传播。使用输入向量x和连接两个神经元层的权重矩阵W,我们计算向量x和矩阵W之间的点积。这个点积的结果还是一个向量,我们称之为正向传播方程ž通过将所谓的激活函数应用于向量z来获得最终预测向量h。在这种情况下,激活函数由字母Sigma表示。激活函数只是执行从z到h的非线性映射的非线性函数。在这一点上,您可能会认识到神经网络中神经元背后的含义:神经元只是数字值的表示。让我们仔细看一下向量z。如您所见,z的每个元素都由输入向量x组成。此时,砝码的作用得以完美展现。一层中的神经元值由上一层神经元值的线性组合组成,这些线性值由一些数值加权。这些数值是权重,告诉我们这些神经元之间的相互连接程度。在训练过程中,这些权重被调整,一些神经元变得更紧密,某些神经元变得更稀疏。就像在生物神经网络中一样,学习意味着权重的改变。因此,z,h和最终输出向量y的值随权重而变化。一些权重使我们对神经网络的预测更接近实际的地面真实向量y_hat,一些权重增加了与地面真实向量的距离。现在我们知道了两个神经网络层之间的数学计算是什么样子,我们可以将知识扩展到一个由5层组成的更深层次的体系结构。与之前相同,我们计算输入x与第一权重矩阵W1之间的点积,并将激活函数应用于所得向量以获得第一隐藏向量h1。现在将h1视为即将到来的第三层的输入。重复从之前开始的整个过程,直到获得最终输出y为止:正向传播方程在获得神经网络的预测之后,在第二步中,我们必须将此预测向量与实际的地面真相标签进行比较。我们将地面真相标签称为向量y_hat。虽然向量y包含神经网络在正向传播过程中计算出的预测(实际上可能与实际值有很大不同),但向量y_hat却包含实际值。8.损失函数在数学上,我们可以通过定义一个损耗函数来测量y和y_hat之间的差,该函数取决于该差。一般损失函数的一个例子是二次损失:二次损失此损失函数的值取决于y_hat和y之间的差。差异越大表示损耗值越高,差异越小表示损耗值越小。最小化损失函数可直接导致神经网络的更准确预测,因为预测和标记之间的差异会减小。最小化损失函数会自动使神经网络模型做出更好的预测,而不管当前任务的确切特征如何。您只需为任务选择正确的损失函数。幸运的是,您应该只知道两个损失函数,即可解决您在实践中遇到的几乎所有问题。这些损失函数是交叉熵损失:交叉熵损失函数和均方误差损失:均方误差损失函数由于损失取决于权重,因此我们必须找到一组特定的权重,其损失函数的值应尽可能小。通过称为梯度下降的方法在数学上实现了使损失函数最小的方法。梯度下降在梯度下降过程中,我们使用损失函数(或损失函数的导数)的梯度来改善神经网络的权重。为了理解梯度下降过程的基本概念,让我们考虑一个神经网络的非常基本的示例,该神经网络仅由一个输入神经元和一个输出神经元组成,并通过权重值w连接。简单神经网络该神经网络接收输入x并输出预测y。假设该神经网络的初始权重值为5,输入x为2。因此,该网络的预测y的值为10,而标签y_hat的值可能为6。参数和预测这意味着预测是不准确的,我们必须使用梯度下降法找到一个新的权重值,该值会导致神经网络做出正确的预测。第一步,我们必须为任务选择损失函数。让我们以我之前定义的二次损失为例,并绘制此函数,该函数基本上只是二次函数:二次损失函数y轴是损耗值,它取决于标签和预测之间的差异,并因此取决于网络参数(在这种情况下为一个权重w)。x轴表示此权重的值。如您所见,存在一定的权重w,损失函数达到全局最小值。该值是最优权重参数,它将导致神经网络做出正确的预测,即6。在这种情况下,最优权重的值将为3:初始重量值另一方面,我们的初始重量为5,这会导致相当高的损失。现在的目标是重复更新权重参数,直到达到该特定权重的最 佳值为止。这是我们需要使用损失函数的梯度的时候。幸运的是,在这种情况下,损失函数是单个变量的函数,即权重w:损失函数针对该参数计算损失函数的导数:损失函数的梯度这里得到的结果为8,它为我们的初始权重所在的x轴上的相应点提供了斜率或损失函数的切线值。该切线指向x轴上损失函数和相应的权重参数的最高增长率。这意味着仅使用损失函数的梯度来找出哪些权重参数将导致更高的损失值。但是,我们想知道的恰恰相反。如果我们将梯度乘以负1并以这种方式获得梯度的相反方向,就可以得到想要的结果。通过这种方式,我们获得了损失函数最大降低率的方向以及导致这种降低的x轴上的相应参数:接下来,将执行一个梯度下降步骤,以尝试改善体重。我们使用此负梯度来沿权重的方向更新当前权重,对于这些权重,损失函数的值会根据负梯度减小:梯度下降步骤梯度下降步骤这个方程中的ε因子是一个称为学习率的超参数。学习速率决定您要更新参数的速度或速率。请记住,学习率是我们必须乘以负梯度的参数,学习率通常很小。以上的学习率为0.1。如您所见,梯度下降之后的权重w现在为4.2,并且相比梯度步骤之前的权重更接近最 佳权重。梯度下降后的新权重新权重值的损失函数的值也较小,这意味着神经网络现在能够进行更好的预测。您可以在脑海中进行计算,然后发现新的预测实际上比以前更接近。每次执行权重更新时,我们都将负梯度向下移至最 佳权重。在每个梯度下降步骤或权重更新之后,网络的当前权重将越来越接近最 佳权重,直到模型最终达到最 佳权重,并且神经网络将能够进行我们想要做出的预测。如此就完成了 整个模型学习的过程。
    2023-09-28
    0 0 496
  • 在监督式机器学习中,多类分类是一个普遍的问题。问题:给定一个包含m个训练示例的数据集,每个样本包含各种功能形式的信息和标签。每个标签对应于一个训练示例所属的类。在多类分类中,我们有一组有限的类。每个训练示例还具有n个功能。例如,在识别不同类型的水果时,“形状”,“颜色”,“半径”可以是特征,而“苹果”,“橙色”,“香蕉”可以是不同的类别标签。在多类分类中,我们使用训练数据训练分类器,并使用该分类器对新示例进行分类。本文的目的:将使用不同的多类分类方法,例如KNN,决策树,SVM等。我们将比较它们在测试数据上的准确性。我们将使用sci-kit learning(Python)执行所有这些操作。有关如何安装和使用sci-kit learning的信息,请访问http://scikit-learn.org/stable/方法从源加载数据集。将数据集分为“训练”和“测试”数据。训练数据上的训练决策树,SVM和KNN分类器。使用以上分类器来预测测试数据的标签。测量准确性并使分类可视化。决策树分类器–决策树分类器是一种用于多类分类的系统方法。它给数据集提出了一系列问题(与其属性/功能有关)。决策树分类算法可以在二叉树上可视化。在根节点和每个内部节点上,提出一个问题,并将该节点上的数据进一步拆分为具有不同特征的单独记录。树的叶子指的是数据集被拆分的类。在以下代码片段中,我们在scikit-learn中训练了决策树分类器。 # importing necessary libraries from sklearn import datasets from sklearn.metrics import confusion_matrix from sklearn.model_selection import train_test_split # loading the iris dataset iris = datasets.load_iris() # X -> features, y -> label X = iris.data y = iris.target # dividing X, y into train and test data X_train, X_test, y_train, y_test = train_test_split(X, y, random_state = 0) # training a DescisionTreeClassifier from sklearn.tree import DecisionTreeClassifier dtree_model = DecisionTreeClassifier(max_depth = 2).fit(X_train, y_train) dtree_predictions = dtree_model.predict(X_test) # creating a confusion matrix cm = confusion_matrix(y_test, dtree_predictions)SVM(支持向量机)分类器当特征向量是高维时,SVM(支持向量机)是一种有效的分类方法。在sci-kit学习中,可以指定内核函数(此处为线性) # importing necessary libraries from sklearn import datasets from sklearn.metrics import confusion_matrix from sklearn.model_selection import train_test_split # loading the iris dataset iris = datasets.load_iris() # X -> features, y -> label X = iris.data y = iris.target # dividing X, y into train and test data X_train, X_test, y_train, y_test = train_test_split(X, y, random_state = 0) # training a linear SVM classifier from sklearn.svm import SVC svm_model_linear = SVC(kernel = 'linear', C = 1).fit(X_train, y_train) svm_predictions = svm_model_linear.predict(X_test) # model accuracy for X_test accuracy = svm_model_linear.score(X_test, y_test) # creating a confusion matrix cm = confusion_matrix(y_test, svm_predictions)KNN(k最近邻)分类器– KNN或k最近邻居是最简单的分类算法。这种分类算法不依赖于数据的结构。每当遇到新示例时,都会检查其与训练数据中k个最近的邻居。两个示例之间的距离可以是它们的特征向量之间的欧式距离。k个最近邻居中的多数类被视为遇到的示例的类。# importing necessary libraries from sklearn import datasets from sklearn.metrics import confusion_matrix from sklearn.model_selection import train_test_split # loading the iris dataset iris = datasets.load_iris() # X -> features, y -> label X = iris.data y = iris.target # dividing X, y into train and test data X_train, X_test, y_train, y_test = train_test_split(X, y, random_state = 0) # training a KNN classifier from sklearn.neighbors import KNeighborsClassifier knn = KNeighborsClassifier(n_neighbors = 7).fit(X_train, y_train) # accuracy on X_test accuracy = knn.score(X_test, y_test) print accuracy # creating a confusion matrix knn_predictions = knn.predict(X_test) cm = confusion_matrix(y_test, knn_predictions)朴素贝叶斯分类器–朴素贝叶斯分类方法基于贝叶斯定理。之所以称为“朴素”,是因为它假设数据中每对特征之间都是独立的。令(x 1,x 2,…,x n)为特征向量,y为与该特征向量对应的类标签。应用贝叶斯定理,# importing necessary libraries from sklearn import datasets from sklearn.metrics import confusion_matrix from sklearn.model_selection import train_test_split # loading the iris dataset iris = datasets.load_iris() # X -> features, y -> label X = iris.data y = iris.target # dividing X, y into train and test data X_train, X_test, y_train, y_test = train_test_split(X, y, random_state = 0) # training a Naive Bayes classifier from sklearn.naive_bayes import GaussianNB gnb = GaussianNB().fit(X_train, y_train) gnb_predictions = gnb.predict(X_test) # accuracy on X_test accuracy = gnb.score(X_test, y_test) print accuracy # creating a confusion matrix cm = confusion_matrix(y_test, gnb_predictions)
    2023-09-28
    0 0 640
  • 假设你要想利用机器学习辨识手写文字,在训练时得到的训练误差很低,但是训练完的模型辨识文字的效果却不好,这是什么原因呢?在这篇文章,我们会用TensorFlow 建立一个模拟函数的模型,透过修改模型的容量与超参数,特意让模型发生过拟合与欠拟合,并观察究竟在何种情况会发上以上两种况。训练误差与测试误差首先,我们先来重新温习何谓训练误差与测试误差。在训练模型时,我们会使用损失函数评估预测值与真实值的误差,该误差称作训练误差(training error);在训练完模型后,任一训练资料以外的资料用于训练出的模型所产生的误差称作测试误差(testing error)。过拟合与欠拟合假设我们想要训练模型辨识手写文字,因此建立一个多层感知机的模型,在训练时会用训练误差与测试误差评估模型的泛化能力。如果训练误差总是无法降低,预测的准确率很低,我们会称这种情况为欠拟合(underfitting);而如果训练误差很低时,在训练资料的表现很好,但是却在在测试集上无法获得较好的结果,则会称这种情况为过拟合(overfitting)。接着,我们要来谈谈发生过拟合与欠拟合的两个主要原因:模型容量与训练的资料多寡。何谓模型容量?在机器学习的领域中,我们会说容量(capacity)是模型拟合数的能力。通常,越是复杂的模型其容量越高,但是容易造成过拟合。反之,越是简单的模型其容量越低,却容易导致欠拟合。以下的函数是线性回归的模型,其能够拟合的函数不外乎就是线性函数,如果资料成非线性的分布,则线性回归的模型较难拟合资料的规律,因此该模型的容量较低。如果是一个9 次方的函数模型,相较于线性回归模型,它较有能力拟合非线性的资料分布,因此该模型的容量较大。在选择模型时,必须选择适当容量的模型,避免发生过拟合或欠拟合。训练数据多寡机器学习的基本条件之一便是数据量,如果想要训练能够辨识手写文字的模型时,每一种文字只有寥寥无几的数据数量,尽管经过长时间的训练,一旦遇到风格非常不同的手写文字,模型便会失准。因此,如果数据过少,则训练出的模型容易发生过拟合的结果。模拟过拟合与欠拟合接着,我们尝试模拟过拟合与欠拟合发生的情况,将使用多项式回归(polynomial regression) 拟合以下函数,用拟合的结果解释过拟合与欠拟合。overfitting 与underfitting首先引入在这个范例中会使用到的套件,我们需要使用numpy 来产生数据,再者,利用TensorFlow 建立多项式回归的模型,学习资料隐藏的规律,最后,将会用matplotlib 视觉化模型拟合的情况。 import numpy as np import tensorflow as tf from matplotlib import pyplot as plt产生数据我们使用numpy 产生200 笔在常态分布中的数值作为features,并将这些数值带入目标函数生成labels,并将features 与labels 各分一半作为训练资料与测试资料。在生成labels 时,我们加入一些噪音资料,让资料的分布更符合现实中的情况。 true_w = [5, 1.2, -3.4, 5.6] features = np.random.normal(size=200) np.random.shuffle(features) labels = 0 for i in range(4): labels += true_w[i] * np.power(features, i) labels += np.random.normal(scale=0.1, size=labels.size) training_features, testing_features = features[:100], features[100:] training_labels, testing_labels = labels[:100], labels[100:]建立模型欲拟合的函数共有两个变数y与x,所以我们要定义两个tf.placeholder,在之后训练时传入资料。在定义运算时,首先定义多项式回归模型的最高次方e,并由e动态决定系数w的个数;接着,将运算各别加入串列中,最后再经由tf.add_n一次性地加入所有的运算至net。 e = 4 # 多項式回歸模型的最高次方 x = tf.placeholder(tf.float32) y = tf.placeholder(tf.float32) w = tf.Variable([1.0] * e, tf.float32) calculations = [] for i in range(e): calculations.append(tf.multiply(w[i], tf.pow(x, i))) net = tf.add_n(calculations)设定超参数接下来,我们有三个超参数要设定,分别是learning rate、batch size、epochs,以上三个超参数你都可以尝试调整成不同的数值,观察模型拟合函数的结果。 learning_rate = 0.01 batch_size = 10 epochs = 100设定损失函数与优化器在这个范例中,使用均方误差(Mean Squared Error, MSE) 作为损失函数,并使用梯度下降法优化参数。loss = tf.reduce_mean(tf.pow(net - y, 2)) train = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss)建立迭代器tf.data.Dataset在TensorFlow 1.4的版本中,从tf.contrib移至核心API,是一个可以用来迭代资料的函式库。我们使用tf.data.Dataset作为迭代资料的工具。 dataset = tf.data.Dataset.from_tensor_slices((training_features, training_labels)) dataset = dataset.repeat().batch(10) iterator = dataset.make_initializable_iterator() next_data = iterator.get_next()训练模型在开始训练之前,别忘记要初始化所有的变数以及用来迭代资料的迭代器。我们迭代的次数(epochs) 为100 次,可以尝试调整看看这个超参数,观察会发生什么事情。 train_loss = [] test_loss = [] init = [tf.global_variables_initializer(), iterator.initializer] saver = tf.train.Saver() with tf.Session() as sess: sess.run(init) for i in range(epochs): for _ in range(10): batch_x, batch_y = sess.run(next_data) sess.run([train, loss], feed_dict={ x: batch_x, y: batch_y }) trloss = sess.run(loss, feed_dict={ x: training_features, y: training_labels }) train_loss.append(np.mean(trloss)) teloss = sess.run(loss, feed_dict={ x: testing_features, y: testing_labels }) test_loss.append(np.mean(teloss)) saver.save(sess, './model{}.ckpt'.format(e))因为我们使用with-as开启Session,所以在with-as里面的程式码结束后,Session会自动关闭。如果你是初学者,可能在训练时会发现,一旦再重新开启一个Session,此时原本训练好的参数都不见了,所以我们在训练完模型时,必须要保存模型的参数。保存模型的参数可以使用tf.train.Saver(),所有在计算图中的资讯都会被储存在checkpoint (.ckpt档)中,当我们再次启动Session时,可以载入checkpoint回复之前的模型参数与状态。视觉化模型拟合函数首先载入模型参数与状态,接着用matplotlib 视觉化模型拟合函数的结果。我们分别视觉化2 次多项式模型、3 次多项式模型与4 次多项式模型和真实资料拟合的状况。 with tf.Session() as sess: saver.restore(sess, './model{}.ckpt'.format(i)) plt.figure(figsize=(15, 4.5)) plt.subplots_adjust(bottom=0.15) plt.subplot(121) plt.xlabel('x') plt.ylabel('y') plt.scatter(features, labels, 5) order = np.argsort(testing_features) order_features = testing_features[order] test_prediction = sess.run(net, feed_dict={ x: order_features}) plt.plot(order_features, test_prediction, 'r') plt.subplot(122) plt.xlabel('epochs') plt.ylabel('loss') plt.semilogy(range(1, epochs+1), train_loss, label='train') plt.semilogy(range(1, epochs+1), test_loss, label='test', linestyle='--') plt.legend(loc='upper right') plt.savefig('{}{}.jpg'.format(e, i), dpi=300, bbox_inches='tight')欠拟合(underfitting)我们视觉化2次多项式模型拟合函数的结果,发现的容量过低的模型不易拟合函数;再从右图可以看到训练误差与测试误差都没有收敛,所以我们可以判定模型发生了欠拟合。当模型欠拟合时,解决方法是增加模型的容量,就可能可以解决欠拟合。正常拟合接下来我们看到三次多项式的模型可以几乎很完美地拟合函式,从右图看到训练误差与测试误差非常地接近,而且随着迭代次数增加,模型慢慢地收敛,选择适当的模型可以顺利地拟合函数。过拟合(overfitting)容量大于实际上需要解决的问题时,容易发生过拟合的问题。以下的例子是四次多项式的模型,虽然模型随着迭代增加训练误差越来越小,但是训练误差与测试误差仍相差一段距离,可以判断该模型发生了过拟合的问题。另外一种会发生过拟合的情况是训练资料不足,我们刻意调整训练资料的数量至只有10 笔,当我们利用三次多项式拟合函数时,模型会发生过拟合。从这篇文章的例子中,你们会发现模型的容量与资料量的多寡皆会影响训练的结果,所以在训练模型前必须收集足够的资料与选择适当的模型,借此避免过拟合与欠拟合。
    2023-09-28
    0 0 507
  • 大家好,今天来聊聊机器学习中的相似度算法!在机器学习中,相似度算法是一种重要的技术,用于衡量和比较不同对象之间的相似程度。解释一下想象一下,你要给一组电影推荐系统编写一个算法。为了找到与用户喜好最相似的电影,你需要一种方法来比较电影之间的相似程度。相似度算法就是干这个的。它会计算两个对象(如电影)之间的相似性,以便你可以找到最匹配用户喜好的电影。基本原理相似度算法的核心思想是将对象表示为特征向量或特征矩阵,并使用合适的度量方法来比较它们之间的差异。通过计算这些差异的度量值,我们可以确定对象之间的相似程度。相似度公式解释相似度算法有多种度量方法,其中一种常见的方法是欧几里德距离(Euclidean Distance)。欧几里德距离用于计算两个对象之间的直线距离。以下是欧几里德距离的计算公式:在上述公式中,x和y是两个对象的特征向量,n是特征的数量,和是对象在第i个特征上的取值。当涉及到相似度算法时,还有其他一些常见的方法。曼哈顿距离(Manhattan Distance):曼哈顿距离是用于计算两个向量之间的距离的一种方法。它通过将两个向量中每个维度上的差值的绝对值相加来计算它们之间的距离。曼哈顿距离公式:2. 编辑距离(Edit Distance):编辑距离用于度量两个字符串之间的差异,即通过插入、删除和替换操作将一个字符串转换为另一个字符串所需的最小操作数。编辑距离公式:3. 余弦相似度(Cosine Similarity):余弦相似度是衡量两个向量之间夹角的相似性度量。它通过计算两个向量的点积与它们的模长之间的比值来度量它们之间的相似度。余弦相似度公式:4. 皮尔逊相关系数(Pearson Correlation Coefficient):皮尔逊相关系数衡量两个变量之间线性关系的强度和方向。它在数据集中的协方差和标准差上进行计算,可以用于衡量两个变量之间的相似度。皮尔逊相关系数公式:这是更多常见的相似度算法及其公式。每种算法都有不同的应用场景和特点,具体选择哪种算法取决于问题需求和数据类型。利用Python绘制相似度图像的代码示例以下是使用Python和matplotlib库绘制相似度图像的示例代码:import matplotlib.pyplot as plt import numpy as np def plot_similarity(similarity_matrix): plt.imshow(similarity_matrix, cmap='hot', interpolation='nearest') plt.xlabel('Object') plt.ylabel('Object') plt.colorbar() plt.show() # 创建一个相似度矩阵 similarity_matrix = np.array([[1.0, 0.8, 0.3], [0.8, 1.0, 0.6], [0.3, 0.6, 1.0]]) # 绘制相似度图像 plot_similarity(similarity_matrix)上述代码中,我们首先导入所需的模块。然后,定义了一个plot_similarity函数,该函数将相似度矩阵作为参数,并使用imshow函数将其可视化为热图。最后,使用colorbar函数添加颜色刻度。这篇文章能够以简单易懂的方式介绍相似度算法的基本原理、公式解释,并提供了一个使用Python绘制相似度图像的示例代码。通过理解相似度算法的原理和应用,您可以更好地处理和比较不同对象之间的相似程度。最后相似度算法在许多领域中都有广泛的应用。比如下面列举的:信息检索(Information Retrieval):相似度算法用于衡量文档之间的相似性,以便在搜索引擎或文本分类任务中找到与查询相关的文档。推荐系统(Recommendation Systems):相似度算法用于计算用户之间的兴趣相似度,从而基于用户历史行为和偏好向他们推荐个性化的产品、电影或音乐。聚类分析(Clustering Analysis):相似度算法用于将数据点分组成具有相似特征的集群,例如在市场细分、图像分割和社交网络分析中。图像识别(Image Recognition):相似度算法用于比较图像之间的相似性,例如在图像搜索、人脸识别和图像聚类等任务中。自然语言处理(Natural Language Processing):相似度算法用于计算两个文本之间的相似性,例如在文本匹配、问答系统和文档摘要生成中。模式识别(Pattern Recognition):相似度算法用于计算样本之间的相似性,以实现模式分类、图像识别和信号处理等任务。这些是相似度算法最常用的领域,但并不局限于此。相似度算法在许多其他领域中也有广泛的应用,如推荐系统、音频处理、网络分析等。它们帮助我们量化和比较数据之间的相似性,从而为各种任务提供基础支持和决策依据。
    2023-09-27
    0 0 593
  • 大家好,今天来聊聊机器学习中常用的XGBoost算法调参技巧!调参技巧XGBoost是一种基于梯度提升树的机器学习算法,其性能很大程度上依赖于模型参数的选择。 下面是一些常用的XGBoost算法调参技巧:学习率(learning rate):学习率控制每个回归树(boosting round)对最终预测结果的贡献程度。较小的学习率可以使模型更加稳定,但可能需要增加更多的回归树才能达到理想的性能。树的数量(n_estimators):决定了要训练的回归树的数量。过多的树可能导致过拟合,而过少的树可能无法捕捉到数据中的复杂关系。一种常用的方法是使用交叉验证来确定最 佳的树的数量。树的深度(max_depth):指定每棵回归树的最大深度。较深的树可以学习到更复杂的特征,但也容易过拟合。通常情况下,将max_depth设置为较小的值可以避免过拟合。最小样本划分(min_child_weight):定义每个节点所需的最小样本数。较大的值可以帮助减少过拟合,但可能导致欠拟合。通过调整该参数可以控制模型的复杂度。列抽样(colsample_bytree):指定每棵树在训练时使用的特征列的子样本比例。较小的值可以减少过拟合风险,但可能会降低模型的性能。正则化参数(lambda和alpha):正则化参数用于控制模型的复杂度,防止过拟合。lambda是L2正则化项的权重,而alpha是L1正则化项的权重。调整这些参数可以平衡模型的拟合能力和泛化能力。早停法(early stopping):在训练过程中使用早停法可以避免过拟合,并提前结束训练。通过追踪验证集上的误差,在连续若干轮中错误率没有明显改善时停止训练,可以节省训练时间并避免过拟合。调整第一次估计器(base_estimator):XGBoost的默认基础估计器是决策树,但你也可以尝试其他类型的基础模型,如线性模型。根据数据特点和问题需求,选择不同类型的基础模型可能会带来更好的性能。这只是一些常见的XGBoost算法调参技巧,实际应用中需要根据具体问题进行适当的调整和组合。通常情况下,使用交叉验证来评估不同参数组合的性能,并选择效果最好的参数组合。最小样本划分下面着重说说关于最小样本划分(min_child_weight) 最小样本划分是指定义每个节点所需的最小样本数。它可以控制模型的复杂度,防止过拟合。较大的最小样本划分值可以帮助减少过拟合风险,但可能导致欠拟合。通过调整这个参数,可以平衡模型的复杂性和泛化能力。在XGBoost中,参数min_child_weight表示每个子节点所需的最小样本权重总和。它的默认值为1,意味着每个子节点至少需要一个样本。增加min_child_weight将使模型更加保守,因为它需要更多的样本才会继续分 裂。下面是一个使用GridSearchCV进行交叉验证调参的示例代码:import xgboost as xgb from sklearn.datasets import load_boston from sklearn.model_selection import GridSearchCV # 载入数据集 boston = load_boston() X, y = boston.data, boston.target # 初始化XGBoost回归器 xgb_reg = xgb.XGBRegressor() # 定义参数网格 param_grid = { 'min_child_weight': [1, 5, 10, 20] } # 初始化GridSearchCV,使用交叉验证评估模型性能 grid_search = GridSearchCV(estimator=xgb_reg, param_grid=param_grid, cv=5) # 执行网格搜索 grid_search.fit(X, y) # 输出最 佳参数和最 佳得分 print("Best Parameter: ", grid_search.best_params_) print("Best Score: ", grid_search.best_score_)在这个示例中,通过GridSearchCV对min_child_weight进行了调参。将可能的取值1、5、10和20传递给param_grid。然后,通过交叉验证在训练集上训练不同参数组合的模型,并选择具有最 佳性能的参数。请注意,这只是一个简单的示例,实际应用中可能需要考虑其他参数的调优,同时也可以尝试更广泛的参数范围。
    2023-09-27
    0 0 730
  • 许多组织正在将财务资源投入到改进的数据验证解决方案中。这减轻了对基于数据质量差的决策相关风险的担忧,这些风险可能导致重大损失,甚至潜在的公司倒闭。 这些投资的一部分包括在AI(人工智能)领域进行创新。在当今的市场中,人工智能工具的快速加速是因为它们在通过自动化节省时间、金钱和人力资产方面具有令人难以置信的优势。 将人工智能的力量与数据验证系统和工具相结合,现在正在引领商业世界。这是确保用于洞察、流程优化和决策的信息在每一步都可靠的极好方法。 数据验证的作用 在考虑数据管理生命周期时,数据路径上的许多点都需要干净、可验证的资产才能使用。数据验证主动检查这些收集到的信息的准确性和质量,从源头一直到用于报告或其他形式的最终用户处理。 数据在使用前必须经过验证。这需要时间,但确保源信息的逻辑一致性有助于消除将劣质资产引入组织工具、系统和用户仪表板的风险。 每个组织都可能拥有自己独特的验证方法。这可能涉及一些简单的事情,例如确保收集的数据格式正确或满足给定处理要求的范围。即使是像确保源信息中没有空值这样简单的事情也会极大地影响利益相关者、客户、团队成员等使用的最终输出。 这些验证规则可能会根据生命周期阶段或数据管理过程而更改。例如: 数据引入可能包括有关确保所有数据提取例程完整、及时且在预期数据量范围内的规则。 数据转换可能涉及转换文件类型、根据业务规则转换数据以及将转换逻辑应用于原始数据。 数据保护可能需要分离资产,因此只有特定用户才能访问某些信息。 数据管理对于具有高度监督或监管规则的行业至关重要,并且涉及根据验证规则将数据筛选到各个位置。 为什么这些数据验证系统很重要?今天的决策依赖于准确、清晰和详细的数据。此信息需要可靠,以便经理、用户、利益相关者和利用数据的任何人都可以避免由于语法错误、时间安排或不完整的数据而被指向错误的方向。 这就是为什么在数据管理生命周期的各个方面使用数据验证至关重要的原因。 当然,当人工智能被引入到过程中时,这些操作会变得更加高效。这减少了人为错误的机会,并发现了以前可能从未考虑过的见解。虽然一些企业已经超越了人工智能解决方案,但其他企业正在将其数据系统基于各种验证方法。 应用数据验证的方法 随着数据验证在业务运营中变得越来越普遍,围绕确保质量结果的方法的争论越来越多。这可能与业务规模或内部团队的能力有关,而不是将验证需求外包给第三方。 无论论点如何,应用不同数据验证技术的方法往往属于以下三个阵营之一: 1.手动数据验证 这是通过在生命周期或管理过程中选择数据样本或数据提取,然后将其与验证规则进行比较来实现的。示例集表示更大的分组,应告知业务是否适当地应用了验证规则。 优点: 易于在数据集不太复杂的小型公司中实施。 允许对规则和验证技术进行更深层次的控制。 更便宜,因为不需要投资现代技术。 缺点: 非常耗时,依赖人力资产。 容易因人为错误而出错,因为这是一项平凡的重复性任务。 错误意味着返回并进行修复,从而导致明显的延迟。 在用户或客户端受到负面影响之前,可能不会捕获错误。 2.自动数据验证 这并不一定意味着基于人工智能的数据验证系统。这确实意味着验证工具的功能会极大地扩展,因为人为因素已从系统中移除。这样,可以更快地通过验证工具移动更多数据。 优点: 巨大的数据流容量。 允许将人力资产重定向到更具创造性的业务需求。 允许在没有人为错误的情况下引入逻辑规则。 可以实时清理数据,而不是事后清理数据。 缺点: 将新系统集成到当前的业务运营中可能需要很长时间。 通常涉及与具有复杂定价模型的第三方供应商合作。 可能很贵。 3.混合数据验证 顾名思义,数据验证的混合系统结合了手动和自动化工具的各个方面。它可以加快程序和数据流,同时还可以让人类仔细检查数据收集的特定区域,以确保自适应建模。 无论将哪个系统引入企业,人工智能的出现都改变了数据验证的竞争环境。不仅通过强大的自动化工具,而且使用可以根据业务需求学习和成长的逻辑框架。 支持 AI 的数据验证如何改变数据管理 数据必须对每个最终用户都是可靠的。否则,将没有对系统的信任,将错失提高效率、实现目标和宝贵见解的机会。 主动数据可观测性是通过支持 AI 的数据验证实现的操作改进之一。这有助于公司监控、管理和跟踪其各个管道中的数据;该过程不是依赖可能犯错误的人类,而是通过人工智能技术实现自动化,以提高效率。 人工智能对于数据工程师来说是一个巨大的优势,他们必须确保呈现的信息在整个生活方式(从源头到最终产品)中都是有条理和高质量的。拥有一个监控、捕获和分类异常或错误以供审查的系统,确保对通过公司移动的数据进行实时检查,自然会提高最终数据的质量。 人工智能的真正优势不仅在于可观察性,还在于自我修复和自动更正。诚然,在很多 情况下,人类需要介入来修复验证错误。尽管如此,在许多 情况下,通过自适应例程利用支持 AI 的数据验证基础设施可以通过消除数据收集或管理生命周期的任何其他阶段中的许多小问题来大幅改进流程。 当今的现代人工智能工具能够分解为各种数据验证过程。这允许支持软件的智能例程根据预测分析纠正和防止错误,这些预测分析只会随着时间的推移而改进。用于设计这些例程的历史数据越多,对潜在错误的预测就越准确,因为这些人工智能系统可以解释人类无法识别的模式。
    2023-01-12
    0 0 786
  • 可以使用人工智能 (AI) 和机器学习 (ML) 在机器中模拟人类智能。这些模拟使他们能够在没有太多人工帮助的情况下完成各种任务。如果公司要开发更高效、更新的 AI 和 ML 模型,就需要精确的训练数据。通过使用训练数据集,可以更好地了解给定的问题,这些训练数据集随后可以通过数据注释和标记进行丰富,以便进一步用作人工智能 (AI) 训练数据。 什么是机器学习? 机器学习的目标是通过使用数据和算法来模仿人类的学习过程。它逐渐提高了预测的准确性。统计方法允许训练算法,以使用机器学习在数据挖掘项目中进行分类或预测 - 这提供了对数据的关键见解。 理想情况下,数据挖掘可以改善业务和应用程序决策,通过这些见解影响关键增长指标。大数据的持续增长和发展将导致对数据科学家的需求增加,这要求他们确定最相关的业务问题以及回答问题所需的数据。 机器学习的类型 算法通过应用有监督、无监督、半监督和强化学习方法来学习提高其准确性。这四种基本方法根据算法的学习方式进行分类。数据科学家根据他们想要分析的数据选择哪种算法和机器学习类型。 监督学习:这些类型的机器学习算法需要标记的训练数据和变量,数据科学家希望算法评估相关性。在这里,算法的输入和输出都由数据科学家指定。 无监督学习: 它涉及从未标记的数据中学习的算法,其中算法扫描数据集以识别有意义的连接。所有预测或建议都由算法训练的数据预先确定。 半监督学习:机器学习有两种方法。在这种方法中,模型主要由数据科学家提供标记的训练数据,但它可以自由地自行探索数据并开发自己的见解。 强化学习:作为强化学习的一部分,数据科学家教机器如何完成由明确定义的规则控制的多步骤过程。在大多数情况下,算法决定如何自己完成一项任务,但数据科学家对它进行编程以完成它,并在它如何完成它时给它积极或消极的提示。 真实世界的机器学习用例 您可能每天都会通过以下方式遇到机器学习: 语音识别: 该技术也称为自动语音识别 (ASR)、计算机语音识别或语音转文本,使用自然语言处理 (NLP) 将人类语音转换为书面形式。许多移动设备在其系统中包括语音识别,以便用户可以进行语音搜索 - 例如Android智能手机中的Google Assistant,Apple设备中的Siri以及媒体设备中的AmazonAlexa。 顾客服务: 随着客户服务的增长,人工代理正在被在线聊天机器人所取代。我们看到网站和社交媒体平台的客户参与度发生了转变,因为这些公司围绕运输或产品交付或交叉销售产品推荐等主题提供常见问题 (FAQ) 的解答。例如,Slack和Messenger,以及虚拟代理和语音助手,是电子商务网站上具有虚拟代理的消息机器人的一些例子。 计算机视觉: 计算机和系统可以使用这种人工智能技术从图像、视频和其他视觉输入中收集有意义的信息;使用这项技术,他们可以根据这些输入采取行动。它与图像识别任务的区别在于它能够提供建议。计算机视觉在社交媒体上的照片标记、医疗保健中的放射成像和自动驾驶汽车行业的应用基于卷积神经网络。 推荐引擎: 在线零售商可以在结账时使用有关过去消费行为的数据向客户提供有用的附加建议。人工智能算法可以帮助我们发现数据趋势,以制定更有效的交叉销售策略。 自动股票交易: 在没有人工干预的情况下,人工智能驱动的高频交易平台每天执行数千或数百万笔交易,以优化股票投资组合。 什么是训练数据? 机器学习算法通过处理数据和查找连接来发展对数据集的理解。为了建立这种联系并在处理后的数据中找到模式,ML 系统必须首先学习。在“学习”之后,它可以根据学习的模式做出决策。ML 算法可以解决逆向观察中的问题——随着时间的推移,将机器暴露在相关数据中可以使它们不断发展和改进。训练数据质量直接影响 ML 模型的性能质量。 Cogito是一家领先的数据注释公司,协助AI和机器学习企业提供高质量的训练数据。在长达十年的数据采购过程中,该公司在培训数据的准确性和及时交付方面建立了信誉,以确保快速完成数据驱动的人工智能模型。 什么是测试数据? 使用训练数据构建 ML 模型时,您需要使用“看不见的”数据对其进行测试。此测试数据用于评估模型所做的未来预测或分类。验证集是数据集的另一个分区,在输入测试数据之前进行迭代测试;此测试允许开发人员在输入测试数据之前识别和纠正过度拟合。 使用测试数据执行正负测试,以验证功能对给定输入产生预期结果,并确定软件是否能够处理异常、异常或意外输入。由于测试数据管理策略可以通过将数据注释外包给行业专家来进行优化,因此您可以确保质量信息能够更快地到达测试用例。 训练数据集与测试数据集 ML 模型可以通过从训练数据中学习见解来学习模式,训练数据大约是要输入模型的完整数据集的 80%。测试数据表示实际数据集,因为它们评估模型的性能、监视其进度并使其倾斜以获得最 佳结果。 训练数据通常占整个数据集的 20%,而测试数据确认模型的功能。本质上,训练数据训练模型,测试数据确认其有效性。 使用数据注释和标注丰富数据集 构建和训练 ML 模型将需要大量训练数据。数据标注是向训练数据添加标签的过程。为了实现这一目标,ML 模型需要正确注释的训练数据,以便处理数据并获得特定信息。 数据注释通过连接所有点来帮助机器识别数据中的特定模式和趋势。企业必须了解不同的因素如何影响决策过程,以实现业务成功。数据注释服务是加速企业走向未来的关键。
    2023-01-12
    0 0 1029
  • Python 是全球最受欢迎的编程语言之一,越来越多的库和框架来促进 AI 和 ML 开发。Python 中有超过 250 个库,要知道哪一个最适合您的项目并跟上所有这些库带来的技术变化和趋势可能会有点令人困惑。 以下是我使用过的流行的 Python 机器学习库。我尽我所能根据哪些场景使用它们来整理它们。除了这些之外,还有更多的库,但我不能说我没有使用过的库,我认为这些是使用最多的库。 NumPy 与其他机器学习包不同,NumPy 是一个众所周知的通用数组处理包。对于第 n 维数组(向量、矩阵和高阶矩阵),NumPy 提供高性能(本机编译)支持和对各种操作的支持。它支持矢量化操作,特别是将 Python 表达式转换为隐式循环数据不同子集的低级代码调度。 NumPy函数 numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None, axis=0) 函数的 start 和 stop 参数(两者都是必需的)返回的值在预定的时间间隔内平均分布。 numpy.repeat 数组的元素使用 numpy.repeat(a, repeats, axis=None) 方法重复。第二个输入重复指定重复次数。 numpy.random.randint 函数numpy.random.randint(low, high=None, size=None, dtype='l')从[low, high]返回随机整数。如果高参数不存在(无),则从范围 [0, low] 中选择随机数。 为什么 Numpy 如此受欢迎? 简而言之,NumPy优化和预编译的C代码可以处理所有繁重的工作,使其比标准Python数组更快。NumPy使科学计算中经常使用的许多数学程序变得快速而简单。 Pandas Pandas正迅速成为数据分析中使用最广泛的Python库,因为它支持快速,适应性强和富有表现力的数据结构,可以处理“关系”和“标记”数据。有一些实际和现实世界的Python数据分析问题需要Pandas。Pandas提供彻底优化和高度可靠的性能。只有 C 或 Python 用于纯粹编写后端代码。 Pandas的一些功能 pd.read_csv, pd.read_excel 首先要提到的功能是read_csv或read_excel。这些函数已经提供了清晰的解释。我利用它们将数据从CSV或Excel文件读取为Pandas数据帧格式。 df = pd.read_csv("PlayerStat.csv") .read csv() 函数也可以使用以下语法读取.txt文件: data = pd.read_csv(file.txt, sep=" ") df.query() 布尔表达式可以筛选或查询数据。我可以使用查询函数作为字符串来应用过滤条件。与许多其他程序相比,它提供了更多的自由。 df.query("A > 4") 仅返回 A 大于 4 的行。 df.iloc() 我将行和列索引作为参数传递给此函数,该函数返回数据帧的相应子集。 df[‘’].dtypes 另一个非常基本和流行的功能。在开始任何分析、可视化或预测建模之前,我们必须知道变量的数据类型。使用此技术,可以获取每列的数据类型。 df.dtypes Pandas vs Vaex Vaex Python 是 Pandas 库的替代方案,它使用 Out of Core Dataframe 更快地计算大量数据。为了查看和研究大型表格数据集,Vaex是一个高性能的Python模块,用于惰性核心外数据帧(与Pandas相当)。我们每秒可以使用简单的统计数据计算超过十亿行。它支持各种可视化,允许大量交互式数据探索。 TensorFlow TensorFlow是由Google创建和发布的用于快速数值计算的Python库。Tensorflow使用的语言和函数名称与Theano略有不同,这使得从Theano切换比必须的更复杂。然而,Tensorflow中的整个计算图的操作与Theano中的计算图类似,具有相同的优点和缺点。即使对计算图的修改对性能有重大影响,Tensorflow 的评估函数也只是稍微容易观察中间状态。与几年前的Theano和Caffe相比,Tensorflow是一种首选的深度学习技术。 TensorFlow 内置函数 tf.zeros_like 此函数的输出是一个张量,其类型和形状与输入张量相同,但值为零。 tensor = tf.constant( I[1, 2, 3], [4, 5, 6]]) tf.zeros_like( tensor) # [ [0, 0, 0], [0, 0,0] 从输入图像创建黑色图像时,此功能可能会有所帮助。如果您希望直接定义表单,请使用 tf.zeros。如果您希望初始化 1 而不是 0,请使用 tf.ones_like。 tfpad 用常量值在其周围添加指定的填充,以增加张量的维数。 tf.enable_eager_execution 这在您运行 TensorFlow 应用程序时会有所帮助。使用预先执行时,无需在会话中构造和运行图形。以下是有关急切执行的更多信息。 “Eager execution”必须是导入 TensorFlow 后的第一条语句。 TensorFlow vs PyTorch Facebook支持Torch的Python实现Pytorch。它通过提供即时图编译与上述技术竞争,这使得 Pytorch 代码与周围的 Python 更兼容,因为它不将图视为不同且不透明的对象。相反,有许多灵活的技术可以动态地构建张量计算。它表现良好。它具有强大的多GPU功能,就像Tensorflow一样;然而,Tensorflow仍然适用于更实质性的分布式系统。虽然Pytorch的API有据可查,但Tensorflow或Keras更加完善。然而,Pytorch 在不影响性能的情况下在灵活性和可用性方面取得了胜利,这无疑迫使 Tensorflow 重新思考和调整。Pytorch最近严重挑战了Tensorflow,促使Google团队进行了调整。 Keras Keras是一个开源软件库,为人工神经网络提供Python接口。由于 Keras 名义上独立于引擎,因此如果引擎需要因性能或其他因素而需要更改,理论上甚至可以重用 Keras 代码。它的缺点是,每当您希望创建非常新颖或专门的架构时,您通常需要在 Keras 层下使用 Tensorflow 或 Theano。这主要发生在你需要使用复杂的NumPy索引时,它对应于Tensorflow中的收集/分散和Theano中的set/inc子张量。 Keras 函数 评估和预测 evaluate() 和 predict() 在 Keras 中都可用。这些技术可以利用 NumPy 数据集。当数据经过测试时,我完成了对结果的评估。我使用这些技术来评估我们的模型。 Keras 中的图层 每个 Keras 层中都有许多技术。这些层有助于构建、配置和训练数据。密集层有助于操作实现。我使用平面扁平化了输入。辍路使输入压路成为可能。我可以使用“重塑形状”工具重塑输出。我使用输入启动了一个 Keras 张量。 您可以获取中间层的输出。 一个相当简单的库是 Keras。它可以从层的中间层获取输出。您可以轻松地将新层添加到现有层中,以帮助您获得中间层的输出。 Theano Theano是一个Python库,并优化了一个编译器,用于操作和评估数学表达式,特别是矩阵值表达式。作为最古老和最成熟的为Theano提供了优点和缺点。大多数用户请求的功能都已添加,因为它是旧版本。但是,其中一些实现有点过于复杂且难以使用,因为没有先前的示例可遵循。文档还过得去,但模棱两可。由于没有简单的方法来检查中间计算,因此在Theano中让一个复杂的项目正常运行可能非常具有挑战性。它们通常使用调试器或通过查看计算图来执行调试。 Theano函数 声明变量 我用 dscalar 方法声明一个十进制标量变量。运行下面的语句时,它会将一个名为 C 的变量添加到程序代码中。 C = tensor.dscalar() 定义 Theano 函数 该函数接受两个参数,第一个参数是输入,第二个参数是函数的输出。根据下面的声明,第一个参数是两个项目 C 和 D 的数组。结果是指定为 E 的标量单位。 f = theano.function([C,D], E) 结论 我见过一个技术娴熟的Python程序员迅速掌握了新库的微妙之处,并了解如何使用它。但是,无论是作为初学者、中级还是专家,选择编程语言,或者在这种情况下选择库而不是另一种,在很大程度上取决于您项目的目标和需求。 如果你是一个数据科学家,看看Einblick。他们的数据工作流支持python代码。
    2023-01-12
    0 0 937
易百纳技术社区
共21条
  • 1
  • 2
易百纳技术社区