오늘 코드 역시 https://github.com/melodyguan/enas/blob/master/src/cifar10/general_child
를 참고했다. 현재는 이걸 기본으로 거의 같게 구현하지만 나중에 enas + mnas + tunas 섞이면 바뀔 수 있다
아키텍처를 만들고 제어하는 macro_controller를 만들었다면 선택된 아키텍처의 실제 모델을 만들고 학습하기 위한 매서드를 만드는게 macro_child다.
class MacroChild():
def __init__(self,
images,
labels,
whole_channels,
fixed_arc=None,
filters_scale=1,
num_layres=2,
num_branches=6,
filters=24,
keep_prob=1.0,
batch_size=32,
clip_mode=None,
grad_bound=None,
l2_reg=1e-4,
lr_init=0.1,
lr_dec_start=0,
lr_dec_every=10000,
lr_dec_rate=0.1,
lr_cosine=False,
lr_max=None,
lr_min=None,
lr_T_num=None,
optim_algo=None,
sync_replicas=False,
num_aggregate=None,
num_replicas=None,
name="child",
*args,
**kwargs
):
self.images = images
self.labels = labels
self.whole_channels = whole_channels
self.fixed_arc = fixed_arc
self.filters_scale = filters_scale
self.num_layres = num_layres
self.num_branches = num_branches
self.filters = filters
self.keep_prob = keep_prob
self.batch_size = batch_size
self.clip_mode = clip_mode
self.grad_bound = grad_bound
self.l2_reg = l2_reg
self.lr_init = lr_init
self.lr_dec_start = lr_dec_start
self.lr_dec_every = lr_dec_every
self.lr_dec_rate = lr_dec_rate
self.lr_cosine = lr_cosine
self.lr_max = lr_max
self.lr_min = lr_min
self.lr_T_num = lr_T_num
self.optim_algo = optim_algo
self.sync_replicas = sync_replicas
self.num_aggregate = num_aggregate
self.num_replicas = num_replicas
self.name = name
images:
모델에 입력되는 이미지 데이터를 의미
labels:
입력된 이미지에 해당하는 라벨(정답)을 의미
cutout_size:
이미지의 일부를 마스킹하는 "cutout" 기법에서 사용할 크기를 정의
데이터 증강 방법 중 하나로, 이미지에서 일정 부분을 잘라내어 학습의 일반화를 돕는다
whole_channels:
True일 경우, 선택한 연산이 전체 채널에 대해 적용되는지 결정
False일 경우, 선택된 연산이 부분적으로 적용
fixed_arc:
특정 아키텍처가 고정되어 있는 경우 사용된다. None으로 설정되면 학습 중에 아키텍처 탐색이 이루어짐
filters_scale:
출력 필터 수를 조정하는 스케일 팩터로, 네트워크의 크기를 조정하는 데 사용된다
num_layers=2:
모델의 층(layer) 수를 정의한다. 논문 저자 레시피를 따라서 2개로 기본설정
num_branches=6:
각 층에서 선택할 수 있는 연산(branch)의 수를 의미. 각 층은 6가지 연산 중 하나를 선택하게 된다.
논문의 레시피를 준수해서 일단 conv 연산 6개를 기본값으로 설정하였지만 나는 거기서 더 추가해서 사용할 생각이므로 바꿀 예정
out_filters=24:
각 층에서 출력되는 필터의 수를 의미. 필터 수가 클수록 모델의 용량이 증가하지만, 계산 비용도 커진다.
keep_prob=1.0:
드롭아웃(dropout) 확률을 의미. 1.0은 드롭아웃이 없음을 뜻하고, 값이 낮아질수록 드롭아웃 확률이 높아짐.
batch_size=32:
한 번의 학습에서 처리할 배치(batch)의 크기를 정의한다.
학습해보면서 조절 할 생각
clip_mode=None:
그래디언트 클리핑(gradient clipping) 방식을 정의. 특정 모드를 사용하면 큰 그래디언트를 제한하여 학습 안정성을 높일 수 있다
grad_bound=None:
그래디언트 크기의 상한을 설정. 그래디언트가 이 값을 넘지 않도록 클리핑하는 데 사용.
l2_reg=1e-4:
L2 정규화를 위한 파라미터. 모델이 과적합되지 않도록 가중치에 L2 규제를 적용하는 강도를 결정한다. 논문 레시피를 그대로 사용
lr_init=0.1:
학습률의 초기값을 설정. 논문 레시피임
lr_dec_start=0:
학습률을 감소시키기 시작하는 시점을 의미. 0이면 처음부터 학습률 감소가 시작. 역시 논문 레시피
lr_dec_every=10000:
학습률 감소가 일정 횟수마다 일어나도록 설정된 값. 10,000번의 학습 후마다 학습률을 감소시킨다. 기본값은 논문대로 설정했지만 나는 줄일 것 같다.
lr_dec_rate=0.1:
학습률이 감소할 때 적용되는 감소 비율을 설정한다. 0.1은 학습률이 10%로 줄어드는 것을 의미
lr_cosine=False:
True로 설정 시, 학습률을 코사인 스케줄링 방식으로 변화한다. False일 경우, 일반적인 지수적 감소 방식이 적용됨.
lr_max=None:
코사인 스케줄링을 사용할 때 학습률의 최대값을 설정.
lr_min=None:
코사인 스케줄링을 사용할 때 학습률의 최소값을 설정
lr_T_0=None:
코사인 학습률 스케줄링에서 첫 주기의 길이를 설정
lr_T_mul=None:
코사인 학습률 스케줄링에서 각 주기의 길이를 몇 배로 늘릴지를 결정
optim_algo=None:
사용할 최적화 알고리즘을 설정합니다. 예를 들어, SGD, Adam 등
sync_replicas=False:
True로 설정하면, 여러 복제본(replicas)에서 동기적으로 학습이 이루어진다. False일 경우 비동기적으로 진행.
num_aggregate=None:
동기적 학습에서 여러 복제본의 그래디언트를 몇 번 집계할지를 설정.
num_replicas=None:
학습에 참여할 복제본(replicas)의 수를 의미. 병렬 처리를 위해 여러 복제본을 사용할 수 있다.
name="child":
모델의 이름을 설정합니다. 기본적으로 "child"라는 이름이 할당.
*args, **kwargs:
추가적으로 전달될 임의의 인수들로, 클래스 상속 시 추가적인 설정값을 받을 수 있습니다.