2017-08-09 28 views
1

我已經預訓練了一個VGG網絡,它是一個chainer加載的npz文件格式,但是添加了一個新的FC層到最後一層,並且我修改了最後一層的輸出class_number。 我已經修改了圖層名稱,以便將chainer加載文件用於其他未更改的圖層。 但我失敗了。如何加載pretrained chainer npz參數文件但修改某些圖層?

Traceback (most recent call last): 
    File "chainercv/trainer/train.py", line 194, in <module> 
    main() 
    File "chainercv/trainer/train.py", line 85, in main 
    mean_file=args.mean) # 可改爲/home/machen/face_expr/result/snapshot_model.npz 
    File "/home/machen/face_expr/chainercv/links/model/faster_rcnn/faster_rcnn_vgg.py", line 131, in __init__ 
    chainer.serializers.load_npz(pretrained_model, self) 
    File "/usr/local/anaconda3/lib/python3.6/site-packages/chainer-3.0.0a1-py3.6.egg/chainer/serializers/npz.py", line 140, in load_npz 
    d.load(obj) 
    File "/usr/local/anaconda3/lib/python3.6/site-packages/chainer-3.0.0a1-py3.6.egg/chainer/serializer.py", line 82, in load 
    obj.serialize(self) 
    File "/usr/local/anaconda3/lib/python3.6/site-packages/chainer-3.0.0a1-py3.6.egg/chainer/link.py", line 794, in serialize 
    d[name].serialize(serializer[name]) 
    File "/usr/local/anaconda3/lib/python3.6/site-packages/chainer-3.0.0a1-py3.6.egg/chainer/link.py", line 794, in serialize 
    d[name].serialize(serializer[name]) 
    File "/usr/local/anaconda3/lib/python3.6/site-packages/chainer-3.0.0a1-py3.6.egg/chainer/link.py", line 550, in serialize 
    data = serializer(name, param.data) 
    File "/usr/local/anaconda3/lib/python3.6/site-packages/chainer-3.0.0a1-py3.6.egg/chainer/serializers/npz.py", line 106, in __call__ 
    dataset = self.npz[key] 
    File "/usr/local/anaconda3/lib/python3.6/site-packages/numpy/lib/npyio.py", line 237, in __getitem__ 
    raise KeyError("%s is not a file in the archive" % key) 
KeyError: 'head/score_mod/W is not a file in the archive' 
+0

如何在修改圖層名稱之前加載模型? 加載訓練模型時,它會查找圖層名稱來分配參數,所以我認爲加載時需要原始圖層名稱。 – corochann

+0

我想修改FC層的輸出神經元數量,所以預訓練模型不能用於這一層。我想爲我的模型添加新圖層。 – machen

回答

1

我做了自定義類來寫這樣的圖層。 您可以使用啓動標誌

class MyRes(chainer.Chain): 
def __init__(self, path=default_path, init=False): 
    super(MyRes, self).__init__(
     c1 = L.Convolution2D(None, 64, 7, 2, 3), 
     resnet = ResNet50Layers(pretrained_model=None), 
    ) 
    if not init: 
     serializers.load_npz(path, self.resnet) 
    self.resnet.conv1 = self.c1 

控制預訓練模型加載時間,當你初始化訓練時加載爲MyModel的訓練模型,你可以簡單地添加模型

res = MyRes(path=pretrained_model_path) 

的路徑,如設置啓動標誌這

res = MyRes(init=True) 
serializers.load_npz(saved_myres, self.resnet) 
+0

你的意思是你只是爲了使用預訓練模型而將未改變層的ResNet50Layers外部的外層類MyRes包裹起來? – machen

+0

你最後一句話是什麼:serializers.load_npz(saved_myres,self.resnet)是什麼意思? – machen

+0

我認爲重點是在加載預先訓練的模型之後改變層。 – corochann