一、网络结构
LeNet包含多个版本,通常所说的LeNet是指LeNet-5,网络结构如下图:

源代码:https://gitee.com/killf/deep-learning-notes
more >>最近在研究基于NPU的推理方法,编写的demo已经测试通过,但集成到项目中却发现各种问题。
1 | /home/killf/data/AndroidSdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/lib/gcc/aarch64-linux-android/4.9.x/../../../../aarch64-linux-android/bin/ld: warning: libz.so, needed by /home/sensing/face-api-deps/HIAI/HiAI_DDK_100.300.010.010/HiAI_DDK_100.200.010.011/DDK/ai_ddk_mixmodel_lib/lib64/libhiai.so, not found (try using -rpath or -rpath-link) |
期初以为这个错误是因为在不到libz.so和libstdc++.so引起的,事实上只需要加上-rpath-link即可解决问题。
1 | target_link_options(test_performance PRIVATE -Wl,-rpath-link=/home/killf/data/AndroidSdk/ndk-bundle/toolchains/llvm/prebuilt/linux-x86_64/sysroot/usr/lib/aarch64-linux-android/26/) |
一切都编译没问题,但启动的时候直接报Segmentation fault,连main函数中第一行代码都没有执行,所以这肯定是链接的问题,通过逐一排除的方法,发现问题出现在libhiai.so上面。
1 | [libprotobuf ERROR /home/sensing/github/protobuf-3.6.1/src/google/protobuf/descriptor_database.cc:58] File already exists in database: google/protobuf/descriptor.proto[libprotobuf FATAL /home/sensing/github/protobuf-3.6.1/src/google/protobuf/descriptor.cc:1358] CHECK failed: GeneratedDatabase()->Add(encoded_file_descriptor, size): terminating with uncaught exception of type google::protobuf::FatalException: CHECK failed: GeneratedDatabase()->Add(encoded_file_descriptor, size): |
这是因为libhiai.so中存在静态链接的protobuf,而我们的项目也是静态链接了protobuf,造成二次链接的问题。
写在前面:
这个文章核心并不是程序优化的具体技巧,而是拿到一个问题如何思考和利用工具的通用方法。比如即使我们不知道 profiler 这个东西,通过搜索”代码 每一行 时间”也可以很快知道有这样的工具叫做 profiler,并且学会怎么使用。即使不知道 rand 这个函数怎么加速,通过搜索引擎也可以找到别人写好的现成代码。另一方面是发现瓶颈之后也不要着急自己修复,如果不是特别一目了然的话,先看看别人是怎么做的。站在巨人的肩膀上,事半功倍。
我们很多的问题和技术细节,其实,只要我们认真将官方文档过一遍,会发觉大部分的问题和认识模糊的地方都消失了。甚至,你还能发现自己之前通过搜索获得的到一些资料,可能是不准确或者已经过时的。官方文档是真正的好东西,因为编写文档的人群,通常就是这些技术或者软件的开发者,他们才是对这些东西最了解的人,因此,他们写的文档质量是很高的,通常也是最新的。
官方文档的不足的地方,大概是中文版本不多,看起来可能会比较吃力。不过,请相信我,下载一个翻译辅助软件,慢慢看还是可以的。另一方面,就是这些文档编写者,通常是技术界大牛,他们编写文档有时候是基于他们自己的技术认知水平,跳过了很多基础概念,也增加了阅读难度。不过,这个我们也可以通过多查资料,慢慢看来解决,并且通常会带来额外的学习收获。
看源代码 1)意味着你可以看到以及学习优秀的代码;2)意味着即使源代码有坑,你也会提前在大脑有回路更容易找到问题所在。
看不懂源码意味着不同的几点:
1)你对这个库或者代码的功能不熟悉 (知道某段源码的功能及特点)
2)你不会用 Debug
3)你的算法基础薄弱
4)源码太过混乱
你需要反思自己属于哪一项。针对其中某一类下药上来直接从头看源码学东西一般是不可行的。你需要从上层入侵到下层。先用这段代码才能看懂源码。而不是在上层都不熟悉的基础上开始。任何重复的代码/重复的类似代码。意味着你框架设计有问题,或者开发语言的表达能力不够。
Java 的固定设计模式就是 Java 本身表达能力不够的表现。流程意味着生命周期,即你不仅需要抽象已知的流程。还需要在未提及的点留下一个坑 (函数/接口/钩子)。往往这些坑在以后的需求变更和项目扩展和维护中是救命的点。日志非常重要,日志环境也非常重要,debug 是基础技能,对应的是开发状态。日志则对应稳定的线上状态。而不能重现的 bug 占整个开发的非常多的时间。所以错误日志记录详细的环境意味着你可以更快的重现这个错误。
more >>行内公式
L_2=\sqrt{x\div2} => $L_2=\sqrt{x\div2}$\% => $\%$\infty => $\infty$cgit是一个github快速下载器,使用国内镜像,clone速度可达10M/s。
项目地址:https://github.com/killf/cgit.git
目前,已提供了Ubuntu和Mac的预编译程序,如果使用的是其他系统,可以采用源码编译安装。
linux下安装1
sudo wget http://cgit.killf.info/cgit_linux_latest -O /usr/local/bin/cgit && sudo chmod 755 /usr/local/bin/cgit
mac下安装1
sudo wget http://cgit.killf.info/cgit_mac_latest -O /usr/local/bin/cgit && sudo chmod 755 /usr/local/bin/cgit
编译安装1
git clone https://github.com/killf/cgit.git && sudo ./cgit/install.sh
cgit运行时与需要使用git,因此需要先安装git,如果需要使用其他路径的git,可配置环境变量GIT,如:
1 | export GIT=/usr/bin/git |
cgit的使用方法git与一样,事实上内部使用的也是git,使用时只需将命令替换成cgit即可,如下:
1 | cgit clone https://github.com/killf/cgit.git |


