本博文是在學習吳茂貴等人的書籍《Python深度學習基於Pytorch》(英文名為《Deep Learning with Python and Pytorch》)的時候,記錄下來的一些筆記,還有版本更新時候可能會出現的問題。 我手中書的版本是2019年10月第一版第一次印刷,已經過去兩年了,不知道學起來會遇到哪些問題。我的Python版本是3.7.7。隨後遇到問題還會進行更新,雖然之前幾本在讀的書有的同步更新,有的已經鴿了,但相信我可以的。
書中第18頁,1.6節通用函數,1.math與numpy函數的性能比較。這裡計時用到的函數是time.clock()記錄開始和結束時間,並以此作為估計。不過會出現這樣的提示DeprecationWarning: time.clock has been deprecated in Python 3.3 and will be removed from Python 3.8: use time.perf_counter or time.process_time instead
,意思是說在3.8版本之後time.clock將會消失,所以使用time.process_time()
加以替換即可。 另外,記錄一下在我的電腦上面,math.sin和numpy.sin的時間對比,可以看到numpy.sin比math.sin運行速度快了14倍。 在按照書中25頁資料(第2.2.2節),使用conda安裝pytorch的時候,安裝過程中會遇到無法找到名為conda的module,當錯誤發生之後,原本的conda環境也無法使用。這個問題似乎是因為如果默認在base環境下面安裝pytorch的時候,會覆蓋本機的python包,導致版本號不符。解決方案是使用rm -rf ./anaconda3
,先把anaconda環境完全卸載掉(因為已經不知道anaconda內部到底哪裡出現了問題,只能完全暴力卸載了)。 接下來使用conda create pytorchenv python=3.7
專門創建一個安裝pytorch環境的conda環境。並切換環境conda activate pytorchenv
,在這個環境中安裝torch即可conda install pytorch torchvision torchaudio cudatoolkit=11.1 -c pytorch -c nvidia
。 書中27頁(第2.3節),配置本機訪問服務器Jupyter Notebook的時候,遇到了本機和電腦服務器無法連接的問題。原因可能是服務器的防火牆開啟,需要在本機和服務器之間建立一個ssh安全連接。ssh安全連接指令為ssh 服務器的用戶名@服務器IP -L 127.0.0.1:1234:127.0.0.1:8888 -p 端口號
總體訪問流程如下:首先在服務器上調整jupyter的配置文件,包括端口號/密碼/允許遠程訪問/允許全體ip訪問/默認關閉浏覽器窗口。接下來需要在本機建立與服務器jupyter notebook的ssh連接,注意指定服務器連接用端口號,否則會因為防火牆拒絕而無法訪問。最後在本機浏覽器通過ip:端口就可以訪問。 書中46頁(第2.8節),嘗試使用Tensorflow進行復現的時候,發現tensorflow裡面沒有placeholder這個模塊。原因是使用conda install tensorflow默認安裝的是tensorflow 2.4版本的內容,而placeholder占位符是tensorflow 版本1的內容了。解決方案是: import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
繪圖的時候,如果不希望添加橫坐標和縱坐標的數值的話,可以使用plt.xticks([])
來禁用。 繪圖的時候,可以在繪制某幅圖像的時候,plt.scatter(x, y, label='something')
直接添加label。而不必在這之後另外繪制。 當使用datasets.ImageFolder(路徑名)的時候,系統會將該文件夾下面的所有圖片,按照文件夾進行分類和貼標簽,只需要將一類文件/圖片放到同一個文件夾下面,就可以使用datasets.ImageFolder批量構建文件數據集合了。 下面簡單介紹一下如何使用本地浏覽器,查看服務器端的tensorboard可視化樣例。 tensorboardX在Web端進行顯示的方法如下; 1).在服務器端使用conda activate pytorchenv,進入pytorch環境下。 2).tensorboard --logdir=~/logs/logs --port 6006,這裡制定好了log地址之後,使用python也需要將對應的標簽輸出到這個log文件夾下面。 3).使用ssh命令建立本機與服務器端的連接。ssh 用戶名@IP地址 -L 127.0.0.1:6006:127.0.0.1:6006 -p 6138 4).在本機浏覽器中登錄localhost:6006即可。 如果想要刪除tensorboard中的某些圖像,需要點開剛剛的logs文件夾,刪除對應的標簽文件。只有重啟tensorboard服務之後,才能發現這幅圖像已經被刪除了。 有一個疑問,是關於歸一化問題的。在訓練過程中會減去平均值和除以標准差,減去的應該是訓練數據集的平均值和標准差。在測試階段以及評估階段,應該也需要減去平均值和除以標准差,這個時候應該用誰的均值和標准差呢?訓練集的平均值和標准差,還是測試集的平均值和標准差呢? 在這本書裡第五章的5.3.2節對應代碼中,展示出來的方法是,在預測的時候,也減去訓練數據集合上的平均值和標准差,不知道這樣做是否正確。 #對訓練數據進行標准化
mean=X_train.mean(axis=0)
std=X_train.std(axis=0)
X_train-=mean
X_train/=std
X_test-=mean
X_test/=std
在書中86頁的地方,做了一個批量正則化、批量隨機置零的操作,用來表明使用這些方法會對泛化的特性有所提高。但是經過我的實際驗證,發現使用了這些方法之後,損失函數下降的速度變慢了。不知道這是否與書中所介紹的內容所一致。 在測試數據集上進行運算得到的損失值 在訓練數據集上進行運算得到的損失值 但是在書裡面的運行結果是如下的:dropout得到的損失值,是要明顯小於original原始數據的。這就有點讓人費解了。