踩坑記錄

  1. conda安裝 & tensorflow安裝(2019.12.12-2019.12.13 )

Anaconda官方下載網(wǎng)站

第n次安裝conda遼。

conda安裝時,會一直跟你互動,在問你要不要配置環(huán)境變量時選擇yes就好,否則要手動加。

應該可以參考這一篇:https://blog.csdn.net/ITBigGod/article/details/85690257

tensorflow官方下載網(wǎng)站

tensorflow我給您拜早年了。裝了好久好久都有問題,真的我險些就認輸了。

剛開始python是3.7的,安裝tf2.0,報錯。試了幾個1.x的tf,依舊報錯。但是在網(wǎng)上查到tf現(xiàn)在明明是支持3.7呀。于是新建了3.6的環(huán)境,繼續(xù)嘗試各種版本??偣灿鲆姟癆ttributeError: module 'tensorflow' has no attribute 'contrib'”、“Failed to load the native TensorFlow runtime”、“ImportError: cannot import name 'pywrap_tensorflow' from 'tensorflow.python'”等等等等error。時間久遠我也不記得具體的解決方案,總之如果版本就行就卸載!來回折騰了好久好久,終于安裝成功了。

最后的配置是,python 3.6.9+tensorflow 1.12.0+CUDA 9.2.148+CUDNN 7.6.4

總之,以后要注意版本匹配,有點耐心。安裝時用tensorflow-gpu。

  1. conda 語句(2019.12.12)
  • 創(chuàng)建新環(huán)境
conda create -n new_env_name python=3.6

刪除環(huán)境、重命名環(huán)境戳此

  • 安裝opencv
conda install opencv-python
  1. jupyter notebook 遠程訪問服務器 (2019.12.17)

因為跑程序需要先導入數(shù)據(jù)集,這個過程很慢,后面如果報錯還要從頭再來,所以希望能夠遠程使用Jupyter Notebook。服務器已經(jīng)安裝好了Jupyter,所以重點就是怎么進行端口轉發(fā)啦。主要參考了這幾篇:Jupyter notebook遠程訪問服務器 & How to set up a jupyter notebook to run ipython on ubuntu 16.04 & 通過PuTTY進行端口映射并且啟動Jupyter Notebook(fail)

還有個問題就是8888端口一直被占用,我打開jupyter notebook時使用 --port==8889 命令指定端口也莫名無效。機智的我最后的方法是,連接服務器->打開jupyter notebook ->查看端口 ->打開新窗口連接服務器并進行端口轉發(fā)->web打開jupyter notebook。

  1. jupyter notebook 選擇conda環(huán)境 (2019.12.18)

好不容易打開了jupyter notebook,結果change kernel那里沒得選,空空如也只有一個默認項。這丫怎么跑啊。試了一下這個方法conda install nb_conda_kernels
,結果依舊白搭。然后又試了一下這個方法conda install nb_conda。我的kernels終于顯現(xiàn)了qwq!

  1. linux語句 (2019.12.18)

5.1 在線下載
新get到從網(wǎng)盤下載數(shù)據(jù)集的方法。首先復制下載鏈接,使用命令:wget -c -O name.tar http://blabla。-c:斷點續(xù)傳(continue)。-O:下載文件在指定位置并進行重命名,大寫!

5.2 文件解壓
zip文件有size限制,文件太大時會報錯。壓縮文件最好保存為tar。解壓語句tar -xvf $name.tar -C $filename。-x:解壓。-v:顯示所有過程。-f: 使用檔案名字,切記,這個參數(shù)是最后一個參數(shù),后面只能接檔案名。-C 是解壓到指定目錄中,注意要大寫。具體的命令可參照:Linux下的tar壓縮解壓縮命令詳解

5.3 查看CUDA和CUDNN版本
cat /usr/local/cuda/version.txt
cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2

  1. 安裝pytorch(2019.12.29)
    中間劃水了十天,你可真行。
    pytorch官網(wǎng)

conda install pytorch torchvision cudatoolkit=9.2 -c pytorch

  1. torch的save問題(2020.1.1)

打算跑TFeat的訓練代碼。首先下載數(shù)據(jù)集,然后讀入patch和label,制作dataset并轉成tensor格式,利用torch.save(dataset,f)函數(shù)存成xxx.pk文件。結果打開文件,是下面的內容。

error

于是我就納悶了,編碼哪里不對了呢。我一開始也不知道這是啥意思,就從utf-8編碼格式入手。菜鳥教程上說:

Python中默認的編碼格式是 ASCII 格式,在沒修改編碼格式時無法正確打印漢字,所以在讀取中文時會報錯。解決方法為只要在文件開頭加入# -*- coding: UTF-8 -*-或者 # coding=utf-8 就行了

但是這是對于python程序來說的呀,我這里是文件編碼的問題。于是又仔細看了看我文件打開方式:

with open(datapath, 'wb') as f:
    torch.save(dataset, f)

會不會是打開文件的時候沒有指定編碼方式呢?然后我把語句改成了with open(datapath, 'wb', encoding='utf8') as f:,結果報錯說binary不能encoding。

我仔細一尋思,binary,也就是這里wb中的b,wb是指:以二進制格式打開一個文件只用于寫入。那會不會是說文件其實存好了,只是由于不是utf-8編碼,所以顯示不出來呢?于是為省時間,我在程序中只跑了第一個圖片,save一下,然后用torch.load()查看數(shù)據(jù),還真成功了。我去。

  1. git命令學習(2020.1.1)
    廖雪峰的git教程

上條說到,我修改了程序,只跑第一個圖片。沒想到問題又來了,我這時候再把程序改回去,保存,再跑,還是只跑第一個圖片...我又研究了一下git恢復歷史版本,但還是白搭。最后的最后,我決定重新git clone(微笑)。

  1. 保存數(shù)據(jù)的方法(2020.1.1)

其實,遇到encoding這個問題之后,我覺得可能是torch.save函數(shù)的問題,于是想換個保存數(shù)據(jù)的方法。無論換什么方法,結果都是同樣的錯誤,我后來才轉變思維方式。

那都嘗試了什么方法呢?

  1. linux查看當前目錄文件大小

ls -lht會列出當前目錄下每個文件的大小,同時也會給出當前目錄下所有文件大小總和

11.軟連接(2020.2.12)
ln -s $current_path $new_path

12.opencv版本(2020.2.12)
opencv的函數(shù)不能使用。根據(jù)該博客的指導,檢查opencv的版本,是4.1.2,由于某種原因該版本有限制。于是將opencv進行降級。

版本太高

pip uninstall opencv-python
pip install opencv-python==3.4.1.15
pip install opencv-contrib-python==3.4.1.15
降級后操作成功
  1. jupyter端口映射失?。?020.2.25)
    問題:jupyter連接不上,提示:open failed connect failed: Connection refused
    方案:根據(jù)教程,在端口映射語句后加-v,得以解決。

  2. 正則表達式(2020.2.25)
    https://blog.csdn.net/shuryuu/article/details/82910857
    先馬,稍后再寫

  3. python添加模塊搜索路徑(2020.2.27)

使用下段代碼,即可把該路徑添加為模塊搜索路徑。

import sys
sys.path.append(r‘/home/xxx/xxx/’)

該博客有更全面的講解,包括包的調用語句等等。

16.kmeans模型保存(2020.2.27)

方法1:利用sklearn2pmml,需要pip一下

from sklearn.feature_extraction.text import CountVectorizer, TfidfTransformer, TfidfVectorizer
from sklearn2pmml.feature_extraction.text import Splitter
from sklearn.cluster import KMeans
from sklearn2pmml.pipeline import PMMLPipeline
from sklearn2pmml import sklearn2pmml

// 構建pipeline
pipeline = PMMLPipeline([("td_vector", TfidfVectorizer(max_df=0.7, min_df=0.01, tokenizer=Splitter(), norm=None)), ("km", KMeans(n_clusters=100, random_state=1000))])
// 需要注意的是TfidfVectorizer 1)一定不能使用正則;2)使用分詞器tokenizer=Splitter()
pipeline.fit(sentences)
sklearn2pmml(pipeline, "hzd.pmml")

reference:python sklearn2pmml保存tfidf+kmeans模型

方法2:使用joblib

from sklearn.externals import joblib
joblib.dump(km_cluster, "/..../train_model.m")
km_cluster = joblib.load(".../train_model.m")
kmeans_SSE.labels_

reference:k-means+python︱scikit-learn中的KMeans聚類實現(xiàn)( + MiniBatchKMeans)

17.利用pycharm進行遠程開發(fā)(2020.2.27)

教程這里,只有professional版才可以遠程,而我安裝的community是不可的,so sad。我也不記得是從交大軟件授權中心下載的還是從官網(wǎng)下載的了...所以要安裝vscode嗎...

ps.在help->about查看pycharm信息。

  1. python中的文件讀取(2020.2.28)