前几天刚把放到Github上的开源程序发布到开源中国,没想到很快就有网站联系说希望收录这款软件,于是重新整理了下帮助文档,文档比较简单,以后有空再完善。
SqlContext是一个轻量级的Sql帮助类,旨在提供一种快速、简洁、优雅地数据库访问方法。
相比于重量级的EntityFramework,SqlContext非常轻量化,包括空行和注释,代码也不过几百行;而相对于ADO.Net,SqlContext又非常简洁、灵活和优雅,你可以以一种直观的方式来访问数据库,而不必关心其实现的细节。本质上,SqlContext是对ADO.Net的封装,ADO.Net能做的事情SqlContext都能做到。
SqlContext的基本功能:
项目地址:https://github.com/killf/SqlContext
more >>最近,项目中需要使用本地SQLite库,由于EF框架太重,而直接采用ADO.Net又太麻烦,所以就简单的封装了个Sql库,支持CURD、事务、(简单的)ORM、多数据库支持等,项目地址:https://github.com/killf/SqlContext
使用时需要先引用SQLite支持库,使用方法如下:
more >>一直想做一个面向Web的自动化测试工具,而最近工作中刚好遇到类似的问题,于是就先写了个支持库,用于自动化模拟点击,以备后用。
自动化模拟点有什么用?
因为使用的是sudo安装docker,所以会导致一个问题。以普通用户登录的状况下,在使用docker images时必须添加sudo,那么如何让docker免sudo依然可用呢?解决方案如下。
1 | sudo groupadd docker |
1 | sudo gpasswd -a ${USER} docker |
1 | sudo service docker restart |
1 | newgrp - docker |
注意:最后一步是必须的,否则因为 groups 命令获取到的是缓存的组信息,刚添加的组信息未能生效,所以 docker images 执行时同样有错。
添加如下配置即可:
1 | { |
默认的字体样式实在是太丑了,看起来非常密集,可以安装Font Switcher插件切换字体试一试,再不行可以直接安装一个字体,并在配置文件中配置进去。
使用Settings Sync插件即可,需要有一个github账号。
安装插件vscode-translator
vscode的界面默认是英文的,ctrl + shift + p然后输入configure language,选择或安装中文语言即可。
安装桌面和一些依赖软件:
1 | sudo apt update |
1 | wget https://developer.download.nvidia.com/compute/cuda/11.5.0/local_installers/cuda_11.5.0_495.29.05_linux.run |
参考:
1 | sudo apt install -y libegl1-mesa |
参考:
1 | sudo dpkg -i turbovnc_2.2.6_amd64.deb |
注意,需要安装相应的window版本进行远程登陆
下载地址:https://sourceforge.net/projects/turbovnc/files/
1 | sudo dpkg -i libjpeg-turbo-official_2.1.1_amd64.deb |
下载地址: https://sourceforge.net/projects/libjpeg-turbo/
1 | sudo nvidia-xconfig --query-gpu-info # 查看busid |
重启后,检查安装的是否ok1
2xdpyinfo -display :0
/opt/VirtualGL/bin/glxinfo -display :0 -c
手动启动vncserver,也可以配置成开机启动1
sudo /opt/TurboVNC/bin/vncserver # 启动vnc服务,第一次启动时需要配置密码,使用window远程的时候需要输入
远程桌面登陆到服务上,使用vglrun命令启动应用程序1
2chmod +x ./Presenter.x86_64
vglrun ./Presenter.x86_64
1 | Closing an issue just means that the issue was resolved or was not something that needs to be addressed in VirtualGL. Continuing to discuss the same topic in the comments is OK, even if the issue is closed. |
tag:
缺失模块。
1、请确保node版本大于6.2
2、在博客根目录(注意不是yilia-plus根目录)执行以下命令:
npm i hexo-generator-json-content --save
3、在根目录_config.yml里添加配置:
jsonContent:
meta: false
pages: false
posts:
title: true
date: true
path: true
text: false
raw: false
content: false
slug: false
updated: false
comments: false
link: false
permalink: false
excerpt: false
categories: false
tags: true