實驗——TV Loss解決over fitting的問題
阿新 • • 發佈:2019-01-10
以residual作為DnCNN的target的時候,會出現如下的overfitting的現象
而且,很奇怪的是,該現象僅僅會出現在LR圖片上,而不是HR圖上。本來可以通過提前終止訓練就可以解決overfitting的問題,但是這個問題還是沒有從根本上解決。為此,通過加入TVLOSS來達到正則化的作用
先給出TVLOSS(在之前博文中已經介紹過TVLOSS《 基於pytorch的噪聲估計網路》)
######################################### #TV loss(total variation regularizer) class TVLoss(nn.Module): def __init__(self,TVLoss_weight=1): super(TVLoss,self).__init__() self.TVLoss_weight = TVLoss_weight def forward(self,x): batch_size = x.size()[0] h_x = x.size()[2] w_x = x.size()[3] count_h = self._tensor_size(x[:,:,1:,:]) count_w = self._tensor_size(x[:,:,:,1:]) h_tv = torch.pow((x[:,:,1:,:]-x[:,:,:h_x-1,:]),2).sum() w_tv = torch.pow((x[:,:,:,1:]-x[:,:,:,:w_x-1]),2).sum() return self.TVLoss_weight*2*(h_tv/count_h+w_tv/count_w)/batch_size def _tensor_size(self,t): return t.size()[1]*t.size()[2]*t.size()[3] ##########################################
然後再更改SRmodel
import os from collections import OrderedDict import torch import torch.nn as nn from torch.optim import lr_scheduler import models.networks as networks from .base_model import BaseModel from models.modules.loss import TVLoss class SRModel(BaseModel): def __init__(self, opt): super(SRModel, self).__init__(opt) train_opt = opt['train'] res_mode = opt['network_G']['mode'] net_type = opt['network_G']['which_model_G'] finetune_type = opt['finetune_type'] init_norm_type = opt['init_norm_type'] # define network and load pretrained models self.netG = networks.define_G(opt).to(self.device) self.load() if init_norm_type is not None: self.__init_norm(res_mode, net_type, init_norm_type) if self.is_train: self.netG.train() # loss loss_type = train_opt['pixel_criterion'] if loss_type == 'l1': self.cri_pix = nn.L1Loss().to(self.device) elif loss_type == 'l2': self.cri_pix = nn.MSELoss().to(self.device) elif loss_type == 'l2_tv': self.cri_pix = nn.MSELoss().to(self.device) self.cri_tv = TVLoss().to(self.device) self.tvloss_paremater=1e-5 else: raise NotImplementedError('Loss type [{:s}] is not recognized.'.format(loss_type)) self.l_pix_w = train_opt['pixel_weight'] # optimizers wd_G = train_opt['weight_decay_G'] if train_opt['weight_decay_G'] else 0 # self.optim_params = self.__define_grad_params(finetune_type, res_mode, net_type) self.optimizer_G = torch.optim.Adam( self.optim_params, lr=train_opt['lr_G'], weight_decay=wd_G) self.optimizers.append(self.optimizer_G) # optim_params_first_layer = [] # optim_params_other = [] # for k, v in self.netG.named_parameters(): # can optimize for a part of the model # if 'model.0' in k: # optim_params_first_layer.append(v) # else: # optim_params_other.append(v) # self.optimizer_G_first_layer = torch.optim.Adam(optim_params_first_layer, lr=train_opt['lr_G'] * 10, # weight_decay=wd_G) # self.optimizer_G_other = torch.optim.Adam(optim_params_other, lr=train_opt['lr_G'], weight_decay=wd_G) # self.optimizers.append(self.optimizer_G_first_layer) # self.optimizers.append(self.optimizer_G_other) # schedulers if train_opt['lr_scheme'] == 'MultiStepLR': for optimizer in self.optimizers: self.schedulers.append(lr_scheduler.MultiStepLR(optimizer, \ train_opt['lr_steps'], train_opt['lr_gamma'])) else: raise NotImplementedError('MultiStepLR learning rate scheme is enough.') self.log_dict = OrderedDict() print('---------- Model initialized ------------------') self.print_network() print('-----------------------------------------------') def __define_grad_params(self, finetune_type=None, res_mode='CNA', net_type='denoise_resnet'): optim_params = [] if finetune_type == 'norm': for k, v in self.netG.named_parameters(): v.requires_grad = False # if net_type == 'arcnn' or net_type == 'srcnn': # if k.find('model.1') >= 0: # v.requires_grad = True # optim_params.append(v) # print('we only optimize params: {}'.format(k)) if res_mode == "CNA" or res_mode == "NCA": # if k.find('res.1') >= 0 or k.find('res.4') >= 0 or k.find("sub.17") >= 0: if k.find('transformer') >= 0: v.requires_grad = True optim_params.append(v) print('we only optimize params: {}'.format(k)) elif finetune_type == 'estimation': for k, v in self.netG.named_parameters(): v.requires_grad = False if k.find('Gate') >= 0 or k.find('degration') >= 0: v.requires_grad = True optim_params.append(v) print('we only optimize params: {}'.format(k)) elif finetune_type == 'sft': for k, v in self.netG.named_parameters(): v.requires_grad = False if k.find('Gate') >= 0: v.requires_grad = True optim_params.append(v) print('we only optimize params: {}'.format(k)) elif finetune_type == 'fea_upsample': for k, v in self.netG.named_parameters(): v.requires_grad = False if k.find('res') < 0: v.requires_grad = True optim_params.append(v) print('we only optimize params: {}'.format(k)) elif finetune_type == 'upsample': for k, v in self.netG.named_parameters(): v.requires_grad = False if k.find('model.1') < 0 and k.find('model.0') < 0: v.requires_grad = True optim_params.append(v) print('we only optimize params: {}'.format(k)) elif finetune_type == 'first_layer': for k, v in self.netG.named_parameters(): v.requires_grad = False if k.find('model.0') >= 0: v.requires_grad = True optim_params.append(v) print('we only optimize params: {}'.format(k)) else: for k, v in self.netG.named_parameters(): if v.requires_grad: optim_params.append(v) else: print('WARNING: params [%s] will not optimize.' % k) return optim_params def __init_norm(self, res_mode='CNA', net_type='denoise_resnet', init_norm_type='zero'): for k, v in self.netG.named_parameters(): # if net_type == "arcnn" or net_type == "srcnn": # if k.find('model.1') >= 0: # if init_norm_type == 'zero': # print(k, 'initialize with 0') # nn.init.constant(v, 0) if res_mode == "CNA" or res_mode == "NCA": # if k.find('res.1') >= 0 or k.find('res.4') >= 0 or k.find("sub.17") >= 0: if k.find('transformer') >= 0: if init_norm_type == "instance" or init_norm_type == "batch": if "weight" in k: print(k, "initialize with xavier_uniform") nn.init.constant(v, 1) elif "bias" in k: print(k, "initialize with 0") nn.init.constant(v, 0) elif init_norm_type == 'zero': print(k, "initialize with 0") nn.init.constant(v, 0) def feed_data(self, data, need_HR=True, noise_gt=False): self.var_L = data['LR'].to(self.device) # LR if need_HR: self.real_H = data['HR'].to(self.device) # HR def forward_data_list(self, data_list): # eval() makes the batch norm's mean and variance unchanged self.netG.eval() for k, v in self.netG.named_parameters(): v.requires_grad = False self.var_L = [data['LR'].to(self.device) for data in data_list] self.fake_H = self.netG(self.var_L) def optimize_parameters(self, step): self.optimizer_G.zero_grad() self.fake_H = self.netG(self.var_L) l_pix = self.l_pix_w * self.cri_pix(self.fake_H, self.real_H) l_pix=l_pix+self.tvloss_paremater*self.cri_tv(self.fake_H) l_pix.backward() self.optimizer_G.step() # set log self.log_dict['l_pix'] = l_pix.item() def test(self): self.netG.eval() if self.is_train: for v in self.optim_params: v.requires_grad = False else: for k, v in self.netG.named_parameters(): v.requires_grad = False self.fake_H = self.netG(self.var_L) if self.is_train: for v in self.optim_params: v.requires_grad = True else: for k, v in self.netG.named_parameters(): v.requires_grad = True self.netG.train() # def test(self): # self.netG.eval() # for k, v in self.netG.named_parameters(): # v.requires_grad = False # self.fake_H = self.netG(self.var_L) # for k, v in self.netG.named_parameters(): # v.requires_grad = True # self.netG.train() def test_x8(self): # from https://github.com/thstkdgus35/EDSR-PyTorch self.netG.eval() for k, v in self.netG.named_parameters(): v.requires_grad = False def _transform(v, op): # if self.precision != 'single': v = v.float() v2np = v.data.cpu().numpy() if op == 'v': tfnp = v2np[:, :, :, ::-1].copy() elif op == 'h': tfnp = v2np[:, :, ::-1, :].copy() elif op == 't': tfnp = v2np.transpose((0, 1, 3, 2)).copy() ret = torch.Tensor(tfnp).to(self.device) # if self.precision == 'half': ret = ret.half() return ret lr_list = [self.var_L] for tf in 'v', 'h', 't': lr_list.extend([_transform(t, tf) for t in lr_list]) sr_list = [self.netG(aug) for aug in lr_list] for i in range(len(sr_list)): if i > 3: sr_list[i] = _transform(sr_list[i], 't') if i % 4 > 1: sr_list[i] = _transform(sr_list[i], 'h') if (i % 4) % 2 == 1: sr_list[i] = _transform(sr_list[i], 'v') output_cat = torch.cat(sr_list, dim=0) self.fake_H = output_cat.mean(dim=0, keepdim=True) for k, v in self.netG.named_parameters(): v.requires_grad = True self.netG.train() def get_current_log(self): return self.log_dict def get_current_visuals(self, need_HR=True): out_dict = OrderedDict() out_dict['LR'] = self.var_L.detach()[0].float().cpu() out_dict['SR'] = self.fake_H.detach()[0].float().cpu() if need_HR: out_dict['HR'] = self.real_H.detach()[0].float().cpu() return out_dict def print_network(self): s, n = self.get_network_description(self.netG) print('Number of parameters in G: {:,d}'.format(n)) if self.is_train: message = '-------------- Generator --------------\n' + s + '\n' network_path = os.path.join(self.save_dir, '../', 'network.txt') with open(network_path, 'w') as f: f.write(message) def update(self, new_model_dict): if isinstance(self.netG, nn.DataParallel): network = self.netG.module network.load_state_dict(new_model_dict) def load(self): load_path_G = self.opt['path']['pretrain_model_G'] if load_path_G is not None: print('loading model for G [{:s}] ...'.format(load_path_G)) self.load_network(load_path_G, self.netG) def save(self, iter_label): self.save_network(self.save_dir, self.netG, 'G', iter_label)
python train.py -opt options/train/train_sr.json
{ "name": "LR_x4_subnet_residual_DIV2K_guan_TVLOSS__modify" // please remove "debug_" during training , "tb_logger_dir": "sr" , "use_tb_logger": true , "model":"sr" , "scale": 1 , "crop_scale":0 , "gpu_ids": [1] // , "init_type": "kaiming" // // , "finetune_type": "sft" // , "init_norm_type": "zero" , "datasets": { "train": { "name": "DIV2K" // , "mode": "LQHQ" // , "dataroot_HR": "/media/sdc/jwhe/BasicSR_v2/data/DIV2K/DIV2K800_sub" // , "dataroot_HQ": "/media/sdc/jwhe/BasicSR_v2/data/DIV2K/DIV2K800_sub_Gaussian15" // , "dataroot_LQ": "/media/sdc/jwhe/BasicSR_v2/data/DIV2K/DIV2K800_sub_Gaussian50" , "mode": "LRHR" , "dataroot_HR": "/home/guanwp/BasicSR_datasets/DIV2K800_sub_bicLRx4" , "dataroot_LR": "/home/guanwp/BasicSR_datasets/DIV2K800_sub_bicLRx4_noiseALL" , "subset_file": null , "use_shuffle": true , "n_workers": 8 , "batch_size": 24 // 16 , "HR_size": 96 // 128 | 192 | 96 , "noise_gt": true///////////////////////////////////////////////residual , "use_flip": true , "use_rot": true } // // , "val": { // "name": "val_CBSD68_Gaussian50", // "mode": "LRHR", // "dataroot_HR": "/home/jwhe/workspace/BasicSR_v3/data/CBSD68/mod2/CBSD68_mod", // "dataroot_LR": "/home/jwhe/workspace/BasicSR_v3/data/CBSD68/mod2/CBSD68_Gaussian50" // , "noise_gt": true // } // , "val": { // "name": "val_CBSD68_s08_c03", // "mode": "LRHR", // "dataroot_HR": "/home/jwhe/workspace/BasicSR_v3/data/CBSD68/mod2/CBSD68_mod", // "dataroot_LR": "/home/jwhe/workspace/BasicSR_v3/data/CBSD68/mod2/CBSD68_s08_c03" // , "noise_gt": true // } // , "val": { // "name": "val_CBSD68_clean", // "mode": "LRHR", // "dataroot_HR": "/media/sdc/jwhe/BasicSR_v2/data/CBSD68/mod2/CBSD68_mod", // "dataroot_LR": "/media/sdc/jwhe/BasicSR_v2/data/CBSD68/mod2/CBSD68_mod" // } // , "val": { // "name": "val_LIVE1_gray_JEPG10", // "mode": "LRHR", // "dataroot_HR": "/media/hjw/jwhe/BasicSR_v2/data/val/LIVE1_val/LIVE1_gray_mod", // "dataroot_LR": "/media/hjw/jwhe/BasicSR_v2/data/val/LIVE1_val/LIVE1_gray_jpg10" // } // , "val": { // "name": "val_LIVE1_JEPG80", // "mode": "LRHR", // "dataroot_HR": "/media/hjw/jwhe/BasicSR_v2/data/val/LIVE1_val/LIVE1_mod", // "dataroot_LR": "/media/hjw/jwhe/BasicSR_v2/data/val/LIVE1_val/LIVE1_jpg80" // } // , "val_2": { // "name": "val_Classic5_gray_JEPG30", // "mode": "LRHR", // "dataroot_HR": "/media/sdc/jwhe/BasicSR_v2/data/val/Classic5_val/classic5_mod", // "dataroot_LR": "/media/sdc/jwhe/BasicSR_v2/data/val/Classic5_val/classic5_jpg30" // } // , "val": { // "name": "val_BSD68_gray_Gaussian50", // "mode": "LRHR", // "dataroot_HR": "/media/sdc/jwhe/BasicSR_v2/data/BSD68/mod2/BSD68_mod", // "dataroot_LR": "/media/sdc/jwhe/BasicSR_v2/data/BSD68/mod2/BSD68_gray_Gaussian50" // } // , "val": { // "name": "val_set5_x4_gray_mod4" // , "mode": "LRHR" // , "dataroot_HR": "/media/sdc/jwhe/BasicSR_v2/data/val/Set5_val/mod4/Set5_gray_mod4" // , "dataroot_LR": "/media/sdc/jwhe/BasicSR_v2/data/val/Set5_val/mod4/Set5_gray_bicx4" // } // // , "val": { // "name": "val_set5_x4_noise50_mod4", // "mode": "LRHR", // "dataroot_HR": "/home/jwhe/workspace/BasicSR_v3/data/val/Set5_val/mod4/Set5_mod4", // "dataroot_LR": "/home/jwhe/workspace/BasicSR_v3/data/val/Set5_val/mod4/Set5_bicLRx4_noise50_UPx4" // } // , "val": { // "name": "val_set5_x4_c03s08_LR_mod4", // "mode": "LRHR", // "dataroot_HR": "/home/jwhe/workspace/BasicSR_v3/data/val/Set5_val/mod4/Set5_mod4", // "dataroot_LR": "/home/jwhe/workspace/BasicSR_v3/data/val/Set5_val/mod4/Set5_bicLRx4_c03s08" // } , "val": { "name": "val_set5_x4_LR_residual_mod4", "mode": "LRHR", "dataroot_HR": "/home/guanwp/BasicSR_datasets/val_set5/Set5_sub_bicLRx4", "dataroot_LR": "/home/guanwp/BasicSR_datasets/val_set5/Set5_sub_bicLRx4_noiseALL" , "noise_gt": true } // , "val": { // "name": "val_set5_x3_mod6" // , "mode": "LRHR" // , "dataroot_HR": "/media/sdc/jwhe/BasicSR_v2/data/val/Set5_val/mod6/Set5_mod6" // , "dataroot_LR": "/media/sdc/jwhe/BasicSR_v2/data/val/Set5_val/mod6/Set5_bicx3" // } // } // // , "val": { // "name": "val_set5_x3_gray_mod6" // , "mode": "LRHR" // , "dataroot_HR": "/media/sdc/jwhe/BasicSR_v2/data/val/Set5_val/mod6/Set5_gray_mod6" // , "dataroot_LR": "/media/sdc/jwhe/BasicSR_v2/data/val/Set5_val/mod6/Set5_gray_bicx3" // } } , "path": { "root": "/home/guanwp/jingwen/sr" , "pretrain_model_G": null // , "pretrain_model_G": "../noise_from15to75/experiments/noise15_subnet/models/34000_G.pth" // , "pretrain_model_G": "../experiments/pretrained_models/noise_estimation/01_gaussian15_nonorm_denoise_resnet_DIV2K/noise15_904000_subnet_noise15_34000.pth" // , "pretrain_model_G": "../experiments/pretrained_models/noise_estimation/01_gaussian15_nonorm_denoise_resnet_DIV2K/noise15_904000.pth" // , "pretrain_model_G": "../experiments/pretrained_models/jpeg_estimation/JPEG80_gray_nonorm_denoise_resnet_DIV2K/jpeg80_964000.pth" // , "pretrain_model_G": "../experiments/pretrained_models/jpeg10to40_models/JPEG30_gray_nonorm_denoise_resnet_DIV2K/jpeg_CNA_adaptive_982000.pth" // , "pretrain_model_G": "../experiments/pretrained_models/50to15_models/gaussian75_nonorm_denoise_resnet_DIV2K/noise_CNA_adaptive_988000.pth" // , "pretrain_model_G": "../experiments/pretrained_models/observation_sr/02_bicx3_first_lrx10_nonorm_srcnn_DIV2K/size_CNA_all_conv_adaptive_1000000.pth" // , "pretrain_model_G": "../experiments/pretrained_models/jpeg10to40_models/JPEG50_gray_nonorm_denoise_resnet_DIV2K/jpeg_CNA_adaptive_958000.pth" // , "pretrain_model_G": "../experiments/pretrained_models/50to15_models/gaussian50_nonorm_denoise_resnet_DIV2K_930000/noise_CNA_adaptive.pth" // , "pretrain_model_G": "../experiments/pretrained_models/jpeg10to40_models/JPEG80_gray_nonorm_denoise_resnet_DIV2K/jpeg_CNA_adaptive_964000.pth" // , "pretrain_model_G": "../experiments/pretrained_models/jpeg10to40_models/JPEG80_nonorm_denoise_resnet_DIV2K/jpeg_CNA_adaptive_912000.pth" // , "pretrain_model_G": "../experiments/pretrained_models/50to15_models/gaussian90_nonorm_denoise_resnet_DIV2K/noise_CNA_adaptive_870000.pth" // , "pretrain_model_G": "../experiments/pretrained_models/observation_jpeg/JPEG40_nonorm_arcnn_DIV2K/jpg_CNA_all_conv_adaptive_982000.pth" // , "pretrain_model_G": "../baselines/experiments/01_gaussian15_nonorm_denoise_resnet_DIV2K/models/904000_G.pth" // , "pretrain_model_G": "../experiments/pretrained_models/observation_sr/01_bicx2_first_lrx10_nonorm_srcnn_DIV2K/size_CNA_all_conv_adaptive_996000.pth" // , "pretrain_model_G": "../experiments/pretrained_models/observation_jpeg/JPEG40_kaiming_lr_change_e5_nonorm_arcnn_DIV2K/jpeg_CNA_all_conv_adaptive_596000.pth" // , "pretrain_model_G": "../observation_sr/experiments/01_bicx2_first_lrx10_nonorm_srcnn_DIV2K/models/996000_G.pth" // , "pretrain_model_G": "../observation_sr/experiments/02_bicx3_first_lrx10_nonorm_srcnn_DIV2K/models/1000000_G.pth" // , "pretrain_model_G": "../experiments/pretrained_models/x4tox3_models/bicx5_nonorm_denoise_resnet_DIV2K/size_CNA_adaptive_794000.pth" // , "pretrain_model_G": "../baselines/experiments/bicx3_adaptive_ksize3_denoise_resnet_DIV2K/models/606000_G.pth" // , "pretrain_model_G": "../observation_noise/experiments/noise15_nonorm_arcnn_DIV2K/models/778000_G.pth" // , "pretrain_model_G": "../experiments/pretrained_models/observation_noise/noise15_nonorm_arcnn_DIV2K/noise_CNA_all_conv_adaptive_778000.pth" // , "pretrain_model_G": "../experiments/pretrained_models/jpeg10to40_models/JPEG50_gray_nonorm_denoise_resnet_DIV2K/jpeg_CNA_adaptive_958000.pth" // , "pretrain_model_G": "../../BasicSR_v2/baselines_v2/experiments/JPEG40_kaiming_lr_change_e5_nonorm_arcnn_DIV2K/models/596000_G.pth" // , "pretrain_model_G": "../observation_sr/experiments/bicx3_kaiming_nonorm_srcnn_DIV2K/models/982000_G.pth" // , "pretrain_model_G": "../experiments/pretrained_models/observation_sr/bicx3_kaiming_nonorm_srcnn_DIV2K/size_CNA_all_conv_adaptive_982000.pth" // , "pretrain_model_G": "../experiments/pretrained_models/x4tox3_models/bicx2_nonorm_denoise_resnet_DIV2K/size_CNA_adaptive_962000.pth" // , "pretrain_model_G": "../experiments/pretrained_models/50to15_models/01_gaussian15_nonorm_denoise_resnet_DIV2K/noise_CNA_adaptive_904000.pth" // , "pretrain_model_G": "../experiments/pretrained_models/jpeg10to40_models/JPEG40_gray_nonorm_denoise_resnet_DIV2K/jpeg_CNA_adaptive_956000.pth" // , "pretrain_model_G": "../baselines/experiments/bicx3_nonorm_denoise_resnet_DIV2K/models/952000_G.pth" // , "pretrain_model_G": "../experiments/pretrained_models/jpeg10to40_models/JPEG20_gray_nonorm_denoise_resnet_DIV2K/jpeg_CNA_adaptive_966000.pth" // , "pretrain_model_G": "../experiments/pretrained_models/x4tox3_models/bicx3_nonorm_denoise_resnet_DIV2K/size_CNA_adaptive_952000.pth" // , "pretrain_model_G": "../experiments/pretrained_models/jpeg10to40_models/JPEG30_gray_nonorm_denoise_resnet_DIV2K/jpeg_CNA_adaptive_982000.pth" // , "pretrain_model_G": "../experiments/pretrained_models/observation_sr/bicx4_kaiming_nonorm_srcnn_DIV2K/size_CNA_adaptive_982000.pth" // , "pretrain_model_G": "../observation_sr/experiments/bicx4_kaiming_nonorm_srcnn_DIV2K/models/982000_G.pth" // , "pretrain_model_G": "../experiments/pretrained_models/jpeg10to40_models/JPEG10_gray_nonorm_denoise_resnet_DIV2K_902000/jpeg_CNA_adaptive.pth" // , "pretrain_model_G": "../experiments/pretrained_models/x4tox3_models/bicx4_nonorm_denoise_resnet_DIV2K_992000/size_CNA_adaptive.pth" } // , "network_G": { // "which_model_G": "sr_resnet" // RRDB_net | sr_resnet | denoise_resnet //// , "norm_type": "adaptive_conv_res" // , "norm_type": null // , "mode": "CNA" // , "nf": 64 // , "nb": 16 // , "in_nc": 3 // , "out_nc": 3 //// , "gc": 32 // , "group": 1 //// , "down_scale": 2 //// , "ada_ksize": 1 //// , "num_classes": 2 //// , "fea_norm": "adaptive_conv_res" //// , "upsample_norm": "adaptive_conv_res" // } // , "network_G": { "which_model_G": "noise_subnet" // RRDB_net | sr_resnet | modulate_denoise_resnet |noise_subnet // , "norm_type": "adaptive_conv_res" , "norm_type": "batch" , "mode": "CNA" , "nf": 64 // , "nb": 16 , "in_nc": 3 , "out_nc": 3 // , "gc": 32 , "group": 1 // , "gate_conv_bias": true // , "ada_ksize": 1 // , "num_classes": 2 // , "fea_norm": "adaptive_conv_res" // , "upsample_norm": "adaptive_conv_res" } // , "network_G": { // "which_model_G": "srcnn" // RRDB_net | sr_resnet //// , "norm_type": null // , "norm_type": "adaptive_conv_res" // , "mode": "CNA" // , "nf": 64 // , "in_nc": 1 // , "out_nc": 1 // , "ada_ksize": 5 // } // , "network_G": { // "which_model_G": "arcnn" //// , "norm_type": "adaptive_conv_res" // , "norm_type": null // , "mode": "CNA" // , "nf": 64 // , "in_nc": 1 // , "out_nc": 1 // , "group": 1 //// , "ada_ksize": 5 // } , "train": { // "lr_G": 1e-3 "lr_G": 1e-4 , "lr_scheme": "MultiStepLR" // , "lr_steps": [200000, 400000, 600000, 800000] , "lr_steps": [500000] // , "lr_steps": [600000] // , "lr_steps": [1000000] // , "lr_steps": [50000, 100000, 150000, 200000, 250000] // , "lr_steps": [100000, 200000, 300000, 400000] , "lr_gamma": 0.1 // , "lr_gamma": 0.5 , "pixel_criterion": "l2_tv"//"l2" , "pixel_weight": 1.0 , "val_freq": 1e3 , "manual_seed": 0 , "niter": 1e6 // , "niter": 6e5 } , "logger": { "print_freq": 200 , "save_checkpoint_freq": 1e3 } }
https://github.com/hejingwenhejingwen/Blind_Restoration