天天看點

視訊檢索——BLSTM(複現方法說明)0 導語1 作者的readme2 複現說明3 程式修改3.4 訓練與測試4 損失函數曲線作圖

0 導語

基于文章Play and Rewind: Optimizing Binary Representations of Videos by Self-Supervised Temporal Hashing的了解以及作者提供的源碼,說明一些複現過程中需要注意的問題。

原作者源碼位址@github

我們的實作@gitee

1 作者的readme

1.1 簡介

An unsupervised hashing model that generates binary codes (+1,-1) for a video sequence. This is just a quick demo for running the training and test. The source code is simple and well commented. Future details about feature extraction and visualization will be added ASAP.

可以為視訊序列生成二進制碼(+1,-1)的無監督哈希模型。這是運作訓練和測試的快速例程,源碼很簡單。關于特征提取、可視化的更多細節會盡快補上。

1.2 環境要求

Only [Theano] (http://deeplearning.net/software/theano/) is required. In fact, some of the core layers exploit a high-level wrapper [Keras] (https://keras.io/), but the code is not dependent on Keras installation. You may need to install h5py for data loader.

僅需要Theano。事實上一些核心層使用了進階的keras封裝,但是代碼并不依賴Keras的安裝。需要安裝h5py子產品用于資料加載。

1.3 demo

run Blstm.py

2 複現說明

  1. 一些預備知識

    Keras是我們熟知的深度學習架構,那麼Theano是什麼?

    然後Keras和Theano有什麼關系呢?

  2. 終端運作python檔案的指令直接是python Blstm.py,而不再使用run指令;
  3. 看到Blstm中 print " " 可知作者的python版本為2.x,複現時我用的2.7;為避免與系統其他python版本沖突,這裡建立conda虛拟空間,并安裝需要的Theano架構、numpy、scipy計算庫。運作時會警告沒有mkl子產品,最好也裝一下。對了h5py不能忘了。

    幾天後補坑,這裡安裝的numpy需要指定版本≤1.16.2,否則在進行測試時會出現ValueError: Object arrays cannot be loaded when allow_pickle=False 的錯誤,原因是自Numpy 1.16.3版本發行之後,函數 numpy.load() 和numpy.lib.format.read_array() 采用allow_pickle關鍵字,現在預設為False以響應CVE-2019-6446 < nvd.nist.gov/vuln/detail / CVE-2019-6446 >。

  4. 其他的環境配置不唯一,我是在ubuntu18.04下進行的,Windows應該也可以(不過Windows裝Theano略微麻煩一點)
conda create -n py27 python=2.7  # 建立虛拟空間名為py27
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple numpy==1.16.2,scipy
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple theano
conda install mkl-service  # 可能不需要
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple h5py
           

訓練過程直接跑就行,測試時把Blstm.py的最後一句True改為False即可。

3 程式修改

3.1 問題:ImportError: cannot import name downsample

這裡參考的是無法加載downsample模型的問題

解釋的話應該是theano架構更新了downsample的用法。

./data/theano_backend.py line4改成:from theano.tensor.signal.pool import pool_2d
./data/theano_backend.py line638改成:pool_out = pool.pool_2d(x, ws=pool_size, st=strides,
./data/theano_backend.py line643改成:pool_out = pool.pool_2d(x, ws=pool_size, st=strides,
           

3.2 問題:Please set the correct path to the dataset

這裡應該是作者忘了改一下代碼裡的資料名。

./Blstm.py line40&42的單引号中的檔案名分别改為:fcv_train_demo.h5和fcv_test_demo.h5
           

3.3 IOError: [Errno 2] No such file or directory: ‘results/hidden_1.mat’

測試時出現的問題,因為原來的目錄下沒有./results檔案夾,是以直接建立一個即可,另外如果依舊報錯,将 'results/hidden_1.mat’改為 ‘results\hidden_1.mat’,不一定會有這個問題,有些情況下python把 / 當做轉義符了。

3.4 訓練與測試

作者把訓練與測試的代碼解除安裝一起了,是以執行訓練和測試時代碼需要微調,僅是一些flag的改變而已。

測試時:./Blstm.py的97行改為run_blstm(is_train=False,reload_model=True);./model.py的128行注釋掉。

視訊檢索——BLSTM(複現方法說明)0 導語1 作者的readme2 複現說明3 程式修改3.4 訓練與測試4 損失函數曲線作圖

——————————————————分割線———————————————————————

4 損失函數曲線作圖

2019年5月15日補充,源碼中沒有訓練可視化,損失函數的值看不出來變化,加了點程式把損失函數的曲線畫出來。

pip install xlwt # 安裝excel寫入庫
import xlwt # Blstm.py和model.py的開頭都加上這一句
           

Blstm.py中,在main之前加上幾句

ex=xlwt.Workbook(encoding='utf-8')
sheet = ex.add_sheet('MySheet1')

ex.save('666.xlsx')
           

具體位置看下圖

視訊檢索——BLSTM(複現方法說明)0 導語1 作者的readme2 複現說明3 程式修改3.4 訓練與測試4 損失函數曲線作圖

model.py中,train函數中的try部分,加上

具體位置看下圖

視訊檢索——BLSTM(複現方法說明)0 導語1 作者的readme2 複現說明3 程式修改3.4 訓練與測試4 損失函數曲線作圖

這樣訓練完之後,就可以把我們的損失函數資料儲存在666.xlsx中,可以進行後續處理了。

畫圖

import xlrd
import matplotlib.pyplot as plt

wb=xlrd.open_workbook('666.xlsx') # 記得換成自己的路徑
x=[]
y=[]
x1=[]
y1=[]
for s in wb.sheets():
    for row in range(s.nrows):
        values = []
        for col in range(s.ncols):
            values.append(s.cell(row,col).value)
        x.append(values[0])
        y.append(values[1])
'''        
for i in range(1800,2001):
    x1.append(x[i])
    y1.append(y[i])
'''
plt.plot(x,y)
plt.title('loss function')
plt.xlabel('epoch')
plt.ylabel('loss')
plt.show()
           
視訊檢索——BLSTM(複現方法說明)0 導語1 作者的readme2 複現說明3 程式修改3.4 訓練與測試4 損失函數曲線作圖

上面的是所有資料的曲線,後面的變化幾乎看不出來了,可以把18000到20000的曲線再畫一下,把上面程式注釋的部分展開,再把下面的plt.plot(x,y)該為plt.plot(x1,y1)即可。

視訊檢索——BLSTM(複現方法說明)0 導語1 作者的readme2 複現說明3 程式修改3.4 訓練與測試4 損失函數曲線作圖

18号要拿這個做課程彙報了,加油!!!

繼續閱讀