一、總流程
一般的流程如下所示
1. 資料格式處理,一般caffe處理的均為資料,然後我們需要將資料以及相關標籤打包在一起,實現caffe的呼叫。
2.編寫網路結構檔案,通常字尾格式為.prototxt。一般caffe中都會自帶手寫字型識別這一程式,具體目錄在caffe/examples/mnist/中,其中相關的網路結構檔案為lenet_train_test.prototxt。這個就是手寫字型的網路結構檔案。
3.網路配置檔案,一般我們都取名為:solver.prototxt,這個檔案中一般包含梯度下降引數,學習率,迭代次數等。具體的引數配置可以見這篇文章 caffe中的一些引數介紹
4. 編寫指令碼檔案實現網路的訓練, 接著我們呼叫caffe可執行檔案進行訓練就可以了。
這個是caffe的一般流程。但是每個具體的專案其實並不相同所以我們需要舉一反三,通過caffe中提供的例子來應用到我們自己的實際專案中。
在我專案中的具體應用,我在訓練的時候遇到了許多問題,下面就和大家一一說來,說不定可以給大家的日常學習提供一些幫助。
博主主要採用了兩種方式進行資料處理。
一.第一種方法是將二維矩陣轉變為。因為觀察自己的資料均在0-255之間,可以轉變為rgb色彩模式,所以預期是期望將每個5*3的二維矩陣轉變為乙個以rgb格式儲存的。之後再利用之前的流程進行資料的處理,針對不同的在打不同的標籤。但是通過嘗試之後,發現將二維矩陣轉變為rgb方式儲存後的得到的,通過已經搭建好的網路進行訓練時,accuracy一直為1,或者為0。loss也高達88.3365。
不論如何調整學習率都不能得到理想的結果。而且通過我們肉眼也發現將我們之前的二維矩陣轉變為也的確沒有特徵可言。下面是我的幾個處理好的二維矩陣,與之相對應的是通過程式將其轉變為rgb三通道的。
下圖為通過**將其轉變為的rgb格式儲存的。
但是通過肉眼發現轉儲的中並沒有所謂的特徵所言,也提取不出相關的特徵資料,所以經過討論否定了這種方法。雖說這種方法並沒有得到合適的特徵提取,但是這種思考方式值得大家參考。
plt.imshow(a[i])
#是利用這行**將二維矩陣資料轉換為rgb格式儲存的
二.第二種方法就是發現caffe處理資料的格式有lmdb,hdf5等格式,所以思考是否可以將我們的二維矩陣直接儲存為lmdb格式的資料,不使用caffe自帶生成資料的檔案,而是自己編寫。最終參考這篇文章得到了問題的解決方案。
creating an lmdb database in python
最終這種方法得到了較為理想的結果。
接下來詳細講述這種方法的步驟流程,可能下面出現的**比較繁瑣,但是博主還在不斷更新,努力學習中,望見諒。
大致流程為:
1.進行資料處理,將資料處理為lmdb格式
2.執行create_lmdb.sh檔案建立網路所需的訓練資料
3.編寫訓練網路檔案
4.調整編寫網路的引數,學習率以及卷積核大小等
5.訓練已經編寫的網路,得到其準確率和損失率。
1.lmdb資料格式生成
先來介紹自己訓練集資料的生成
# coding=utf-8
import numpy as np
import lmdb
import sys
import os
import random
#這裡主要是尋找到caffe的路徑
caffe_root = '/home/ly/caffe'
# this file should be run from /examples (otherwise change this line)
os.environ['glog_minloglevel'] = '3'
caffe_root = os.path.expanduser('~/caffe/') # change with your install location
sys.path.insert(0, os.path.join(caffe_root, 'python'))
sys.path.insert(0, os.path.join(caffe_root, 'python/caffe/proto'))
sys.path.insert(0, os.path.join(caffe_root, 'python/caffe/tripletloss'))
import caffe
n_test = 298
# let's pretend this is interesting data
x = np.zeros((n_test, 1, 5, 3), dtype=np.float)
y = np.zeros(n_test, dtype=np.int64)
map_size = x.nbytes * 10
#這裡是處理我的訓練集資料
a_1 = [0] * 3
a_2 = [a_1] * 5
a = [a_2] * 596
a = np.loadtxt("data.txt")
# print(a)
for row in range(0, 596):
col1 = row
col2 = row + 5
a[row] = a[col1:col2]
a = np.array(a)
x_test = a[1::2]
#這裡是處理我的訓練集標籤
b = np.loadtxt("label.txt")
y_test = b[1::2]
for i in range(n_test):
x[i][0] = x_test[i]
for i in range(n_test):
y[i] = y_test[i]
env = lmdb.open('test_lmdb', map_size=map_size)
with env.begin(write=true) as txn:
# txn is a transaction object
for i in range(n_test):
datum = caffe.proto.caffe_pb2.datum()
datum.channels = x.shape[1]
datum.height = x.shape[2]
datum.width = x.shape[3]
datum.data = x[i].tobytes()
datum.label = int(y[i])
str_id = ''.format(i)
txn.put(str_id.encode('ascii'), datum.serializetostring())
通過執行train_data.py檔案生成train_lmdb檔案。驗證集的資料同理。
2.編寫網路檔案
通過學習對原網路進行了調整以及修改,而且增加了mirror:true目的是為了對資料進行預處理,對資料進行映象處理。
3.調整網路引數
4.訓練網路
最終通過訓練網路,在迭代了1000次之後得到的準確率以及損失率如圖所示,得到了相對滿意的結果。
JAVASE 我的學習日記 20141029
連續好幾天 忙生活 忙工作,導致沒時間學習和寫日記,今天接上。if語句如果不加,下面第一句就是if裡面的,observable裡面notifyobservers方法 if changed return arrlocal obs.toarray clearchanged 如果if裡面為false,則直...
我的caffe之路(一)
開始caffe之前,倒是關注了幾個caffe大牛 開始在linux安裝caffe的時候,其實師兄們已經配置好環境了,什麼都不用我做,結果自己編譯caffe的時候還是錯誤一大堆。第一次編譯的時候按照大牛部落格 結果配一天之後,還是錯誤一大堆,不知道自己錯在 問了師兄之後豁然開朗,原來是要 修改make...
我的部落格日記
智慧型家居服務系統的 用到了暫存器,中斷,等等 2017 10 2411 56 361 2 智慧型家居服務系統 3 2017.10.22 4 include 5 include 暫存器庫 6 include 舵機庫7 8 intpos 9int a 22 暫存器記憶開關按下狀態 10int valu...