【深度学习】pytorch-tensorflow-anaconda笔记
1.安裝CornerNet、Anaconda和pytorch遇到的問題
2.安裝tensorflow-gpu版本
3.pytorch版本安裝
4.tensorflow和pytorch指定多GPU進行運算
5.pytorch和tensorflow中的tensor與numpy轉換
6.pytorch數據的并行計算(DataParallelism)
7.Pytorch查看可訓練參數
8.Pytorch凍結梯度,只訓練某幾層網絡權重
9.安裝anaconda后取消命令行前出現的base
1. 安裝CornerNet、Anaconda和pytorch遇到的問題
Anaconda在2019年5月已經禁止使用國內鏡像了,因此下面方法已經用不了了,權當做留念,以后只能使用官方提供的來安裝,速度慢點就慢點吧。
用conda安裝Pytorch過程中會連接失敗,這是因為Anaconda.org的服務器在國外。可以用清華TUNA鏡像源,包含Anaconda倉庫的鏡像,將其加入conda的配置,配置如下:
切換回默認鏡像源,命令一行搞定:
conda config --remove-key channels如果想單個刪除的話,刪除單個鏈接命令如下:
conda config --remove channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free但是會出現中斷,提示安裝失敗,因此這里我們應該去掉后面指定channel路徑的–channel pytorch,即改為:
conda create --name CornerNet_Lite --file conda_packagelist.txt3.對于安裝的pytorch版本問題,在conda_packagelist.txt需要把pytorch的版本以及cuda的版本根據電腦驅動版本來改過來。由于電腦cuda版本是9.0,而他的文件中卻是10.0,因此需要做出以下更改:
(1) cuda100=1.0=0 改為 cuda90=1.0.0
(2) pytorch=1.0.0=py3.7_cuda10.0.130_cudnn7.4.1_1 改為pytorch=1.0.0=py3.7_cuda9.0.176_cudnn7.4.1_1
4. 如果怎么安裝都出錯,就卸載Anaconda后重新裝Anaconda,再試一遍,應該能解決問題。卸載Anaconda參考https://blog.csdn.net/yeler082/article/details/79116490
5.遇到ValueError:numpy.ufunc size changed,may…的問題,解決方法是把numpy升級到1.16.1版本,pip install numpy==1.16.1。不過我上次遇到這種問題是由于沒裝好pytorch或者Anaconda。最后裝好了之后就不會出現這種情況。
6.python圖像處理問題
AttributeError: ‘NoneType’ object has no attribute ‘shape’
原因:
(1) 圖片不存在(路徑不存在, 路徑包含中文無法識別)
(2) 讀取的圖片內容和默認讀取時參數匹配不匹配。(默認讀取的是3通道的彩色圖)例如讀取到的圖片是灰度圖,就會返回None。
(3)路徑中有中文。
7.命令
(1) 安裝完anaconda后終端默認會出來一個(base),可使用conda deactivate命令去掉,不過有沒有不影響。
(2) 創建zhz環境
也可以使用例如
conda create --name CornerNet_Lite --file conda_packagelist.txt --channel pytorch的命令通過pytorch官網安裝conda_packagelist.txt文件下的所有安裝包。conda_packagelist.txt由我們自己隨意決定想安裝哪些包,我們可以通過指定–chanel來從清華鏡像源安裝更快,參考5.1, 5.2。
(3) 進入zhz環境
source activate zhz(4) 退出zhz環境
source activate2. 安裝tensorflow-gpu版本
使用anaconda安裝tensorflow的環境:python3.5.6+tensorflow-gpu==1.12.0+cuda9.0.176+cudnn7.1.4安裝成功
由于tensorflow目前不支持Python3.7,因此在系統中再安裝一個Python版本,以python3.5.6為例:
1.安裝好Python3.5.6: 參考:https://www.cnblogs.com/ningvsban/p/4384995.html
2.在anaconda下創建名為“tensorflow”并且Python環境為3.5版本的環境:
3.安裝tensorflow
系統默認安裝tensorflow版本:
安裝指定版本的tensorflow:
pip install tensorflow-gpu==1.12.0如果你下載了某個版本的tensorflow-gpu到本地,可以這么安裝:
pip install tensorflow_gpu-0.12.0-cp35-cp35m-manylinux1_x86_64.whl測試tensorflow是否安裝成功:
進入Python
3.pytorch安裝
建議0.4.0版本最合適,不要安裝最新版。
我電腦和服務器版本都是cuda=9.0.176 + cudnn=7.1.4 + 1050Ti(我)+1080Ti(服務器)
版本推薦:pytorch-0.4.0 + torchvision-0.1.8 + python=3.5.4
在http://download.pytorch.org/whl/cu90/torch-0.4.0-cp35-cp35m-linux_x86_64.whl 可下載pytorch-0.4.0版本,python=3.5.4.
如果想安裝別的版本,例如1.0.1版本,只需要把上面網址中的0.4.0改為1.0.1即可。
還要安裝numpy之后才能import torch成功,否則只會安裝torch成功,導入會失敗
也可在清華源鏡像中下載各pytorch安裝包,不過下載下來的是壓縮包(我還沒有查閱怎么使用這種安裝),不是whl格式的文件,: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/linux-64/
另 torchvision安裝0.1.8合適。因為更高的版本有些東西被棄用了,很多程序都運行不了,改起來很麻煩。
安裝方法:下載pytorch-0.4.0版本的whl文件
不能直接安裝pip install torchvision不指定版本,否則會自動安裝最高版本的torchvision,然后就自動把pytorch版本也升級了。
4.tensorflow和pytorch指定多GPU進行運算
tensorflow和pytorch指定多GPU的話,對應的語句首先改成:
CUDA_VISIBLE_DEVICES=0,1 python my_script.py
CUDA_VISIBLE_DEVICES=2,3 python my_script.py
CUDA_VISIBLE_DEVICES=0,1,2,3 python my_script.py
或者:
os.environ[“CUDA_VISIBLE_DEVICES”] = “0,1,2,3” #一定要加引號
在tensorflow中可以使用
這樣的方式來指定GPU進行某部分運算。
5.pytorch和tensorflow中的tensor與numpy轉換
5.1 pytorch的tensor與numpy數組轉換
pytorch的tensor對象與numpy數組是可以相互轉換的,且numpy數組的默認類型是double.
(1)tensor轉numpy:
# a是 <class ‘torch.Tensor’> # b和c是 <class ‘numpy.ndarray’> a = torch.ones(2,2) b = a.numpy() # 方法1 c=np.array(a) # 方法2,也可以轉numpy數組(2)numpy轉tensor:
# a是 <class ‘numpy.ndarray’> # b和c是 <class ‘torch.Tensor’> a = np.ones(5) b = torch.from_numpy(a) # 方法1 c=torch.Tensor(a) # 方法2,也可以轉pytorch Tensor5.2 TensorFlow中 tensor與numpy數組轉換
(1) ndarray 轉化為 tensor
TensorFlow 通過 convert_to_tensor 這個函數進行轉換,代碼如下:
# 創建ndarray array = np.array([1, 2, 3, 4], np.float32) # 將ndarray轉化為tensor t = tf.convert_to_tensor(array, tf.float32, name='t') print(t)Tensor("t:0", shape=(4,), dtype=float32)(2) tensor轉化為ndarray
方法1:直接轉化
# 創建張量 t = tf.constant([1, 2, 3, 4], tf.float32) session = tf.Session()array = session.run(t) # 張量轉化為ndarrayprint(type(array)) print(array)<class 'numpy.ndarray'> [ 1. 2. 3. 4.]方法2: 利用Tensor的成員函數eval
t = tf.constant([1, 2, 3, 4], tf.float32) session = tf.Session()array = t.eval(session=session) # 張量轉化為ndarray print(type(array)) print(array)<class 'numpy.ndarray'> [ 1. 2. 3. 4.]上面這種方法也可以這么寫
t = tf.constant([1, 2, 3, 4], tf.float32) # 張量轉化為ndarray with tf.Session() as session:array = t.eval()print(type(array))print(array)<class 'numpy.ndarray'> [ 1. 2. 3. 4.]6.pytorch數據的并行計算(DataParallelism)
摘自:https://blog.csdn.net/Alawaka2018/article/details/80993197
.to(device)
\left( \frac{ \frac{x_b - x_a}{w_a} - \mu_x }{\sigma_x}, \frac{ \frac{y_b - y_a}{h_a} - \mu_y }{\sigma_y}, \frac{ \log \frac{w_b}{w_a} - \mu_w }{\sigma_w}, \frac{ \log \frac{h_b}{h_a} - \mu_h }{\sigma_h}\right)
7.Pytorch查看可訓練參數,添加no bias decay實現
參考:https://blog.csdn.net/jeryjeryjery/article/details/83057199
遍歷named_parameters()中的所有的參數,只打印那些param.requires_grad=True的變量,就是模型中所有的可訓練參數列表
model.parameters()只有數值,model.named_parameters()既有名稱,也有數值,model.parameters()就是從model.named_parameters()中提取的數值
下面是對params進行修改,只對權重進行衰減,不對偏置衰減:
import torch.optim as optim### no bias decay ## 把model.named_parameters參數中的偏置和權重分別添加到各自的列表中。 ## 由于model.named_parameters()中只有(卷積層和BN層的)權重和偏置,所以optim.SGD()中的model.parameters()可以用weight_p, bias_p代替。 weight_p, bias_p = [],[] for name, p in model.named_parameters(): if 'bias' in name:bias_p += [p] else:weight_p += [p]for name, param in model.named_parameters(): if param.requires_grad:print(name) # Optimizer # optimizer = optim.SGD(model.parameters(), lr=hyp['lr0'], momentum=hyp['momentum'], weight_decay=hyp['weight_decay'], # nesterov=True) optimizer = optim.SGD([{'params': weight_p, 'weight_decay': hyp['weight_decay']},{'params': bias_p, 'weight_decay': 0}],lr=hyp['lr0'],momentum=hyp['momentum'], nesterov=True)可能在加入no bias decay的代碼后,會出現下面的錯誤,原因是因為你需要重頭開始訓練,而不能在某個epoch中斷訓練后修改代碼添加進no bias decay之后從檢查點恢復訓練,
你都把可訓練參數修改進了weight_p, bias_p了,自然找不到之前訓練的參數了。
8.Pytorch凍結梯度,只訓練某幾層網絡權重
具體實例及講解參考 https://blog.csdn.net/u012436149/article/details/66971822
這里講一下requires_grad和volatile:
(1)在訓練時如果想要固定網絡的底層,那么可以令這部分網絡對應子圖的參數requires_grad為False。這樣,在反向過程中就不會計算這些參數對應的梯度。
(2)Variable的參數volatile=True和requires_grad=False的功能差不多,但是volatile的力量更大。當有一個輸入的volatile=True時,那么輸出的volatile=True。volatile=True推薦在模型的推理過程(測試)中使用,這時只需要令輸入的voliate=True,保證用最小的內存來執行推理,不會保存任何中間狀態。
9.安裝anaconda后取消命令行前出現的base
安裝conda后取消命令行前出現的base,取消每次啟動自動激活conda的基礎環境
參考: https://blog.csdn.net/u014734886/article/details/90718719
方法一:
每次在命令行通過conda deactivate退出base環境回到系統自動的環境
方法二
1,通過將auto_activate_base參數設置為false實現:
conda config --set auto_activate_base false2,那要進入的話通過conda activate base
3,如果反悔了還是希望base一直留著的話通過conda config --set auto_activate_base true來恢復
總結
以上是生活随笔為你收集整理的【深度学习】pytorch-tensorflow-anaconda笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Tools】git操作总结
- 下一篇: 【Tools】python环境操作笔记