আমি নিউরাল নেট মডেলের প্যারামিটারগুলি আপডেট / পরিবর্তন করার চেষ্টা করছি এবং তারপরে আপডেট নিউরাল নেট এর ফরোয়ার্ড পাসটি গণনা গ্রাফে থাকুক (আমরা যতগুলি পরিবর্তন / আপডেট করি না কেন)।
আমি এই ধারণাটি চেষ্টা করেছিলাম কিন্তু যখনই এটি পাইটোর্চ আমার আপডেট হওয়া টেনসরগুলিকে (মডেলের অভ্যন্তরে) পাতাগুলি সেট করে, যা আমি গ্রেডিয়েন্টগুলি পেতে চাইলে নেটওয়ার্কগুলিতে গ্রেডিয়েন্টগুলির প্রবাহকে মেরে ফেলে। এটি গ্রেডিয়েন্টগুলির প্রবাহকে মেরে ফেলে কারণ লিফ নোডগুলি আমি যেভাবে চাই তা গণনা গ্রাফের অংশ নয় (যেহেতু তারা সত্যিকারের পাতা নয়)।
আমি একাধিক জিনিস চেষ্টা করেছি কিন্তু কিছুই কাজ করছে বলে মনে হচ্ছে না। আমি একটি ডামি কোড তৈরি করেছি যা স্বতঃ অন্তর্ভুক্ত যা নেটওয়ার্কগুলির গ্রেডিয়েন্টগুলি মুদ্রণ করতে চায় সেগুলি মুদ্রণ করে:
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}')
যদি কেউ কীভাবে এটি করতে জানেন তবে দয়া করে আমাকে একটি পিং দিন ... আমি আপডেটের সময়টিকে 2 হিসাবে নির্ধারণ করেছিলাম কারণ আপডেট অপারেশনটি গণনার গ্রাফে একটি নির্বিচার সংখ্যক বার হওয়া উচিত ... সুতরাং এটির জন্য কাজ করা আবশ্যক 2।
দৃ related়ভাবে সম্পর্কিত পোস্ট:
- এসও: পাইটার্চ মডেলটির কোনও প্যারামিটারগুলি কীভাবে পাতাগুলি নয় এবং গণনা গ্রাফে থাকতে পারে?
- পাইটর্চ ফোরাম: https://discuss.pytorch.org/t/how-does-one-have-the-paraters-of-a-model-not-be-leafs/70076
ক্রস-পোস্ট
- কোওড়া: https://www.quora.com/unans উত্তর/ How-does-one-have-paraامی-
- reddit: https://www.reddit.com/r/pytorch/comments/f5gu3g/how_does_one_have_paraters_in_a_pytorch_model/
backward
? যথাretain_graph=True
এবং / অথবাcreate_graph=True
?