training code for with attribute(left) and without attribute(right)

创建于 差异永不过期
18 删除
352 行
10 添加
354 行
import os
import os
import torch
import torch
import torch.nn as nn
import torch.nn as nn
import numpy as np
import numpy as np
import time
import time
import json
import json
import math
import math
from tqdm import tqdm
from tqdm import tqdm
from pandas import DataFrame
from pandas import DataFrame
import sys
import sys
sys.path.append("..")
sys.path.append("..")
sys.path.append("../..")
sys.path.append("../..")


from torchmeta.utils.data import BatchMetaDataLoader
from torchmeta.utils.data import BatchMetaDataLoader
from torchmeta.utils.prototype import get_prototypes, prototypical_loss
from torchmeta.utils.prototype import get_prototypes, prototypical_loss


from model import ProtoNetAGAM
from model import ProtoNetAGAM, ProtoNetAGAMwoAttr
from utils import get_dataset, get_proto_accuracy, get_addition_loss
from utils import get_dataset, get_proto_accuracy, get_addition_loss
from global_utils import Averager, Averager_with_interval, get_outputs_c_h, get_inputs_and_outputs, get_semantic_size
from global_utils import Averager, Averager_with_interval, get_outputs_c_h, get_inputs_and_outputs, get_semantic_size




def save_model(model, args, tag):
def save_model(model, args, tag):
model_path = os.path.join(args.record_folder, ('_'.join([args.model_name, args.train_data, args.test_data, args.backbone, tag]) + '.pt'))
model_path = os.path.join(args.record_folder, ('_'.join([args.model_name, args.train_data, args.test_data, args.backbone, tag]) + '.pt'))
if args.multi_gpu:
if args.multi_gpu:
model = model.module
model = model.module
with open(model_path, 'wb') as f:
with open(model_path, 'wb') as f:
torch.save(model.state_dict(), f)
torch.save(model.state_dict(), f)


def save_checkpoint(args, model, train_log, optimizer, global_task_count, tag):
def save_checkpoint(args, model, train_log, optimizer, global_task_count, tag):
if args.multi_gpu:
if args.multi_gpu:
model = model.module
model = model.module
state = {
state = {
'args': args,
'args': args,
'state_dict': model.state_dict(),
'state_dict': model.state_dict(),
'train_log': train_log,
'train_log': train_log,
'val_acc': train_log['max_acc'],
'val_acc': train_log['max_acc'],
'optimizer': optimizer.state_dict(),
'optimizer': optimizer.state_dict(),
'global_task_count': global_task_count
'global_task_count': global_task_count
}
}
checkpoint_path = os.path.join(args.record_folder, ('_'.join([args.model_name, args.train_data, args.test_data, args.backbone, tag]) + '_checkpoint.pt.tar'))
checkpoint_path = os.path.join(args.record_folder, ('_'.join([args.model_name, args.train_data, args.test_data, args.backbone, tag]) + '_checkpoint.pt.tar'))
with open(checkpoint_path, 'wb') as f:
with open(checkpoint_path, 'wb') as f:
torch.save(state, f)
torch.save(state, f)




if __name__ == '__main__':
if __name__ == '__main__':
import argparse
import argparse
torch.backends.cudnn.enabled = False


# should be updated in different models
# should be updated in different models
parser = argparse.ArgumentParser('Prototypical Networks with AGAM')
parser = argparse.ArgumentParser('Prototypical Networks with AGAM')
parser.add_argument('--model-name', type=str, default='protonet_agam',
parser.add_argument('--model-name', type=str, default='protonet_agam',
help='Name of the model.')
help='Name of the model.')