可參考Python文件內容按行讀取到列表中

  1. anaconda環(huán)境變量(2020.3.11)

昨天電腦崩了,突然藍屏。收集完錯誤信息,就卡在100%。強制關機再開,不過幾秒鐘又藍屏,心累。給出了幾條建議,“啟動修復”無法修復電腦,檢測了我電腦的組件都ok。實在找不出是哪里的問題,無奈之下重裝了系統(tǒng)。雖然保留了文件,但是應用全卸掉了,也就是說只是移除了環(huán)境變量。應用需要一個個地再搞回來。
cmd無法使用anaconda,于是參考https://www.zhihu.com/question/278148333配置anaconda的環(huán)境變量。配置好就ok了。

XXX\Anaconda:這里面有下載Annconda后自帶的python解釋器(python.exe)
XXX\Anaconda\Scripts:這里面有anaconda.exe

  1. 環(huán)境變量配置++(2020.3.11)

使用pip的時候,報錯"pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available",在這篇文章找到了答案:https://stackoverflow.com/questions/45954528/pip-is-configured-with-locations-that-require-tls-ssl-however-the-ssl-module-in
D:\Anaconda3\Library\bin加入環(huán)境變量后就成功了。

  1. tensorflow的問題(2020.3.11)

為啥使用pip呢,這個要從tensorflow說起。在conda環(huán)境下,我可以import
tensorflow,但是在pycharm和cmd中就會報錯:


報錯QAQ

我用如下語句查看正在使用的python:

import sys
sys.executable

發(fā)現(xiàn)明明是一樣的呀…Anyway,繼續(xù)上網(wǎng)找答案。有文章說重新裝一下pip install --upgrade --ignore-installed tensorflow,好咧,我就遇到了上一條pip不能用的問題。解決完后依然安裝失敗。

報錯QAQ

經(jīng)https://stackoverflow.com/questions/16025788/why-does-pip-fail-with-bad-md5-hash-for-package提醒,語句改為 pip install tensorflow --upgrade --no-cache-dir,雖然我也沒研究為啥。然后似乎安裝得差不多,相關的依賴包報了幾個錯。反正試試吧。然后tensorflow就能用了。我好不求甚解又知足常樂一人。

  1. cuda(2020.3.12)
    設定使用的gpu語句
os.environ['CUDA_VISIBLE_DEVICES']='0'

23.cuda out of memory(2020.3.12)
不明白為啥inference的時候也會顯存不足,哎,加了一句with torch.no_grad():(參考自:https://www.zhihu.com/question/326044178),不知道有沒有效,似乎快了許多。

不計算梯度

再試個地方
不計算梯度

查看:print(patches.requires_grad)
torch.cuda.empty_cache()也可以用:https://blog.csdn.net/qq_29007291/article/details/90451890

這里提到了如何在訓練時解決out of memory的問題,先馬:https://zhuanlan.zhihu.com/p/82642936

再次淺談Pytorch中的顯存利用問題(附完善顯存跟蹤代碼):https://oldpan.me/archives/pytorch-gpu-memory-usage-track

  1. cuda out of memory的真正原因(2020.3.12)

我一直在想,它給我報錯RuntimeError: CUDA out of memory. Tried to allocate xxx GiB (GPU 0; xxx GiB total capacity; xxx GiB already allocated; xxx MiB free; xxx MiB cached),那怎么才能限制allocate的要求的大小呢,別這么high-demanding行不行呢。

額,直到我print了一下descriptor的大小,才發(fā)現(xiàn)這是我自己的鍋。有的圖片提取了成千上萬個特征點,這些patches是一起送進網(wǎng)絡的,所以會顯存不足。機智的我(?)想起用dataloader的方法,把patches拆開,果然work了。

before:

descrs = model(patches)
return descrs.detach().cpu().numpy()

After:

from torch.utils.data import DataLoader
dataloader = DataLoader(dataset=patches, batch_size=4000,drop_last=False)
descrs = np.array([])
for batch_datas in dataloader:
       print(batch_datas.shape)
       batch_descrs = model(batch_datas).detach().cpu().numpy()
       if descrs.shape[0] == 0:
            descrs = batch_descrs
       else:
            descrs = np.vstack((descrs, batch_descrs))
       return descrs
  1. 把python結果保存到log中(2020.3.12)

方法一:在命令行寫入log
python test.py >1.log將輸出結果記錄到1.log(覆蓋寫入)
python test.py >>1.log將輸出結果追加到1.log(每次追加)
方法二:在程序里定義

import sys
sys.stdout = open('1.log', 'a')
print "info ..."

方法三:使用logging模塊
https://blog.csdn.net/momoyaoquaoaoao/article/details/87280440

  1. brisk 特征提?。?020.3.12)

