---
# System prepended metadata

title: 特徵擷取問題

---


# 特徵擷取問題
使用預訓練的模型輸出為1000，指的並不是1000個特徵，而是1000個分類，其中return max_index就是1000個中最高的那個就是他的分類，原本最後一層是 `Linear(in_features=512, out_features=1000)`，指的是將512個特徵映射到1000個種類，所以如果要得到特徵就要把最後一層(fc)改成`LeakyReLU(0.1)`，把`Linear(in_features=512, out_features=1000)`取代掉即可得到512個特徵。

> 這是錯誤的情況(目前)，導致CSV只有17個特徵
![](https://i.imgur.com/Xw8846X.png)
> 正確的情況(只有一層FC)，有512個特徵
![](https://i.imgur.com/lCADd5j.png)

這邊指的都是Extract_feature.py的問題
訓練的部分(應該)沒有問題。



# Question
如上提到，要將分類轉成要把最後一層改成`LeakyReLU(0.1)`
然而在Extract_feature.py中如果在一開始就改，則會在load模型的時候遇到模型不符合的問題
>  在一開始改是可以正確改的(用print(MODEL))看是對的，但因為模型不符合不能使用。

如果在最後改的話又會因為`MODEL = torch.nn.DataParallel( MODEL )`的關系(不確定，)已經把模型放進去就不能改了
> 在最後使用函式(extract_feature)前改會變成錯誤情況

所以嘗試使用單GPU來執行程式，但又會遇到因為模型是用`MODEL = torch.nn.DataParallel( MODEL )`兩個GPU訓練出來的而不能使用，


# Answer
1. 目前是先重新訓練一個單GPU的模型(5epch)來試試看(還未完成)。
2. 嘗試是否有其他方法能在最後那邊改`LeakyReLU(0.1)`。
3. 確認是否是因為`MODEL = torch.nn.DataParallel( MODEL )`的問題而造成不能在最後改。

### 2019/8/15 AM7:19
> https://zhuanlan.zhihu.com/p/61892329  学习Pytorch过程遇到的坑

這篇文章裡面有提到關於多顯卡以及`model = torch.nn.DataParallel`的問題
算是Pytorch的缺點

> model = Model() # 这里实例化Model类得到一个model
model.fc   # 这样做不会报错
#DataParallel情况下
parallel_model = torch.nn.DataParallel(model)
parallel_model.fc  # 会报错。解决办法，很简单， 在fc前加一个.module即可
parall_model.module.fc # 不会报错

要更改用DataParallel的模型時必須加上module才可以更改成功

### 2019/8/16 AM6:46

>Loading weights from DataParallel models https://discuss.pytorch.org/t/loading-weights-from-dataparallel-models/20570
>
>Does DataParallel() matters in CPU-mode
https://discuss.pytorch.org/t/does-dataparallel-matters-in-cpu-mode/7587