lr自动调整
先从吴恩达老师开始,了解指数加权(移动)平均的相关内容;
还是吴恩达老师,了解动量梯度下降;
接下来是吴恩达与李宏毅老师,了解lr自动调整,以及Adam优化算法
指数加权(移动)平均
Vt=βVt−1+(1−β)θtV_t = \beta V_{t-1} + (1-\beta)\theta_t
Vt=βVt−1+(1−β)θt
这里β=0.9\beta = 0.9β=0.9,VtV_tVt相当于计算平均11−β\frac{1}{1-\beta}1−β1即10天内的平均温度。
β\betaβ是给过去的权重,(1−β)(1-\beta)(1−β)是给当前的权重。
将上述公式展开,可看到其指数加权平均的过程。
Vt=0.1∗θ100+0.1∗0.9∗θ99+0.1∗0.92θ98+0.1∗0.93θ97+0.1∗0.94θ96+…V_{t}= 0.1\ast \theta _{100}+ 0.1\ast 0.9\ast \theta _{99}+ 0.1\ast 0.9^{2}\theta _{98}+ 0.1\ast 0.9^{3}\theta _{97}+ 0 ...
lr_scheduler
整理了一些常见的lr scheduler
环境:py3.9.13 + torch1.12.1
参考来自这位大佬的总结~~
123456789101112131415161718192021222324252627282930import torchimport torch.nn as nnfrom torch.optim.lr_scheduler import LambdaLR, StepLR, MultiStepLR, ExponentialLR, CosineAnnealingLR, ReduceLROnPlateau, _LRSchedulerfrom torch.utils.tensorboard import SummaryWriterinitial_lr = 0.1writer = SummaryWriter("logs/lr_scheduler")class model(nn.Module): def __init__(self): super().__init__() self.conv1 = nn.Conv2d( ...
yolo
我们对yolo系列算法模型进行了简要整理
yolov1
CVPR 2016 Joseph Redmon
You only look once, real-time object detection
deepsystems.io 很不错的 yolov1幻灯片讲解
单阶段模型、两阶段模型:
目标检测模型,大致可分为"单阶段模型"、"两阶段模型"两种。前者以YOLO, SSD, Retina-Net等模型为代表;后者以RCNN, Fast RCNN等模型为代表。
"两阶段"是指,先从图像中提取若干候选框,再逐一对这些候选框进行分类和坐标调整;"单阶段"是指,直接将图像喂到网络中,由网络直接输出最终的分类以及定位结果,一步到位,端到端。(以yolo为例,其无需提取候选区域,也无复杂的上下游处理工作。仅一次前向推断即可得到bounding box定位和分类结果。)
一般而言,两者的区别在于:两阶段模型更准,单阶段模型更快。
两阶段模型(如RCNN, Fast RCNN等),一个弊端是慢,另一个弊端在于 ...
OMNIVERSE AUDIO2FACE AND REALLUSION
Nvidia OMNIVERSE
老黄推出的元宇宙系列,其中Audio2Face可直接通过音频精准获取3d角色的面部动画。
下载NVIDIA Omniverse Launcher,安装Audio2Face*(但是现在找不到了?维护?下架?收费?)*
Nvidia官网、Youtube、B站都有很多相关的教程。本文简单记录一下我个人使用时踩到的一些坑。
简单填写一些信息即可下载,下载的时候可能需要科学上网,莫得办法…
初始页面:
其中若希望使用Nvidia提供的一些示例或素材,需安装Local Nucleus Service。
人脸模型驱动
以Nvidia提供的46位bs人脸模型为例,对其进行语音驱动。(苹果公司主推的ARKit 2面部追踪为52位bs,这个下文再说)。
首先隐藏char_male_model_hi,然后将如下路径的male_bs_46.usd文件拖入stage。
于Character Transfer选项卡下的Tools,点击MALE TEMPLATE,获取charTransfer,将两个新得到的人脸模型左右平移到适当位置。
选择Target Mesh,随 ...
Java线程中断
当我们点击某个杀毒软件的取消按钮来停止查杀病毒时,当我们在控制台敲入quit命令以结束某个后台服务时… 都需要通过一个线程去取消另一个线程正在执行的任务。Java没有提供一种安全直接的方法来停止某个线程,但是Java提供了中断机制。
一个线程不应该由其他线程来强制停止,而是应该由该线程自己自行停止。所以Thread.stop,Thread.suspend,Thread.resume都已经被废弃了。
Thread.interrupt()的作用其实也不是中断某一个线程,而是通知某一个线程你该中断了。具体到底中断还是继续运行,应该由被通知的线程自己处理。具体来说,当对一个线程调用interrupt()方法时:
如果线程正处于阻塞状态(例如sleep,wait,join等状态),那么线程将立即退出阻塞状态,并抛出一个InterruptedException异常,同时清除中断标志。仅此而已。
如果线程正处于正常运行状态,那么会将该线程的中断标志设置为true,仅此而已。被设置中断标志的线程将继续正常运行,不受任何影响。
如果一个线程有需要被中断的需求时:
在正常运行任务时, ...
Java线程池简单实现
线程池优势:
线程的创建和销毁浪费着系统资源。
1234public interface JobRun { // Job的具体工作内容 void concreteJob();}
12345678910111213import java.util.concurrent.TimeUnit;public class Job implements JobRun { @Override public void concreteJob() { System.out.println("执行某一个工作,耗时1s"); try { TimeUnit.SECONDS.sleep(1); } catch(InterruptedException e) { e.printStackTrace(); } }}
123456789101112public in ...
Java中的锁-Lock
lock与synchronized的区别:
lock是一个接口,synchronized是关键字。前者可以程序员自己DIY功能,实现自定义同步组件;后者是JVM来维护的。
lock需要手动加解锁,synchronized自动完成加解锁。
synchronized修饰的代码执行异常时,自动释放线程占有的锁,不会出现死锁;lock异常时需在finally中unlock(),否则死锁。
lock可以让线程“在等待锁的过程中(即阻塞时)”响应中断,如tryLock;而synchronized在“等待锁的过程中(即阻塞时)”无法响应中断。
synchronized只能是非公平锁,而lock可公平和非公平。
lock可实现读写锁。
lock锁的范围有局限性,仅适用于代码块范围,而synchronized可以锁住代码块,对象实例,类。
lock可以绑定条件,实现分组唤醒需要的线程;synchronized要么随机唤醒一个,要么唤醒全部线程。
12345678public interface Lock { void lock(); void lockInterruptibly ...
RestController与Controller注解区别
@RestController注解,相当于@Controller + @ResponseBody结合,无法返回jsp,html页面,视图解析器无法解析页面。
@ResponseBody表示方法的结果直接写入HTTP response body中,一般在异步获取数据时使用【也就是ajax】,使用@RequestMapping后,返回值通常为跳转路径,但是加上@ResponseBody后返回结果不会被解析为跳转路径。
12345678910111213141516171819202122//@RestController@Controller@RequestMapping("falarmUser")public class FalarmUserController { private static final Logger logger = LoggerFactory.getLogger(FalarmUserController.class); @Autowired private FalarmUserService falarmUser ...
volatile关键字
在多处理器开发中保证共享变量的可见性。
比synchronized的使用和执行成本更低,因为它不会引起线程上下文的切换和调度。
计算机存储体系中,自顶向下:CPU寄存器 -> CPU缓存(L1、L2、L3) -> 内存 -> 其他存储设备,如硬盘。
使用volatile关键字修饰的变量,在多核处理器下会引发两件事情:
将当前处理器缓存的数据写回到系统内存。
这个写回内存的操作会使其他CPU里缓存了该内存的数据无效(缓存一致性协议,即每个处理器通过嗅探在总线上传播的数据来检查自己缓存的值是否过期,过期则在使用该变量时重新从内存读取该数据到该处理器缓存中)
(Java并发编程的艺术)
关于volatile变量的可见性,经常被人误解:“volatile变量对所有线程是立即可见的,换句话说,volatile变量在各个线程中是一致的,所以基于volatile变量的运算在并发下是线程安全的。”这句话论据部分没有问题,但是这样下结论是错的。
例如,Java里面的运算操作并非原子操作,这就导致了volatile变量的运算在并发下一样是不安全的。
12345 ...
Executor框架
线程池框架
采用线程池好处
降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。
提高线程的可管理性。
Excutor:执行者,java线程池框架最上层父接口。接口中只有一个execute方法,该方法的作用是向线程池提交任务并执行。
ExecutorService:该接口继承自Executor接口,添加了shutdown,shutdownAll,submit,invokeAll等一系列对线程的操作方法。
AbstractExecutorService:抽象类,实现ExecutorService接口。
ThreadPoolExecutor:java线程池最核心的一个类,继承自AbstractExecutorService,主要功能是创建线程池,给任务分配线程资源,执行任务。
ScheduledExecutorService和ScheduledThreadPoolExecutor:延迟执行和周期性执行的线程池。
Executors:静态工厂类,该类定义了一系列静态工厂方 ...