Linux服務器+GPU配置總結(四)

1. Docker: 是一個開源的應用容器引擎,可以讓開發者打包自己的應用以及依賴包到一個可移植的容器中,然後發佈到任何流行的Linux機器上,也可以實現虛擬化。容器是完全適用沙箱機制,相互之間不會有任何接口。中文名是應用容器引擎,類別是操作系統層虛擬化,所使用的編程語言是Go語言。

2. Go語言:是Google開發的一種靜態強類型、編譯型、併發型,並具有垃圾回收功能的編程語言。類似於C語言,但對變量的聲明有所不同,與Java不同的是Go內嵌了關聯數組(哈希表或字典),就像字符串類型一樣。

3. Go語言的特性:擁有C語言的簡潔和性能,還很好的提供了21世紀互聯網環境下服務端開發的各種使用特性,讓開發者在語言級別就可以方便得到自己想要的東西。Go語言的關鍵特性:

a. 併發與協程;

b. 基於消息傳遞的通信方式;

c. 豐富使用的內置數據類型;

d. 函數多返回值;

e. defer機制;

f. 反射(reflect);

g. 高性能HTTP Server;

h. 工程管理;

i. 編程規範。

4. Go語言的優勢:Tec採用的scala語言,在spark上進行開發。Go語言的優勢包括:性能,語言性能,開發者效率,併發性和多通道,快速的編譯時間,打造團隊的能力,強大的生態系統,GOFMT,強制代碼格式,gRPC和Protocol Buffers,Go語言的缺點有:缺少框架,錯誤處理不太好,和軟件包管理不太好。

5. Scala和Python語言的比較:Scala速度更快,使用方便但上手難,而Python則較慢,但很容易使用。

6. Jupyter Notebook(之前稱爲IPython notebook):是一個交互式筆記本,支持運行40多種編程語言。其本質是一個web應用程序,便於創建和貢獻文學化程序文檔,支持實時代碼,數學方程,可視化和markdown。用途包括:數據清理和轉換,數值模擬,統計建模,機器學習。

7. Jupyter Notebook的安裝,轉載自:

    https://blog.csdn.net/jenyzhang/article/details/73275232

    Jupyter Notebook是一個Web應用程序,允許創建和共享包含實時代碼,方程,可視化和說明文本的文檔。是Ipython的升級版,而Ipython是一個加強版的交互式Shell,比在terminal裏運行python更加方便,界面更友好。

步驟:

a.  sudo apt-get update

     sudo apt-get upgrade

     sudo apt-get install python-pip

     sudo pip install --upgrade pip

     sudo pip install jupyter

b. 在終端運行:jupyter notebook。

c.  在Web界面右上角New按鍵裏面就有Terminal等交互式窗口,還可以創建python文件,然後在Web界面上運行自己的代碼。

需要注意的是:在windows下jupter不能使用jupyter。

8. Lua語言:是一種腳本語言,用C語言編寫,源碼開放,設計目的是爲了嵌入程序應用,爲應用程序提供便利的擴展功能,提供靈活的定製功能,主要應用於遊戲編程領域,除此之外還應用於獨立應用腳本,web應用腳本,擴展和數據庫插件等。特點是簡潔,非常小,性能高,不限制編程範式,Table是Lua裏最基本的、最常用且唯一的幾乎萬能的數據結構。

9. AxiDraw是Evil Mad Scientist團隊研發出來的可以代替人手寫字的機器手,產品看着很新穎,挺有意思的。

10. 在調用“import tensorflow as tf”時出現:libcublas.so.9.0: cannot open shared object file: No such file or directory問題的解決方法:

                                          sudo ldconfig /usr/local/cuda-9.0/lib64

如果有多個路徑需要添加,路徑之間只需要加上空格就行,例如:sudo ldconfig /usr/local/cuda-9.0/lib64 /home/vipadm3/softwares/cuda/cudnn/cuda/lib64.

11. ldconfig介紹:ldconfig是一個動態鏈接庫管理命令,爲了動態鏈接庫爲系統所共享,還需要運行動態鏈接庫的管理命令,ldconfig,ldconfig的主要用途是在默認搜索目錄以及動態庫配置文件內所列的目錄下搜索出可以共享的動態鏈接庫,linux的共享庫採用了類似告訴緩存的方式,首先是從/etc/ld.so.cache裏面尋找,然後從ld.so.conf中的路徑尋找。

12. python中os.walk介紹: 其是一個簡單易用的文件、目錄遍歷器。使用方法:

    import os

    from os import walk

    函數聲明:walk(top,topdown=True,οnerrοr=None,followlinks=False)

    其中top是需要遍歷的目錄,topdown則優先遍歷top目錄,否則優先遍歷子目錄,默認topdown爲真。

13. backbone: 骨幹,脊樑骨,脊椎,分水嶺,決心,毅力;duplicate:重複,複製,複印。

14. shuffle:洗牌,打亂,重新開始;meta:元數據的,meta-information: 元信息,元素可提供相關頁面的元信息,比如針對搜索引擎和更新頻度的描述和關鍵詞。

15. python中random.choice的用法:random.choice(給定數組),用途:從給定數組中隨機選擇一個元素返回。