tfeat給出的例子使用brisk提取的key point,但有的圖片特征點會特別多。盡管用dataloader已經(jīng)解決了顯存不足的問題,但出于控制指紋大小的考慮,希望控制一下特征點的數(shù)量。然而brisk 特征提取的語句,并沒有控制點的數(shù)量的參數(shù),充其量有個thresh

brisk = cv2.BRISK_create(thresh=100)
kp, des = brisk.detectAndCompute(img,None)
kp = brisk.detect(img,None)

那只取前N個點可以嗎?掃了一眼brisk源碼,并沒有發(fā)現(xiàn)像sift一樣有排序的語句。于是試驗了一下,并不可行。返回的特征點似乎是位置排序的。

取1000/3625,發(fā)現(xiàn)點的縱坐標只分布在[0,291],看樣子是按坐標排列的

補充1:sift特征提取的語句

import cv2
sift = cv2.xfeatures2d.SIFT_create(2000)
kp=sift.detect(img,None)
kp,des=sift.detectAndCompute(img,None)

補充2:畫出特征點的語句,并不懂outImg這個參數(shù)是干嘛用的

import cv2
from matplotlib import pyplot as plt
img = cv2.drawKeypoints(img_c,kp, img, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
plt.imshow(img),plt.show()

補充3:兩張圖片特征匹配的語句,以brisk特征為例

import cv2
import numpy as np
from matplotlib import pyplot as plt

img1 = cv2.imread('imgs/v_churchill/1.ppm',0) 
img2 = cv2.imread('imgs/v_churchill/6.ppm',0)

brisk = cv2.BRISK_create()
kp1, des1 = brisk.detectAndCompute(img1,None)
kp2, des2 = brisk.detectAndCompute(img2,None)

bf = cv2.BFMatcher(cv2.NORM_HAMMING)
matches = bf.knnMatch(des1,des2, k=2)
# Apply ratio test
good = []
for m,n in matches:
    if m.distance < 0.8*n.distance:
        good.append([m])
        
img3 = cv2.drawMatchesKnn(img1,kp1,img2,kp2,good,0, flags=2)
plt.imshow(img3),plt.show()

權衡后,決定用sift來提取,今天才知道opencv的sift可以只detect不describe,太方便啦!
這里有幾個descriptor的opencv語句,后面可以做些實驗比較:https://blog.csdn.net/amusi1994/article/details/79591205

  1. pycharm在debug模式下交互(2020.3.12)

作為pycharm的重度發(fā)燒友,今天才知道怎么在debug模式下看輸入和輸出…

當跑到需要input命令的語句,界面就會這樣:

empty

這時候,點擊一下右邊的console就歐了。
console

  1. tensorflow estimator(2020/3/13)

報錯:AttributeError: module 'tensorflow' has no attribute 'estimator'
原因:tensorflow和tensorflow-estimator版本不一致,卸載tensorflow-estimator后重裝。

  1. cuda 占用(2020/3/13)

目前來看,我只能同時跑一個程序,如果跑兩個,就會有這樣的報錯:



所以,如果出現(xiàn)了這種錯誤,要么我前一個程序忘關了,要么是占用的gpu太大。


每嘗試run一次就有一個峰 然后迅速降落…
  1. 查看進程的詳細信息(2020/3/18)
ps  -aux |grep xxx
  1. git 恢復修改的文件(2020/3/18)

對于恢復修改的文件,就是將文件從倉庫中拉到本地工作區(qū),即 倉庫區(qū) ----> 暫存區(qū) ----> 工作區(qū)。

情況I:
只是修改了文件,沒有任何 git 操作,直接一個命令就可回退:

$ git checkout -- aaa.txt # aaa.txt為文件名

情況II:
修改了文件,并提交到暫存區(qū)(即編輯之后,git add但沒有 git commit -m ....

$ git reset HEAD    # 回退到當前版本
$ git checkout -- aaa.txt    # aaa.txt為文件名

情況III:
修改了文件,并提交到倉庫區(qū)(即編輯之后,git addgit commit -m ....

$ git reset HEAD^    # 回退到上一個版本
$ git checkout -- aaa.txt    # aaa.txt為文件名

credit to:https://www.cnblogs.com/webPang/p/10531045.html

待填:安裝vscode

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容