# experimental settings
# experimental settings
parser.add_argument('--data-folder', type=str, default='../../datasets',
parser.add_argument('--data-folder', type=str, default='../../datasets',
help='Path to the folder the data is downloaded to.')
help='Path to the folder the data is downloaded to.')
parser.add_argument('--train-data', type=str, default='cub',
parser.add_argument('--train-data', type=str, default='cub',
choices=['cub', 'sun'],
choices=['cub', 'sun'],
help='Name of the dataset used in meta-train phase.')
help='Name of the dataset used in meta-train phase.')
parser.add_argument('--test-data', type=str, default='cub',
parser.add_argument('--test-data', type=str, default='cub',
choices=['cub', 'sun'],
choices=['cub', 'sun'],
help='Name of the dataset used in meta-test phase.')
help='Name of the dataset used in meta-test phase.')
parser.add_argument('--backbone', type=str, default='conv4',
parser.add_argument('--backbone', type=str, default='conv4',
choices=['conv4', 'resnet12'],
choices=['conv4', 'resnet12'],
help='Name of the CNN backbone.')
help='Name of the CNN backbone.')
parser.add_argument('--lr', type=float, default=0.001,
parser.add_argument('--lr', type=float, default=0.001,
help='Initial learning rate (default: 0.001).')
help='Initial learning rate (default: 0.001).')


parser.add_argument('--num-shots', type=int, default=5, choices=[1, 5, 10],
parser.add_argument('--num-shots', type=int, default=5, choices=[1, 5, 10],
help='Number of examples per class (k in "k-shot", default: 5).')
help='Number of examples per class (k in "k-shot", default: 5).')
parser.add_argument('--num-ways', type=int, default=5, choices=[5, 20],
parser.add_argument('--num-ways', type=int, default=5, choices=[5, 20],
help='Number of classes per task (N in "N-way", default: 5).')
help='Number of classes per task (N in "N-way", default: 5).')
parser.add_argument('--test-shots', type=int, default=15,
parser.add_argument('--test-shots', type=int, default=15,
help='Number of query examples per class (k in "k-shot", default: 15).')
help='Number of query examples per class (k in "k-shot", default: 15).')


parser.add_argument('--batch-tasks', type=int, default=4,
parser.add_argument('--batch-tasks', type=int, default=4,
help='Number of tasks in a mini-batch of tasks (default: 4).')
help='Number of tasks in a mini-batch of tasks (default: 4).')


# follows Closer_Look, 40000 for 5 shots and 60000 for 1 shot
# follows Closer_Look, 40000 for 5 shots and 60000 for 1 shot
parser.add_argument('--train-tasks', type=int, default=40000,
parser.add_argument('--train-tasks', type=int, default=40000,
help='Number of tasks in the training phase (default: 40000).')
help='Number of tasks in the training phase (default: 40000).')
parser.add_argument('--val-tasks', type=int, default=600,
parser.add_argument('--val-tasks', type=int, default=600,
help='Number of tasks in the validation phase (default: 600).')
help='Number of tasks in the validation phase (default: 600).')
parser.add_argument('--test-tasks', type=int, default=10000,
parser.add_argument('--test-tasks', type=int, default=10000,
help='Number of tasks in the testing phase (default: 10000).')
help='Number of tasks in the testing phase (default: 10000).')


parser.add_argument('--augment', type=bool, default=True,
parser.add_argument('--augment', type=bool, default=True,
help='Augment the training dataset (default: True).')
help='Augment the training dataset (default: True).')
parser.add_argument('--schedule', type=int, nargs='+', default=[15000, 30000, 45000, 60000],
parser.add_argument('--schedule', type=int, nargs='+', default=[15000, 30000, 45000, 60000],
help='Decrease learning rate at these number of tasks.')
help='Decrease learning rate at these number of tasks.')
parser.add_argument('--gamma', type=float, default=0.1,
parser.add_argument('--gamma', type=float, default=0.1,
help='Learning rate decreasing ratio (default: 0.1).')
help='Learning rate decreasing ratio (default: 0.1).')


parser.add_argument('--valid-every-tasks', type=int, default=1000,
parser.add_argument('--valid-every-tasks', type=int, default=1000,
help='Number of tasks for each validation (default: 1000).')
help='Number of tasks for each validation (default: 1000).')


# arguments of program
# arguments of program
parser.add_argument('--num-workers', type=int, default=2,
parser.add_argument('--num-workers', type=int, default=16,
help='Number of workers for data loading (default: 2).')
help='Number of workers for data loading (default: 2).')
parser.add_argument('--download', action='store_true',
parser.add_argument('--download', action='store_true',