16. RAID:磁盤陣列,redundant arrays of independent drives, raid, 意思是獨立磁盤構成的具有冗餘能力的陣列。磁盤陣列是由很多價格較便宜的磁盤,組合成一個容量巨大的磁盤組,利用個別磁盤提供數據所產生加成效果提升整個磁盤系統效能。利用這項技術,將數據切割成許多區段,分貝存放在各個硬盤上。

        磁盤陣列還能利用同爲檢查過的觀念,在數組中任意一個硬盤故障時,認可讀出數據,在數據重構時,將數據經過計算後重新置入新硬盤中。

17. 在使用了raid後,磁盤的速度和容量會有所不同。今天在安裝175.94的機器時,發現總共有(4*2T),但是實際上只能用4T容量,大小縮減了一半。記得當時徐博坤也提過這件事情。

Raid0: 速度N倍,容量N倍,安全性較差;

Raid1: 速度N的半數,容量只有一半,安全性最好;

Raid2-3: 不用考慮;

Raid5:速度N-1,容量N-1,讀盤速度稍微快一些,寫入相對效率低一些,但是綜合安全性和硬盤利用率最好;

Raid6: 類似5,速度低於N-2,容量N-2,成本高了不少,但更安全;

Raid10: 即Raid0+Raid1,既安全,又能提高速度,但硬盤容量只有一半,速度達到N的一半。

一般常用的方案是將系統裝在固態硬盤裏,將數據放在磁盤裏,這樣磁盤就可以全部用上。

18. pycharm中報錯“python package tools not found”問題的解決:

      在終端輸入:在終端中輸入:sudo apt install python3-pip;如果有提示要安裝-f軟件,輸入指令安裝即可;

19. 阿里雲服務器使用步驟:在打開主機後採用XShell遠程連接軟件進行訪問,就如同採用XShell訪問自己的遠程服務器一樣。

20. 在ubuntu中查看自己安裝的scipy,numpy,matplotlib等軟件的版本方法:

a. 打開終端,輸入:python,進入python編輯環境;

b. 依次輸入下列指令:

    import scipy

    scipy.__version__

c. 顯示的結果就是scipy的版本,其他軟件也一樣。

21. keras中訓練時出現“generator_output=next(output_generator) StopIteration”問題的解決:

        問題原因:model.fit_generator函數中,steps_per_epoch*epochs的值大於或者等於訓練樣本的數目,此時樣本已經遍歷完成了,但是由於還要抽取數據而迭代器已經停止因此導致衝突。

解決方法:steps_per_epoch*epochs的值小於訓練樣本的數目,或者將抽取訓練樣本的語句設置爲無限循環的模式,例如下面的代碼:

def subtract_mean_gen(x_source,y_source,avg_image,batch):
    while True:
        batch_list_x=[]
        batch_list_y=[]
        for line,y in zip(x_source,y_source):
            x=line.astype('float32')
            x=x-avg_image
            batch_list_x.append(x)
            batch_list_y.append(y)
            if len(batch_list_x) == batch:
                yield (np.array(batch_list_x),np.array(batch_list_y))
                batch_list_x=[]
                batch_list_y=[] 

總之,一句話就是:“Generators for keras must be infinite”。改進前的代碼如下:

def subtract_mean_gen(x_source,y_source,avg_image,batch):
    batch_list_x=[]
    batch_list_y=[]
    for line,y in zip(x_source,y_source):
        x=line.astype('float32')
        x=x-avg_image
        batch_list_x.append(x)
        batch_list_y.append(y)
        if len(batch_list_x) == batch:
            yield (np.array(batch_list_x),np.array(batch_list_y))
            batch_list_x=[]
            batch_list_y=[] 

 22. predict_generator函數介紹:

原型: predict_generator(generator, steps=None, callbacks=None, max_queue_size=10, workers=1, use_multiprocessing=False, verbose=0)

       輸出: Numpy array(s) of predictions.

23. Win10系統往右鍵新建菜單中添加新程序的方法:

     在上面的Classes中添加新的.***即可。

24. PL用的繪圖軟件:origin。

25. 關於濾波器中filter:權重共享:一個卷積層(Wx+b=>ReLU=>maxpooling)可以有多個不同的卷積核,而每一個卷積核都對應一個濾波後映射出的新圖像,同一個新圖像中的每一個像素都來自完全相同的卷積核,這就是卷積核的權值共享。

26. 卷積核中的內容:卷積核裏面每個元素的具體值不是人工定義的,而是通過網絡學習到的,通常是隨機初始化再用BP算梯度做訓練,如果數據少或者沒有labeled data的話也可以考慮用K-means中的K箇中心點,逐層做初始化。

27. python fit中的verbose:

verbose: 日誌顯示;

verbose=0: 爲不在標準輸出流輸出日誌信息;

verbose=1: 爲輸出進度條記錄;

verbose=2: 爲每個epoch輸出一條記錄。

28. 在神經網絡的訓練中,epochs表示網絡中所有圖像的訓練次數,steps_per_epoch是通過用所有訓練圖像的數量除以批次大小得到,例如共有100張圖像,批大小batch_size=50,則steps_per_epoch的值爲2,參數batchsize表示每次訓練時在訓練集中所取的訓練樣本的數量。iteration表示的是使用batchsize個樣本訓練一次,1個epoch等於使用訓練集中的全部樣本訓練一次,一個epoch=所有訓練樣本的一個正向傳遞和一個反向傳遞。

29. fit_generator中的validation_steps參數意義:設置驗證多少次數據後取平均值作爲此epoch訓練後的效果,val_loss, val_acc的值直接受這個參數的影響;

30. python中常用的兩種讀圖方式:io.imread(),cv2.imread(),兩者讀出的圖片格式都是uint8,numpy array類型,cv2.resize()裁剪後的圖片還是以numpy array的方式保存,數值範圍爲(0-255),transform.resize()裁剪後的圖片是以float64的格式存儲的,數值的取值範圍爲(0,1)。

31. 實驗中發現導入matplotlib.pyplot和matplotlib的次序應如下,否則就有可能顯示不出來圖像:

import matplotlib.pyplot as plt

import matplotlib

matplotlib.use(‘Agg’)

如果上面的import matplotlib.pyplot as plt被放在了最後一句,那麼語句執行將顯示不出來圖像。

32. scores = model.evaluate(test_data,one_hot_test_label),返回的是損失值和選定的指標值(例如accuracy),原始英文文檔中的解釋爲:Returns the loss value & metrics values for the model in test mode。

33. 2019年6月2日,發現採用原3D-UNet中的optimizer效果很差,原始3D-UNet中的optimizer設置爲:

optimizer = Adam(lr=initial_learning_rate)

後來改爲: optimizer = “adam”。

34. keras中optimizer的選擇,使用方法有兩種:

a. 可以先初始化然後再用名字調用,例如下面;

    sgd = optimizers.SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)

    model.compile(loss='mean_squared_error', optimizer=sgd)

b. 直接調用名字:model.compile(loss='mean_squared_error', optimizer='sgd');

在使用的時候需要導入的庫的語句爲: from keras import optimizers;

常用的優化器有以下幾個:

    a. SGD;

    b. RMSprop;

    c. Adagrad;

    d. Adadelta;

    e. Adam;

    f. Adamax;

    g. Nadam.

35. 在深度學習中,打亂數據可以使訓練集,驗證集,測試集的數據分佈相同,例如,製作minibatch的時候,每經過一次epoch都要打亂一次數據,是每次輸入的minibatch分佈都不相同,可見打亂數據的重要性。

    一、打亂數據的代碼

    二、keras自定義generator

        需要注意的是,注意,在函數中需要用while寫成死循環,因爲每個epoch不會重新調用方法。當函數以yield關鍵詞返回,那麼這個函數則是個生成器,生成器指的是當它返回數據之後再次執行時再從這個地方繼續執行。

35. keras中採用fit_generator構建一個generator的方法:

a. 使用fit_generator的原因:深度學習中的數據通常會很大,即使在使用GPU的情況下,如果一次性將所有數據(圖像)讀入CPU內存,有可能導致內存崩潰,因此常採用fit_generator這個函數來解決。產生train_generator的例子如下:

產生validate_generator的示例代碼:

對上面代碼的解釋:

a. 函數中使用yield返回數據;

b. 函數中使用while true來進行循環,這個函數不停地在while函數中進行循環,需要在while循環中進行初始化設置,不需要在while循環外進行初始化;

36. 當一個完整的數據集通過了神經網絡一次並且返回了一次,這個過程稱爲一次epoch,例如,有一個2000個訓練樣本的數據集,將2000個樣本分成大小爲500的batch,那麼完成一個epoch需要4個iteration。

37. 激活最新版win10的方法:

1. 首先輸入產品祕鑰:如下:

Windows 10 Professional    W269N-WFGWX-YVC9B-4J6C9-T83GX

Windows 10 Professional N  (N代表歐洲市場定製版)     MH37W-N47XK-V7XM9-C7227-GCQG9

Windows 10 Enterprise NPPR9-FWDCX-D2C8J-H872K-2YT43

Windows 10 Enterprise N    DPH2V-TTNVB-4X9Q3-TJR4H-KHJW4

Windows 10 Education NW6C2-QMPVW-D7KKK-3GKT6-VCFB2

Windows 10 Education N    2WH4N-8QGBV-H22JP-CT43Q-MDWWJ

Windows 10 Enterprise 2015 LTSB (長期服務分支)   WNMTR-4C88C-JK8YV-HQ7T2-76DF9

Windows 10 Enterprise 2015 LTSB N  2F77B-TNFGY-69QQF-B8YKP-D69TJ

2. 然後啓用KMS軟件,找到安裝路徑,然後運行即可啓動(如果開始菜單沒有的話)。

38. Keras中的Conv2D函數,原型:

keras.layers.Conv2D(filters, kernel_size, strides=(1,1), padding=’valid’, data_format=None, dilation_rate=(1,1), activation=None, use_bias=True, kernel_initializer=’glorot_uniform’, bias_initializer=’zeros’, kernel_regularizer=None, activity_regularizer=None, kernel_constraint=None, bias_constant=None).

其中,filters是輸出空間的維度,即在卷積中輸出的濾波器的數目;

      Kernel_size: 卷積核的形狀大小;

      Strides:卷積時的步長;

      Padding,選擇valide或者same其中之一。

