링크: colab
torch.gather()
torch.einsum()
torch.nn.Module(doc)
torch.nn.Sequential(doc)
torch.nn.ModuleList(doc)
- python의 list를 사용할 경우?
- ModuleList를 사용할 경우만 parameter가 register 된다. (참고)
torch.nn.ModuleDict(doc)
buffer(doc)
- 일반 tensor는 모델에 저장되지 않는다.
- 모델에 paramete 외 일반 tensor를 저장하기 위해
self.register_buffer(이름, torch.tensor)
의 형태로 저장할 수 있다.self.register_buffer(이름, tensor)
로 저장하면 self.이름으로 tensor를 불러올 수 있다.- BatchNorm에서 사용되는 듯
모델구조
model.named_modules()
: 모델의 구조(모든 submodule)를 가져온다.
model.named_children()
: 자식submodule만 가져온다.
model.get_submodule(name)
:model.named_...
를 사용하여 module의 이름을 확인하고 가져올 수 있다.
model.named_parameters()
: parameter와 이름, 속하는 module을 확인
model.get_parameter()
: 지정한 parameter를 불러온다
model.named_buffers()
,model.buffers()
: buffer 목록을 불러온다.
model.get_buffer()
: buffer를 가져온다
model.__doc__
: 모델의 Docstring
모델 출력
print(repr(model))
출력
Model( (ab): Layer_AB( (a): Function_A() (b): Function_B() ) (cd): Layer_CD( (c): Function_C() (d): Function_D() ) )
- 모델 내에서 overriding
def extra_repr(self): return f"name={self.name}"
- 전:
Function_A()
- 후:
Function_A(name=duck)
hook
- Tensor와 Module에 적용할 수 있음
- tensor에서는
_backward_hooks
만 가능tensor.register_hook(func)
확인 -->tensor.backward_hooks
- Module에는 여러 hook이 존재
model.register_foward_pre_hook(hook)
model.register_forward_hook(hook)
model.register_full_backward_hook(hook)
model.register_backward_hook(hook)?
한번에 확인 -->model.__dict__
apply
- 가중치 초기화에 많이 사용됨
- Postorder Traversal(후위 순회)방식으로 module에 함수를 적용
[left_child->right_child->parent]
- torch.tensor 값 바꾸는 법
torch.tensor(x, requires_grad=True).data.fill_()
- 외부에서 만든 메소드로 변경하는 법(stack overflow)
>> from functools import partial >> class Dog: def __init__(self, name): self.name = name >> def bark(self): print('Woof! %s is barking' % self.name) >> e.bark = partial(bark, e)