caffeAan de slag met caffe


Opmerkingen

Caffe is een bibliotheek geschreven in C ++, om het experimenteren met en het gebruik van Convolutional Neural Networks (CNN) te vergemakkelijken. Caffe is ontwikkeld door Berkeley Vision and Learning Center (BVLC).

Caffe is eigenlijk een afkorting die verwijst naar "Convolutional Architectures for Fast Feature Extraction". Dit acroniem omvat een belangrijk bereik van de bibliotheek. Caffe in de vorm van een bibliotheek biedt een algemeen programmeerraamwerk / -architectuur die kan worden gebruikt voor het efficiënt trainen en testen van CNN's. "Efficiëntie" is een belangrijk kenmerk van caffe en staat als een belangrijke ontwerpdoelstelling van Caffe.

Caffe is een open-source bibliotheek uitgegeven onder BSD 2 Clause-licentie.

Caffe wordt onderhouden op GitHub

Caffe kan worden gebruikt om:

  • Efficiënt trainen en testen van meerdere CNN-architecturen, met name elke architectuur die kan worden weergegeven als een gerichte acyclische grafiek (DAG).
  • Gebruik meerdere GPU's (tot 4) voor training en testen. Het wordt aanbevolen dat alle GPU's van hetzelfde type zijn. Anders worden de prestaties beperkt door de limieten van de langzaamste GPU in het systeem. In het geval van TitanX en GTX 980 zullen de prestaties bijvoorbeeld door deze laatste worden beperkt. Het combineren van meerdere architecturen wordt niet ondersteund, bijvoorbeeld Kepler en Fermi 3 .

Caffe is geschreven volgens de principes van efficiënte Object Oriented Programming (OOP).

Een goed uitgangspunt om met een introductie van caffe te beginnen, is om in vogelvlucht te zien hoe caffe door zijn fundamentele objecten werkt.

versies

Versie Publicatiedatum
1.0 2017/04/19

Multithreading inschakelen met Caffe

Caffe kan op meerdere kernen draaien. Een manier is om multithreading met Caffe in staat te stellen OpenBLAS te gebruiken in plaats van de standaard ATLAS. Om dit te doen, kunt u deze drie stappen volgen:

  1. sudo apt-get install -y libopenblas-dev
  2. Voor het compileren van Caffe, bewerk Makefile.config , vervang BLAS := atlas door BLAS := open
  3. Na het compileren van Caffe zal het uitvoeren van export OPENBLAS_NUM_THREADS=4 ervoor zorgen dat Caffe 4 cores gebruikt.

Installatie en configuratie

Ubuntu

Hieronder staan gedetailleerde instructies om Caffe, pycaffe en zijn afhankelijkheden te installeren op Ubuntu 14.04 x64 of 14.10 x64.

Voer het volgende script uit, bijv. "Bash compile_caffe_ubuntu_14.sh" (~ 30 tot 60 minuten op een nieuwe Ubuntu).

# This script installs Caffe and pycaffe. 
# CPU only, multi-threaded Caffe.

# Usage: 
# 0. Set up here how many cores you want to use during the installation:
# By default Caffe will use all these cores.
NUMBER_OF_CORES=4

sudo apt-get install -y libprotobuf-dev libleveldb-dev libsnappy-dev 
sudo apt-get install -y libopencv-dev libhdf5-serial-dev
sudo apt-get install -y --no-install-recommends libboost-all-dev
sudo apt-get install -y libatlas-base-dev 
sudo apt-get install -y python-dev 
sudo apt-get install -y python-pip git

# For Ubuntu 14.04
sudo apt-get install -y libgflags-dev libgoogle-glog-dev liblmdb-dev protobuf-compiler 

# Install LMDB
git clone https://github.com/LMDB/lmdb.git 
cd lmdb/libraries/liblmdb
sudo make 
sudo make install

# More pre-requisites 
sudo apt-get install -y cmake unzip doxygen
sudo apt-get install -y protobuf-compiler
sudo apt-get install -y libffi-dev python-pip python-dev build-essential
sudo pip install lmdb
sudo pip install numpy
sudo apt-get install -y python-numpy
sudo apt-get install -y gfortran # required by scipy
sudo pip install scipy # required by scikit-image
sudo apt-get install -y python-scipy # in case pip failed
sudo apt-get install -y python-nose
sudo pip install scikit-image # to fix https://github.com/BVLC/caffe/issues/50


# Get caffe (http://caffe.berkeleyvision.org/installation.html#compilation)
cd
mkdir caffe
cd caffe
wget https://github.com/BVLC/caffe/archive/master.zip
unzip -o master.zip
cd caffe-master

# Prepare Python binding (pycaffe)
cd python
for req in $(cat requirements.txt); do sudo pip install $req; done

# to be able to call "import caffe" from Python after reboot:
echo "export PYTHONPATH=$(pwd):$PYTHONPATH " >> ~/.bash_profile 
source ~/.bash_profile # Update shell 
cd ..

# Compile caffe and pycaffe
cp Makefile.config.example Makefile.config
sed -i '8s/.*/CPU_ONLY := 1/' Makefile.config # Line 8: CPU only
sudo apt-get install -y libopenblas-dev
sed -i '33s/.*/BLAS := open/' Makefile.config # Line 33: to use OpenBLAS
# Note that if one day the Makefile.config changes and these line numbers may change
echo "export OPENBLAS_NUM_THREADS=($NUMBER_OF_CORES)" >> ~/.bash_profile 
mkdir build
cd build
cmake ..
cd ..
make all -j$NUMBER_OF_CORES # 4 is the number of parallel threads for compilation: typically equal to number of physical cores
make pycaffe -j$NUMBER_OF_CORES
make test
make runtest
#make matcaffe
make distribute

# Afew few more dependencies for pycaffe
sudo pip install pydot
sudo apt-get install -y graphviz
sudo pip install scikit-learn
 

Op het einde moet je "source ~ / .bash_profile" handmatig uitvoeren of een nieuwe shell starten om 'python import caffe' te kunnen doen.

Regularisatieverlies (gewichtsverlies) in Caffe

In het oplosserbestand kunnen we een globaal regularisatieverlies instellen met behulp van de opties weight_decay en regularization_type .

In veel gevallen willen we verschillende gewichtsvervalpercentages voor verschillende lagen. Dit kan worden gedaan door de optie decay_mult in te stellen voor elke laag in het netwerkdefinitiebestand, waarbij decay_mult de vermenigvuldiger is van de globale gewichtsvervalwaarde, dus de werkelijke gewichtsvervalwaarde die voor één laag wordt toegepast, is decay_mult*weight_decay .

Het volgende definieert bijvoorbeeld een convolutionele laag met GEEN gewichtsverval, ongeacht de opties in het oplosserbestand.

layer {
  name: "Convolution1"
  type: "Convolution"
  bottom: "data"
  top: "Convolution1"
  param {
    decay_mult: 0
  }
  convolution_param {
    num_output: 32
    pad: 0
    kernel_size: 3
    stride: 1
    weight_filler {
      type: "xavier"
    }
  }
}
 

Zie deze thread voor meer informatie.