紙のダウンロードアドレス:https://arxiv.org/pdf/1904.04232.pdf
ソースリンク:https://github.com/wyharveychen/CloserLookFewShot
動作環境:Windows10
はデフォルトのソースコードのみを再現します。つまり、CUBデータセットでトレーニングされたベースラインです。
主なパラメータ:
parser = argparse.ArgumentParser(description= 'few-shot script %s' %(script))
parser.add_argument('--dataset' , default='CUB', help='CUB/miniImagenet/cross/omniglot/cross_char')
parser.add_argument('--model' , default='Conv4', help='model: Conv{4|6} / ResNet{10|18|34|50|101}') # 50 and 101 are not used in the paper
parser.add_argument('--method' , default='baseline', help='baseline/baseline++/protonet/matchingnet/relationnet{_softmax}/maml{_approx}') #relationnet_softmax replace L2 norm with softmax to expedite training, maml_approx use first-order approximation in the gradient for efficiency
parser.add_argument('--train_n_way' , default=5, type=int, help='class num to classify for training') #baseline and baseline++ would ignore this parameter
parser.add_argument('--test_n_way' , default=5, type=int, help='class num to classify for testing (validation) ') #baseline and baseline++ only use this parameter in finetuning
parser.add_argument('--n_shot' , default=5, type=int, help='number of labeled data in each class, same as n_support') #baseline and baseline++ only use this parameter in finetuning
parser.add_argument('--train_aug' , action='store_true', help='perform data augmentation or not during training ') #still required for save_features.py and test.py to find the model path correctly
parser.add_argument('--num_classes' , default=200, type=int, help='total number of classes in softmax, only used in baseline') #make it larger than the maximum label value in base class
parser.add_argument('--save_freq' , default=50, type=int, help='Save frequency')
parser.add_argument('--start_epoch' , default=0, type=int,help ='Starting epoch')
parser.add_argument('--stop_epoch' , default=-1, type=int, help ='Stopping epoch') #for meta-learning methods, each epoch contains 100 episodes. The default epoch number is dataset dependent. See train.py
parser.add_argument('--resume' , action='store_true', help='continue from previous trained model with largest epoch')
parser.add_argument('--warmup' , action='store_true', help='continue from baseline, neglected if resume is true') #never used in the paper
image_size = 224
optimization = 'Adam'
発生した問題と解決策:
1。CUBデータセットデータセット
がないため、データセットをダウンロードする必要があります。
ソースコードで提供されているダウンロードリンク:http://www.vision.caltech.edu/visipedia-data/CUB-200-2011/CUB_200_2011.tgz
外部ネットワークにアクセスする必要があります。当時、私はアクセスしていませんでした。リソースを見つけたので、15元でVPNを購入しました。後でウェブサイトにアクセスできますが、訪問者が多すぎるかファイルが大きすぎると表示されているため、ダウンロードできません。15元が失われました。
次に、リソースを見つけます
。BaiduNetdiskダウンロードリンク:https
://pan.baidu.com/s/1OL3s7XmzoaYmbBocYJjYyQ抽出コード:7jeb2
。コードの変更
"""把反斜杠改为斜杠"""
data_path = join(cwd,'CUB_200_2011\images')
"""读json文件出现的问题,加入斜杠转义字符,让原来的斜杠存在真实意义"""
with open(data_file, encoding='utf-8') as f:
s = ""
for i in f:
s += i
s = s.replace('\\', '\\\\')
self.meta = json.loads(s)
"""
本地没有cuda,需要修改model.cuda(), 凡 **.cuda() 的都需要改成 **.to(device)
当然修改方式多种多样,本人秉持能就行的态度,这个没太大必要深究
修改如下:
"""
device = ('cuda' if torch.cuda.is_available() else 'cpu')
model = model.to(device)
"""
baselinetrain.py 中的 for i, (x, y) in enumerate(train_loader) 不能迭代
修改方法:把datamgr.py中的SimpleDataManager类中get_data_loader函数的data_loader_params参数的内核工作数改为0
即:num_workers = 0
"""
最終テストセットの結果(紙の結果にエラーがあり、トレーニングデータとテストデータの分割が原因である可能性があります):