Saya mencoba memperbarui / mengubah parameter model neural net dan kemudian meneruskan pass dari neural net yang diperbarui berada dalam grafik perhitungan (tidak peduli berapa banyak perubahan / pembaruan yang kami lakukan).
Saya mencoba ide ini tetapi setiap kali saya melakukannya pytorch menetapkan tensor saya yang diperbarui (di dalam model) menjadi daun, yang membunuh aliran gradien ke jaringan saya ingin menerima gradien. Ini membunuh aliran gradien karena node daun bukan bagian dari grafik perhitungan seperti yang saya inginkan (karena mereka tidak benar-benar daun).
Saya sudah mencoba banyak hal tetapi sepertinya tidak ada yang berhasil. Saya membuat kode dummy yang mandiri yang mencetak gradien dari jaringan yang saya inginkan memiliki gradien:
import torch
import torch.nn as nn
import copy
from collections import OrderedDict
# img = torch.randn([8,3,32,32])
# targets = torch.LongTensor([1, 2, 0, 6, 2, 9, 4, 9])
# img = torch.randn([1,3,32,32])
# targets = torch.LongTensor([1])
x = torch.randn(1)
target = 12.0*x**2
criterion = nn.CrossEntropyLoss()
#loss_net = nn.Sequential(OrderedDict([('conv0',nn.Conv2d(in_channels=3,out_channels=10,kernel_size=32))]))
loss_net = nn.Sequential(OrderedDict([('fc0', nn.Linear(in_features=1,out_features=1))]))
hidden = torch.randn(size=(1,1),requires_grad=True)
updater_net = nn.Sequential(OrderedDict([('fc0',nn.Linear(in_features=1,out_features=1))]))
print(f'updater_net.fc0.weight.is_leaf = {updater_net.fc0.weight.is_leaf}')
#
nb_updates = 2
for i in range(nb_updates):
print(f'i = {i}')
new_params = copy.deepcopy( loss_net.state_dict() )
## w^<t> := f(w^<t-1>,delta^<t-1>)
for (name, w) in loss_net.named_parameters():
print(f'name = {name}')
print(w.size())
hidden = updater_net(hidden).view(1)
print(hidden.size())
#delta = ((hidden**2)*w/2)
delta = w + hidden
wt = w + delta
print(wt.size())
new_params[name] = wt
#del loss_net.fc0.weight
#setattr(loss_net.fc0, 'weight', nn.Parameter( wt ))
#setattr(loss_net.fc0, 'weight', wt)
#loss_net.fc0.weight = wt
#loss_net.fc0.weight = nn.Parameter( wt )
##
loss_net.load_state_dict(new_params)
#
print()
print(f'updater_net.fc0.weight.is_leaf = {updater_net.fc0.weight.is_leaf}')
outputs = loss_net(x)
loss_val = 0.5*(target - outputs)**2
loss_val.backward()
print()
print(f'-- params that dont matter if they have gradients --')
print(f'loss_net.grad = {loss_net.fc0.weight.grad}')
print('-- params we want to have gradients --')
print(f'hidden.grad = {hidden.grad}')
print(f'updater_net.fc0.weight.grad = {updater_net.fc0.weight.grad}')
print(f'updater_net.fc0.bias.grad = {updater_net.fc0.bias.grad}')
jika ada yang tahu bagaimana melakukan ini tolong beri saya ping ... Saya mengatur berapa kali untuk memperbarui menjadi 2 karena operasi pembaruan harus dalam grafik perhitungan jumlah yang berubah-ubah kali ... sehingga HARUS bekerja untuk 2.
Posting yang sangat terkait:
- SO: Bagaimana seseorang memiliki parameter dalam model pytorch tidak menjadi daun dan berada dalam grafik perhitungan?
- forum pytorch: https://discuss.pytorch.org/t/how-does-one-have-the-parameters-of-a-model-not-be-leafs/70076
Diposting silang:
backward
? Yaituretain_graph=True
dan / ataucreate_graph=True
?Jawaban:
JANGAN BEKERJA DENGAN BENAR karena modul parameter yang disebutkan akan dihapus.
Sepertinya ini berfungsi:
keluaran:
Pengakuan: luar biasa dari tim pytorch: https://discuss.pytorch.org/t/how-does-one-have-the-parameters-of-a-model-not-be-leafs/70076/9?u= pinokio
sumber
Anda harus mencoba mempertahankan tensor yang sama, bukan membuat yang baru.
Pergi untuk
data
atribut mereka dan atur nilai baru.Ini bekerja untuk saya dalam pertanyaan ini: Bagaimana cara menetapkan nilai baru ke variabel pytorch tanpa melanggar backpropagation?
sumber