torch7:为不同的卷积神经网络层设置可变学习率
2016-2-23 12:57:50
收藏:0
阅读:48
评论:1
我正在尝试微调一个卷积神经网络。它有以下结构(改编自 OverFeat):
net:add(SpatialConvolution(3, 96, 7, 7, 2, 2))
net:add(nn.ReLU(true))
net:add(SpatialMaxPooling(3, 3, 3, 3))
net:add(SpatialConvolutionMM(96, 256, 7, 7, 1, 1))
net:add(nn.ReLU(true))
net:add(SpatialMaxPooling(2, 2, 2, 2))
net:add(SpatialConvolutionMM(256, 512, 3, 3, 1, 1, 1, 1))
net:add(nn.ReLU(true))
net:add(SpatialConvolutionMM(512, 512, 3, 3, 1, 1, 1, 1))
net:add(nn.ReLU(true))
net:add(SpatialConvolutionMM(512, 1024, 3, 3, 1, 1, 1, 1))
net:add(nn.ReLU(true))
net:add(SpatialConvolutionMM(1024, 1024, 3, 3, 1, 1, 1, 1))
net:add(nn.ReLU(true))
net:add(SpatialMaxPooling(3, 3, 3, 3))
net:add(SpatialConvolutionMM(1024, 4096, 5, 5, 1, 1))
net:add(nn.ReLU(true))
net:add(SpatialConvolutionMM(4096, 4096, 1, 1, 1, 1))
net:add(nn.ReLU(true))
net:add(SpatialConvolutionMM(4096, total_classes, 1, 1, 1, 1))
net:add(nn.View(total_classes))
net:add(nn.LogSoftMax())
并且我正在使用 SGD 作为优化方法,并提供以下参数:
optimState = {
learningRate = 1e-3,
weightDecay = 0,
momentum = 0,
learningRateDecay = 1e-7
}
optimMethod = optim.sgd
我正在按以下方式进行训练:
optimMethod(feval, parameters, optimState)
其中:
-- 'feval' 是在当前批次上进行前向和后向传递的函数
parameters,gradParameters = net:getParameters()
从我的参考资料中,我了解到在微调预训练网络时,建议较低(卷积)层应具有较低的学习率,而较高层应具有相对较高的学习率。
我参考了 torch7 的 optim/sgd 文档以设置每层不同的学习率。从那里,我得出了设置 config.learningRates,即一个单独学习率的向量,我可以实现我想要的。由于我是 Torch 的新手,如果有人能够解释一下如何创建/使用此向量以达到我的目的,那将非常有帮助。
提前感谢。
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
我不知道你是否仍需要答案,因为你一个月以前发布了这个问题。
无论如何,以防有人看到这个问题,我在这里写了一篇文章,介绍了如何在 Torch 中为不同层设置不同的学习率。
解决方案是使用
net:parameters()而不是net:getParameters()。它不返回两个张量,而是返回两个张量表,分别包含每个层的参数(和gradParameters)。通过这种方法,您可以为每个层运行
sgd()步骤(具有不同的学习率)。您可以通过点击上面的链接找到完整的代码。