小さなサンプル移行紙の複製:「少数ショット分類の詳細」

紙のダウンロードアドレス: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
"""

ここに画像の説明を挿入
ここに画像の説明を挿入
最終テストセットの結果(紙の結果にエラーがあり、トレーニングデータとテストデータの分割が原因である可能性があります):
ここに画像の説明を挿入
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/wjl__ai__/article/details/108868307