39. 仿射變換:Affine Transformation,是一種二維座標到二維座標之間的線性變換,保持二維圖形的平直性和平行性;平直性是指變換後直線還是直線不會打彎,圓弧還是圓弧;平行性是指二維圖形之間的相對位置關係不變,平行線還是平行線,相交直線的交角不變。

40. 仿射變換包括以下一系列的變換:

a. 平移,Translation;

b. 縮放,Scale;

c. 翻轉,Flip;

d. 旋轉,Rotation;

e. 剪切:Shear;

總共上述5種變換。

41. 從大類上來講,物體的變換主要有三種:(a). 剛體變換;(b)仿射變換;(c)投影變換。

剛體變換可用該式來表示:g(v) = R*v+t;

投影變換:perspective transformation, 是將圖片投影到一個新的視平面(viewing plane),也稱爲投影映射,projective mapping;

通用的圖像變換公式如下:

u,v是原始圖片座標,對應得到變換後的圖像座標,x’,y’,變換矩陣可以拆解成四部分, 表示線性變換,比如scaling,shearing,rotation; 用於平移, 產生透視變換,所以放射變換可以視爲透視變換的一種特殊形式,經過透視變換之後的圖片通常不是平行四邊形,除非映射視平面和原來平面平行。

42. 圖像中點(x,y)在(tx,ty)爲中心旋轉theta角度後縮放a(a>0)的座標值(xr,yr)算法是:

二維Unet中的數據生成字典中所擁有的操作:

  1. Rotation_range = 0.2;
  2. Width_shift_range = 0.05;
  3. Height_shift_range = 0.05;
  4. Shear_range = 0.05;
  5. Zoom_range = 0.05;
  6. Horizontal_flip = True;
  7. Fill_mode = ‘nearest’。

    上面包括了旋轉,平移,剪切,翻轉,縮放,5種,剛好和仿射變換中的五種變換模式一樣。

43. keras中卷積層的activation函數彙總:

默認激活函數爲linear,即輸入和輸出一樣。

44. keras中兩層相當於一層:

from keras.layers.core import Activation, Dense 

model.add(Dense(64)) 

model.add(Activation('tanh')) 

相當於:

model.add(Dense(64, activation='tanh')) #此處’tanh’是一個字符串 

也可以自定義一個函數如下:

def tanh(x): 

    return theano.tensor.tanh(x) 

model.add(Dense(64, activation=tanh)) #此處tanh是函數 

model.add(Activation(tanh))

45. sparse_categorical_crossentropy和categorical_crossentropy的區別,前者用於標籤編碼爲0,1,2等,後者用於標籤編碼爲one-hot編碼時。

46. fit_generator函數的第一個參數爲generator,其爲一個生成器或者Sequence對象的實例,以避免在使用多進程時出現重複數據,生成器的輸出應該爲以下之一:

a. 一個(inputs, targets)元組;

b. 一個(inputs, targets, sample_weight)元組,這個元組(生成器的單個輸出)表示一個獨立批次,因此,此元素中的所有數組必須具有相同的長度,等於此批次的大小,不同的批次可能具有不同的大小,例如,如果數據集的大小不能被批量大小整除,則最後一批時期通常小於其他批次,生成器將無限地在數據集上循環,當運行到steps_per_epoch時,記爲一個epoch結束。

47. Fine-Grained同一大類的不同子類劃分,稱爲細粒度分類。

48. keras的中文文檔好像已經停止更新,但是英文文檔仍在繼續更新。

49. ModelCheckpoint的原型如下:

keras.callbacks.ModelCheckpoint(filepath, monitor='val_loss', verbose=0, save_best_only=False, save_weights_only=False, mode='auto', period=1)

在上式中,monitor的值是原型中已經給了的,固定爲‘val_loss’,實驗中發現即使改變其值,結果沒什麼影響。

50. keras中BatchNormalization的工作原理:

根據上圖中的解釋,也就不難理解,爲什麼keras中文文檔中說在“data_format=channels_first”的2D卷積時,axis=1了,因爲,第一維是圖片的數目,當axis=1時也就是指的第二維度,是對通道這個維度進行歸一化,也就是上面藍色字的第一行:BatchNorm作用於CNN時,是針對一個圖片,由不同的filter生成的特徵圖所對應的點的歸一化。

52. 新版本的pycharm安裝後左上角菜單other裏面沒有快捷啓動方式的解決方法:按照網上說的那樣首先創建一個desktop的快捷啓動文件,然後將該文件移動到/usr/share/applications中,這樣就能顯示出來了,desktop文件中的內容是:

[Desktop Entry]

Version=1.0

Type=Application

Name=Pycharm

Exec=pycharm 的sh文件路徑,一般在安裝包中的bin文件夾中

Icon=pycharm的png圖標文件所在地址,一般也在安裝包的bin文件夾中

53. functools中的partial函數用法:當需要簡化目標函數只需要輸入部分參數時,可用partial函數簡化原來的函數,使得輸入變得簡潔。

54. pycharm中加入不了中文註釋的解決方法:

打開管理員賬戶中安裝pycharm的文件pycharm.sh,然後再其中加入以下語句:

注意是加在“Run the IDE”這句之前。

55. np.mean和np.std,分別計算矩陣的均值和標準差,函數原型爲:

Numpy.mean(a,axis,dtype,out,keepdims),axis不設置時是對整體m*n個數求取均值,返回一個實數,axis=0時對各列求平均值,axis=1時對各行求平均值。

56. python歸一化的幾種形式:

形式1([0,1]標準化): x_normalization=(x-Min)/(Max-Min)

形式2(Z-score): x_normalization=(x-miu)/sigma

形式3(sigmoid): x_normalization=1/(1+e^(-x))

57. 2019年7月22日遇到pycharm往環境變量一欄中添加變量添加不上的問題,解決方法是:最新版本的pycharm會自動檢查所輸入的值的正確性,應該去掉路徑的最後一個分號。

58. variational auto encoding: 簡稱VAE,中文稱爲變分自編碼器。是一個可以和GAN相媲美的生成網絡,可以輸入一個低維空間的Z,映射到高維空間的正式數據,比如生成不同樣子的數字、人臉、卡通圖像等。

59. GAN網絡的優點:a. 並不總是需要帶標籤的樣本來訓練;b. 更容易訓練依賴於蒙特卡洛近似的對數分割函數梯度生成的模型,由於蒙特卡洛方法在高維空間中不能很好地工作,這樣的生成模型不能很好地執行像使用ImageNet進行訓練的現實任務;c. 沒有引入任何確定性偏差,像變分自動編碼器這樣的某些生成方法會引入確定性偏差,因爲它們優化了對數似然的下界,而不是似然本身。

GAN的缺點: a. 特別難訓練,這些網絡試圖優化的函數是一個本質上沒有封閉形式的損失函數,因此,優化這一損失函數是非常困難的,需要在網絡結構和訓練協議方面進行大量的反覆試驗; b. 對於圖像生成,沒有適當的措施來評估準確性,由於合成圖像可以通過計算機本身來實現,因此實際結果是一個非常主觀的主題,並且取決於人類觀察者,相反,我們有起始分數和Frechet初始距離等功能來衡量他們的表現。

比較有名的GAN網絡:a. TAC-GAN網絡,文本圖像轉換網絡;

                     b. CGAN網絡,條件生成對抗網絡,用於Domain Transfer;

                     c. 用於Image Inpainting(圖像修復)/Image Outpainting(圖像拓

展),人臉合成,改變面部運動的網絡(GANimation);

 d. CycleGAN:繪畫-照片轉換,將繪畫轉換爲照片。

60. 最安全純淨的製作U盤啓動盤的方法是採用UltroISO將ubuntu或者其他軟件(Win10等)鏡像寫入U盤中,然後再從U盤進行啓動。

61. 採用DAEMON Tools也可以加載或者寫ISO文件到U盤,但是要收費,其可以實現和UltraISO同樣的功能,但是UltraISO免費。

62. 四種kill某個用戶所有進程的方法:

在linux系統管理中,我們有時候需要kill掉某個用戶的所有進程,初學者一般先查詢出用戶的所有pid,然後一條條kill掉,或者寫好一個腳本,實際上方法都有現成的,這邊有4種方法,我們以kill用戶zyc爲例.

1. pkill方式

# pkill -u zyc

2. killall方式

# killall -u zyc

3. ps方式

ps列出zyc的pid,然後依次kill掉,比較繁瑣.

# ps -ef | grep zyc | awk '{ print $2 }' | sudo xargs kill -9

4. pgrep方式

pgrep -u參數查出用戶的所有pid,然後依次kill

# pgrep -u zyc| sudo xargs kill -9

63. xfce4,GNOME和KDE三種都是典型的Linux桌面,只需要安裝其中一個即可。

64. ubuntu剛進去後沒有菜單欄的解決方法:

    右鍵面板->面板首選項->backup and restore -> apply configuration圖標

65. 數據增廣的方法除了keras中自帶的ImageDataGenerator之外,採用opencv中自帶的方法可以自己實現數據擴充。

66. ubuntu在永久掛載機械硬盤時,需要下面的一句:

UUID=904C23B64C23964E /media/aborn/data ntfs defaults        0      2

其中ntfs爲移動硬盤的系統文件類型,如果ntfs類型不對,應該先查看系統盤(也就是系統掛載的那麼移動硬盤)的文件類型,比如查看後系統盤的文件類型Ext4,那麼其他盤也應該設置爲Ext4類型,即將上面的ntfs更換爲ext4,這樣就能掛載。

67. ubuntu 刪除用戶: sudo userdel -r name,加上r參數表示連文件夾一起刪除。

68. ubuntu查看內存使用大小指令:free -m,其中後面的參數m表示以M(兆)爲單位。

69. Thinclient_drives: 瘦客戶機,採用高效的嵌入式高效CPU,利用嵌入式開發工具開發的獨立嵌入式操作系統,具有穩定可靠,完全兼容PC應用,使用方便,體積小巧,安靜節能的優點。

70. 刪除thinclient_drives的指令:

# umount thinclient_drives

# ls

# thinclient_drives

# rm thinclient_drives -rf       # 後面加個rf參數就能刪除整個路徑

# ls

71. 安裝ubuntu軟件時應該使用完整路徑,否則安裝不了。

72. 2019年7月26日,通過sudo nautilus進入到root環境下後,通過umount thinclient_drives使得右鍵可以打開終端,棒!

72-1. Ubuntu中右鍵打不開桌面上的terminal方法:

在 Settings Manager -> Preferred Applications 中重新設置默認終端

或重新安裝 xubuntu-default-settings

73. 在ubuntu中激活matlab後,創建快捷啓動方式之後,啓動時發現出現崩潰的問題,提示:no writting permission on directory: home/h205b/.matlab,解決該問題的方法是刪除掉該文件夾後再次啓動即可:

刪除該文件夾的命令:sudo rm -rf /home/h205b/.matlab

74. ubuntu中創建新用戶的正確方法應該是:sudo adduser,而不是:sudo useradd,否則創建的用戶沒有主文件夾。對應的刪除用戶的方法是:deluser和userdel。

75. 如果需要創建的快捷方式出現在左上角的菜單欄other裏面,只需要將創建的快捷方式複製到/usr/share/applications中。

76. 知乎上看到的去處thinclient_drives的方法:

77. 出現thinclient_drives這個驅動的原因和安裝網上要求安裝網上要求給ubuntu18.01 安裝xrdp有關,後續再研究如何去處這個驅動,不讓其默認啓動。

78. 下載cuda的網址:

https://developer.nvidia.com/rdp/cudnn-archive#a-collapse51b

安裝cuda和cudnn英文網上教程:https://docs.nvidia.com/deeplearning/sdk/cudnn-install/index.html#install-windows

79. 安裝完cuda10.1後的提示:

a. Please make sure that:

  -PATH includes /usr/local/cuda-10.1/bin

  -LD_LIBRARY_PATH includes /usr/local/cuda-10.1/lib64, or, add /usr/local/cuda-10.1/lib64 to /etc/ld.so.conf and run ldconfig as root

卸載cuda和NVIDIA驅動的指令:

Run cuda-uninstaller in /usr/local/cuda-10.1/bin

Run nvidia-uninstall

日誌文件保存在: /var/log/cuda-installer.log

80. 2019年7月27日,發現將機械硬盤當做系統盤會拖慢遠程訪問速度。

81. 2019年7月27日,遠程桌面右鍵點擊terminal打不開的解決方法:

    application-settings-settingsmanager-preferred applications中改成xfce或者gnome

82. 解決xrdp連接ubuntu18.04需要的指令:

a. sudo apt-get install xorgxrdp;

b. sudo apt-get install xserver-xorg-core

c. sudo apt-get install xrdp

d. sudo apt-get install xserver-xorg-input-all

83. hardware enablement stack(HWE)硬件支持堆棧。在ubuntu18.04.2中,xrdp軟件包好像是broken的,所以不能安裝xorgxrdp,除非將系統降級到18.04,也就是沒有HWE。所以要在ubuntu18.04.2上安裝xrdp的整個代碼集合如下:

Sudo apt autoremove xrdp

Sudo apt-get-repository ppa:martinx/xrdp-hwe-18.04        # 替換路徑

Sudo apt-get update                                     # 更新後設置有效

Sudo apt-get install xrdp xorg

Sudo adduser xrdp ssl-cert

Sudo reboot

84. 複雜的數據擴充方法:Fancy PCA,監督式摳取,GAN生成。

85. 常用的數據擴展方法:

a. Flip: 水平和垂直翻轉;

b. Rotation: 旋轉;

c. Scale: 縮放;

d. Crop: 隨機裁剪;

e. 平移;

f. Gaussian Noise: 加入高斯噪聲;

h. 圖像模糊,比如高斯blur;

i. 對比度變化,直方圖均衡化等;

    高級的圖像增強技術可以採用Fancy PCA, 主動學習,半監督學習,監督學習,GAN網絡來實現。

86. tf.image.random_flip_up_down,tf.image.random_flip_left_right和tf.image.flip_up_down,tf.image.flip_left_right的區別,前兩者爲隨機翻轉,也就是有50%的概率不翻轉,後兩者是絕對翻轉。

87. opencv中旋轉等仿射變換的幾種邊界填充模式如下:

Opencv中圖像變換的主要函數:

其中warpAffine是仿射變換,warpPerspective是投射變換。

使用方法是:cv2.BORDER_CONSTANT等。

以上各種邊界填補的定義值如下:

上述兩個枚舉定義都在base.hpp文件中。需要注意的是以後查找函數的時候儘量在對應版本的搜索頁面上查找。

88. opencv中的邊界填充函數:copyMakeBorder,matlab中的空洞填充函數:imfill. CopyMakeBorder函數的原型:

    void cv::copyMakeBorder  ( InputArray  src, 

                             OutputArray  dst, 

                             int  top, 

                             int  bottom, 

                             int  left, 

                             int  right, 

                             int  borderType, 

                             const Scalar &  value = Scalar()  ) 

89. opencv中在圖像上畫框的函數,cv2.rectangle(image,(p1_x,p1_y),(p2_x,p2_y),(0,255,2),2): 參數依次是:輸入圖像,左上角點座標,右下角點座標,顏色RGB值,框線粗細大小。

90. 對於cv2.warpAffine函數,需要注意的是,其第三個參數是:(width, height),也就是寬度在前,高度在後,而不是高度在前,這個test=img.shape[:2],不一樣,後者是高度在前,寬度在後。

