现在看以前写的入门续集,觉得写的好烂,但我不想改了。在torch7学习(六)稍微提到了optim,觉得写的很不清楚,所以有了这篇。
入门续集到了这篇,个人认为看Torch框架的深度学习代码应该没啥大问题了。
x*, {f}, ... = hod(opfunc, x[, config][, state])
-- 这里的loss就是f
local loss = criterion:forward(predict, trainlabels)
local dloss_dpredict = criterion:backward(predict,trainlabels)-- 这里调用backward,这个backward会计算gradWeight, gradBias以及gradInput.
local gradInput = net:backward(trainset, dloss_dpredict)
一般的写法:
require 'optim'local optimState = {learningRate = 0.01}local params, gramParams = net:getParameters()function feval(params)
-- 无论如何,在f函数中,先要将需要“优化的参数的梯度”设置成0gradParams:zero()-- 重新计算“需要优化的参数”。local outputs = model:forward(batchInputs)local loss = criterion:forward(outputs, batchLabels)local dloss_doutputs = criterion:backward(outputs, batchLabels)model:backward(batchInputs, dloss_doutputs)-- 返回f值,就是loss,以及gramParams(这个必须是一维的)return loss, gradParams
endfor epoch = 1, 50 do-- 加载点数据,干点额外的事。-- 在最后一句调用hodoptim.sgd(feval, params, optimState)
end
再次强调:backward只是调用每一层的 updateGradInput以及accGradParameters,并不会更新参数,只是计算参数的梯度,以及计算每一层的输入的梯度。
local fDx = function(x)netD:apply(function(m) pe(m):find('Convolution') then m.bias:zero() end end)netG:apply(function(m) pe(m):find('Convolution') then m.bias:zero() end end)gradParametersD:zero()-- Real-- train netD with (real, real_label)local output = netD:forward(real_AB)local label = torch.FloatTensor(output:size()):fill(real_label)if opt.gpu>0 then
本文发布于:2024-01-28 17:15:53,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/17064333578990.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |