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 複現說明
-
一些預備知識
Keras是我們熟知的深度學習架構,那麼Theano是什麼?
然後Keras和Theano有什麼關系呢?
- 終端運作python檔案的指令直接是python Blstm.py,而不再使用run指令;
-
看到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 >。
- 其他的環境配置不唯一,我是在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行注釋掉。
——————————————————分割線———————————————————————
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')
具體位置看下圖
model.py中,train函數中的try部分,加上
具體位置看下圖
這樣訓練完之後,就可以把我們的損失函數資料儲存在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()
上面的是所有資料的曲線,後面的變化幾乎看不出來了,可以把18000到20000的曲線再畫一下,把上面程式注釋的部分展開,再把下面的plt.plot(x,y)該為plt.plot(x1,y1)即可。
18号要拿這個做課程彙報了,加油!!!