91. 採用opencv實現圖像平移的代碼:

tx=-20;

ty=-20;

trans_M=np.float32([[1,0,tx],[0,1,ty]]);

height,width=img.shape[:2];

translated_img = cv2.warpAffine(img,trans_M,(width,height),borderMode=1)

plt.imshow(translated_img)

plt.show()

需要注意的是,上面輸出圖像的大小是寬度在前,高度在後,這與上面第四行得到圖像形狀的維度次序相反。

92. BCE loss是pytorch中一種內置的loss,其計算公式爲:

93. 常用的簡單圖像增強技術:對比度拉伸,直方圖均衡,自適應直方圖均衡,效果分別如下圖所示:

94. 基於變換的幾種圖像增強技術:

a. 基於直方圖均衡化的圖像增強;

b. 基於拉普拉斯算子的圖像增強;

c. 基於對數log變換的圖像增強;

d. 基於伽馬變換的圖像增強。

95. matplotlib.pyplot.imshow中的參數cmap取值:

a. plt.imshow(img, cmap=plt.cm.gray);        # 灰度顯示

b. plt.imshow(img, cmap=plt.cm.gray_r);      # 反灰度顯示

c. plt.imshow(img, cmap=’gray’);        # 灰度顯示

d. plt.imshow(img, cmap=’gray_r’);      # 灰度顯示

96. numpy中扁平化函數ravel()和flatten()函數的相同點:都是高維數組變成低維向量或者扁平化的數組或者向量。兩者不同點在於:flatten開闢了新的地址,相當於複製了一份,改變其元素值並不影響原始數組的元素,但是ravel相當於引用,並且開闢了新地址,改變其值會影響原始矩陣或數組的元素值。示例如下:

97. 計算圖像直方圖的方法:

Numpy中帶的函數:a. np.histogram(img.ravel(), 256, [0,256]);

Opencv中帶的函數:b. cv2.calHist([img],[0],None,[ 256],[256]); 原型爲:

cv2:calcHist(images; channels; mask; histSize; ranges[; hist[; accumulate]]),channels是通道索引,mask是掩碼圖像,用於統計圖像的一部分直方圖時使用,histSize是BINS的數目;

plt中帶的函數:c. plt.hist (img.ravel(),255,[0,256]);

98. skimage中的圖像直方圖均衡化:skimage中用於圖像直方圖均衡化的函數有兩個:equalize_hist和equalize_adapthist函數,用法分別爲:

a. equalize_hist(image, nbins=256, mask=None),是skimage.exposure模塊中的函數,返回直方圖均衡化之後的圖像;

b. equalize_adapthist(image, *args, **kwargs),是skimage.exposure._adapthist模塊中的函數,有限對比度自適應直方圖均衡(CLAHE,contrast limited adaptive histogram equalization),一種局部對比度增強的算法,該算法使用在圖像的不同平鋪區域上計算的直方圖,因此,及時在比大多數圖像更暗或更輕的區域中,局部細節也可以得到增強。

Equalize_adapthist的計算過程:

  1. 將圖像轉換到HSV顏色空間;
  2. CLAHE算法在V信道上運行;
  3. 圖像被轉換回RGB空間並返回;
  4. 對於RGBA圖像,移除原始alpha通道。

99. 直方圖均衡化的三種情況:

a. 灰度圖像直方圖均衡化:

b. 彩色圖像直方圖均衡化:

c. YUV 直方圖均衡化:

100. CLAHE,對比度有限的自適應直方圖均衡,Contrast Limited Adaptive Histogram Equalization,原理是在一個點上,圖像被劃分爲幾個小塊,稱爲tiles,然後每一個方塊都是像平常一樣的直方圖,直方圖被限制在一個小區域,如果噪聲在哪裏,就會被放大,爲了避免這一情況,需要對對比度進行限制,就是如果任何直方圖bin超出指定的對比度限制,則在應用直方圖均衡前,這些像素被裁剪並均勻地分佈到其他bin,均衡後,刪除邊界中的工件,採用雙線性插值,具體代碼如下:

101. Fancy PCA: Fancy, 想要,想做,愛慕,自負,自命不凡,想象的事物,想象力,想要,愛好。Fancy PCA的原理就是對原始訓練數據的像素值進行主成分分析,根據得到的特徵向量和特徵值計算一組隨機值,然後作爲擾動加入到原像素值中去。

102. 研究新的損失函數.

103. one class classfication和二分類的區別,在二分類問題中,訓練集就是由兩個類的樣本組成,訓練集中就有兩個類的樣本組成,訓練出的模型是一個二分類模型,而one class classification中的樣本只有一類,訓練出的分類器將不屬於該類的素有其他樣本判別爲不是,而不是由於屬於另一類而返回“不是”這個結果。實際的例子比如:異常值檢測,查尋用戶信息等等。如果採用二分類器來解決這種問題就會由於正負樣本的數量差別過大而產生bias(偏差),這時可以採用one class classification這種方法來解決。

104. zero-shot learning: 0樣本學習; one-shot learning:單樣本學習,是指的目標樣本只有一個,然後根據這單個樣本進行學習,然後在進行查找或者分類。

