Ich fahre von Theano nach Torch. Also bitte bitte mit mir. In Theano war es irgendwie einfach, die Gradienten der Verlustfunktion selbst eines bestimmten Gewichts zu berechnen. Ich frage mich, wie kann man das in Torch machen?Wie berechnet man den Verlustgradienten in Bezug auf eine beliebige Schicht/Gewicht in Torch?
Angenommen wir den folgenden Code haben, die einige Daten/Etiketten und definiert ein Modell erzeugt:
t = require 'torch'
require 'nn'
require 'cunn'
require 'cutorch'
-- Generate random labels
function randLabels(nExamples, nClasses)
-- nClasses: number of classes
-- nExamples: number of examples
label = {}
for i=1, nExamples do
label[i] = t.random(1, nClasses)
end
return t.FloatTensor(label)
end
inputs = t.rand(1000, 3, 32, 32) -- 1000 samples, 3 color channels
inputs = inputs:cuda()
labels = randLabels(inputs:size()[1], 10)
labels = labels:cuda()
net = nn.Sequential()
net:add(nn.SpatialConvolution(3, 6, 5, 5))
net:add(nn.ReLU())
net:add(nn.SpatialMaxPooling(2, 2, 2, 2))
net:add(nn.View(6*14*14))
net:add(nn.Linear(6*14*14, 300))
net:add(nn.ReLU())
net:add(nn.Linear(300, 10))
net = net:cuda()
-- Loss
criterion = nn.CrossEntropyCriterion()
criterion = criterion:cuda()
forwardPass = net:forward(inputs)
net:zeroGradParameters()
dEd_WeightsOfLayer1 -- How to compute this?
forwardPass = nil
net = nil
criterion = nil
inputs = nil
labels = nil
collectgarbage()
Wie kann ich den Gradienten w.r.t Gewichte convolutinal Schicht berechnen?