105. LearningRateScheduler的用法:作爲回調函數的一員,LearningRateScheduler可以按照epoch的次數自動調整學習率:

def step_decay(epoch):

      initial_lrate = 0.01

      drop = 0.5

      epochs_drop = 10.0

      lrate = initial_lrate * math.pow(drop,math.floor((1+epoch)/epochs_drop))

return lrate

lrate = LearningRateScheduler(step_decay)

sgd = SGD(lr=0.0, momentum=0.9, decay=0.0, nesterov=False)

model.fit(train_set_x, train_set_y, validation_split=0.1, nb_epoch=200, batch_size=256, callbacks=[lrate])

106. keras中的神經網絡模型主要包括兩種,一種是順序模型,一種是函數模型。即Sequential形式和Convolutional()(para1,para2,…,para_n)兩種形式。

107. DenseNet和Inception中更多采用的是concatenate操作,而ResNet更多采用的add操作,這兩個操作有什麼異同呢?

concatenate操作:網絡結構設計中很重要的一種操作,經常用於將特徵聯合,多個卷積特徵提取框架提取的特徵融合或者是將輸出層的信息進行融合。DenseNet是做通道的合併。而concatenate是通道數的合併,也就是說描述圖像本身的特徵增加了,而每一特徵下的信息是沒有增加。

add操作:是信息之間的疊加。Resnet是做值的疊加,通道數是不變的。add是描述圖像的特徵下的信息量增多了,但是描述圖像的維度本身並沒有增加,只是每一維下的信息量在增加。

在代碼層面就是ResNet使用的都是add操作,而DenseNet使用的是concatenate。

108. Keras中的Merge層提供了一系列用於融合兩個層或者兩個張量的層對象和方法,以大寫首字母開頭的是Layer類,以小寫字母開頭的是張量的函數,小寫字母開頭的張量函數在內部實際上是調用了大寫字母開頭的層。其中包括有Add,Substract, Multiply, Average, Maximum, Concatenate等。

109. 1*1卷積的主要作用:可以用來降維,升維,和減少參數。

降維和升維的原理示意圖:

降低參數量的原理示意圖:

110. Keras中的MaxPooling3D函數:

keras.layers.MaxPooling3D(pool_size=(2, 2, 2), strides=None, padding='valid', data_format=None),其中padding參數的取值爲’valid’或者’same’,應該表示是保持縮小或者形狀不變。

111. maxpooling中的參數padding參數的選擇,

Padding的取值可以爲valid或者same,兩者不同如下:

112. Inception 模塊:

通過1*1卷積來減少參數量的原理圖:

上圖中原始需要120M的參數儲存,而通過1*1卷積,參數量可以降爲下圖所示的參數量:

Inception V2的結構,主要是通過兩個連續的3*3卷積層組成的小網絡來代替單個5*5卷積層,在保持感受野範圍的同時又減少了參數量。

113. SPPNet專項學習,SPPNet,簡稱Spatial pyramid pooling,Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition,作者:Kaiming He, Xiangyu Zhang, Shaoqing Ren, Jian Sun.

        SppNet提出的初衷是爲了解決CNN對輸入圖片尺寸的限制。由於全連接層的存在,與之相連的最後一個卷積層的輸出特徵需要固定尺寸,從而要求輸入圖片尺寸也要固定,spp-net之前的做法是將圖片裁剪或變形,如下圖所示:

        Crop/warp的一個問題是導致圖片的信息缺失或變形,影響識別精度。對此,文章中在最後一層卷積特徵圖的基礎上又進一步進行處理,提出了spatial pyramid pooling,如下圖所示:

    空間金字塔池化(spatial pyramid pooling)的網絡結構如下圖:

簡而言之,就是將任意尺寸的feature map用三個尺度的金字塔層分別池化,將池化後的結果拼接得到固定長度的特徵向量(圖中的256是filter的個數),送入全連接層進行後續操作。

    後來的fast RCNN網絡即借鑑了spp的思想,其中的ROI Pooling可理解爲但尺度的SPP層。

114. CNN網絡需要固定尺寸的圖像輸入,SPPNet將任意大小的圖像池化生成固定長度的圖像表示,提升R-CNN檢測速度24-102倍,固定圖像尺寸輸入帶來的問題就是截取的區域未涵蓋整個目標或者縮放帶來的圖像的扭曲。CNN 卷積層不需要固定尺寸的圖像,全連接層是需要固定大小輸入的,因此提出SPP層放到卷積層的後面。SPP是BOW的擴展,將圖像從精細空間劃分到粗糙空間,之後將局部特徵聚集,在CNN成爲主流之前,SPP在檢測和分類的應用比較廣泛。

SPP的優點:

  1. 任意尺寸輸入,固定大小輸出;
  2. 層數多;
  3. 可對任意尺度提取的特徵進行池化。

115. SPP的結構是將緊跟最後一個卷積層的池化層使用SPP代替,輸出向量爲kM,其中k是濾波器個數,M=bins,作爲全連接層的輸入,網絡不僅可以對任意長寬比的圖像進行處理,還可以對任意尺度的圖像進行處理。尺度在深層網絡學習中也很重要。結構如下圖:

116. BoW全稱爲Bag of Words,SPM全稱爲Spatial Pyramid Matching。

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章