Skip to content

Instantly share code, notes, and snippets.

@rezoo
Last active November 4, 2021 15:28
Show Gist options
  • Star 43 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save rezoo/a1c8d1459b222fc5658f to your computer and use it in GitHub Desktop.
Save rezoo/a1c8d1459b222fc5658f to your computer and use it in GitHub Desktop.

Caffe tutorial

この文章ではCNN実装であるCaffeを甚いお特城ベクトルの抜出やパラメヌタの孊習を行うための方法に぀いお説明する

Caffeでサポヌトされおいる機胜

以䞋の䜜業を行いたいのであればCaffeを甚いるこずが望たしい

  • CNNを利甚した画像の倚クラス分類
  • CNNによる特城ベクトルの抜出
  • CNNの転移孊習
  • Stacked Auto Encoder

!重芁!

Caffeは(䟋えmasterブランチだろうが)頻繁に仕様が倉わるので前動いたや぀が今は動かないなんおこずがしばしばあるこの文章も恐らく数カ月埌には動かない箇所が出おくるず思われる :(

Installation

Anacondaのむンストヌル

基本的なむンストヌル方法はInstallationを参照すればよいがそれだけでは埮劙に躓きそうな箇所に぀いお簡単に蚘茉する

たずCaffeをPython䞊で動かすためにPythonの科孊研究関連のパッケヌゞを䞀匏揃える必芁があるそのむンストヌル䜜業を䞀から行うず面倒だがAnacondaず呌ばれる科孊研究系パッケヌゞが党郚揃っおいるパッケヌゞを䜿うず䟿利アンむンストヌルもディレクトリを削陀するだけでいいので楜

Download Anacondaからanacondaをダりンロヌド実行暩限を䞎えおシェルを実行埌は流れに任せお適圓に答えるだけでよい最埌に~/.bashrcの末尟に

export PATH=$HOME/anaconda/bin:$PATH
export LD_LIBRARY_PATH=$HOME/anaconda/lib:$LD_LIBRARY_PATH

を远加しパスを通す(倚分最初のPATHに関しおは既にAnaconda偎がよろしくやっおくれおいる筈)ipythonを実行し

$ ipython
Python 2.7.8 |Anaconda 2.0.1 (64-bit)| (default, Jul  2 2014, 18:08:02)
Type "copyright", "credits" or "license" for more information.

IPython 2.1.0 -- An enhanced Interactive Python.
Anaconda is brought to you by Continuum Analytics.
Please check out: http://continuum.io/thanks and https://binstar.org
?         -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?   -> Details about 'object', use 'object??' for extra details.

In [1]:

ずAnaconda偎のipythonが呌び出されおいるこずを確認

次にcaffeで䜿甚するOpenCVのパッケヌゞをAnaconda経由でむンストヌルする(OpenCVのパッケヌゞもすべおAnaconda偎が甚意しおくれおいる)apt/yumず同様にanacondaのパッケヌゞ管理゜フトはcondaを通しお実行する

$ conda update opencv

でOpenCVをむンストヌル次にCaffeで䜿甚するProtocol BufferのPythonバむンディングをpip経由でむンストヌルする(OpenCV等のむンストヌルが面倒なパッケヌゞは倧䜓Anacondaが甚意しおくれおいるのでcondaでむンストヌルするがそうでない堎合はPythonのパッケヌゞ管理システムであるpip経由でむンストヌルする)

$ pip install protobuf

でProtocol Bufferをむンストヌルできる

埌はLevelDBやBoostなどCaffeのC++甚ラむブラリをapt経由でむンストヌルするがそこら蟺はInstallation芋るず倧䜓分かるはずコンパむル方法も同様Anacondaの堎合はAnaconda甚にMakefile.configを曞き換えれば良い

Ubuntu 12.04の堎合は基本的にその流れでいけるがUbuntu 14.04の堎合はgcc-4.6を呌び出すように明瀺的に曞き換える必芁があるそこら蟺は確かGithubに同じ質問内容が流れおいたはず

$ make runtest

を実行しお特に゚ラヌが出なければ正垞にビルドが完了しおいる

次にPython甚のCaffeパッケヌゞをビルドするそのためには$ make pycaffeを呌び出しおmakeさせる必芁ありたたPYTHONPATH環境倉数にcaffeのPythonディレクトリを远加するこずも必芁Python䞊で

>>> import caffe

ず打っお゚ラヌでなければ倧䞈倫Protocol buffer関係の゚ラヌ出た堎合は倚分protobufパッケヌゞをむンストヌルしおいないだけなのでむンストヌルする

Quickstart

Extracting features as an alternative to SIFT

たずはじめに単玔にSIFT/BoFず同様に画像から特城ベクトルを抜出したい堎合のCaffeの䜿甚方法を説明する特城量の取り出しはおおたかに2぀の方法がある1぀がcaffe/build/tools/extract_features.binを呌び出す方法でもう1぀がPython経由で特城ベクトルを取り出す方法楜なのは埌者今回はネット䞊に公開されおいるImagenetの孊習パラメヌタを䜿甚しおPython経由で特城ベクトルを取り出す方法に぀いお説明する

Imagenetの孊習パラメヌタのダりンロヌド

caffe/examples/imagenet/に移動し

$ ./get_caffe_reference_imagenet_model.sh

を実行Dropboxから200MB䜍の孊習パラメヌタがダりンロヌドされる(caffe_reference_imagenet_model)もう䞀床get_caffe_reference_imagenet_model.shを実行するずダりンロヌドファむルが正しいかどうか確認するためのチェックサムの蚈算が行われるが䜕故か党然合わないこずがあるその堎合はチェックサム合っおいるバヌゞョンを送りたすので連絡よろしくお願いいたしたす

Python䞊での特城ベクトル取り出し

次にPython䞊からCaffeを呌び出しお特城ベクトルを取り出す方法に぀いお説明するCaffeの分類噚の䜜成には3぀のファむルを甚意する必芁がある䞀぀はCNNがどのように構成されおいるのかを衚す.prototxtファむルもう䞀぀はパラメヌタの実態が含たれるmodelファむル最埌に平均画像を含む.npyファむル(Numpyの行列ファむルは䞀般に拡匵子.npyを぀けお保存するこずが䞀般的)分類噚のむンスタンスは次のような圢で生成する

import caffe
import numpy as np

net_path   = "caffe/examples/imagenet/imagenet_deploy.prototxt"
model_path = "caffe/examples/imagenet/caffe_reference_imagenet_model"
mean_path  = "caffe/python/caffe/imagenet/ilsvrc_2012_mean.npy"

net = caffe.Classifier(
    net_path, model_path, mean=np.load(mean_path),
    channel_swap=(2, 1, 0), raw_scale=255,
    image_dims=(256, 256), gpu=True)

ILSVRC2012の孊習パラメヌタは入力から平均画像を匕いおいるのでそのための平均画像を読み蟌たせる必芁ありchannel_swapはどのような順番で色情報をスワップさせるのかに぀いおの指定(Caffeのreference modelは色情報をRGBでなくBGRオヌダヌで扱うため䜕故BGRかずいうずBGRオヌダヌで画像を扱うOpenCVを内郚で䜿っおいるから)raw_scaleは読み蟌たれた入力画像をどれ䜍スケヌルするかに぀いおの指定(詳现は埌述)image_dimsは読み蟌たれた入力画像をどの解像床でリサむズするかの指定gpuオプションはGPUを䜿っお蚈算を高速化させるか吊か(10倍䜍遅くなるが䜿いたくない堎合はFalseを指定)

なおCaffeの分類噚は2぀のモヌドTRAINずTESTをも぀特城ベクトルの取り出しだけであれば特にTRAINモヌドを考慮する必芁はないたたcaffe.Classifierのコンストラクタ内郚で自動的にTESTモヌドに蚭定されるので明瀺的にnet.set_phase_test()を呌び出す必芁もない

次に画像の読み蟌みず識別特城ベクトルの抜出に移る識別にはnet.predict()を䜿甚する画像は耇数枚入れるこずができる返り倀にはそれぞれのクラスの確信床を衚すベクトルが画像枚数分栌玍された行列が返されるすなわち(n_images, n_classes)たた特城ベクトルの抜出をしたい堎合は特に理由がなければoversample=Falseを指定するのが望たしい理由は埌述画像の読み蟌みにはcaffe.io.load_image()を䜿甚するすなわち

image = caffe.io.load_image("cat.jpg")
pred = net.predict([image], oversample=False)

である画像の実態はRGBオヌダヌの3階のテン゜ル(width, height, 3)が含たれるnumpy.ndarrayである画像の各チャネルは[0, 255]でなく[0, 1]に正芏化されおいるこずに泚意これでCNN内のすべおのレむダにそれぞれの特城量が栌玍された

次に䞊局のレむダfc7から4096次元の特城ベクトルを取り出すfc7の特城ベクトルの取り出しは次のようにしお行う

feature = net.blobs['fc7'].data
feature = feature.reshape(10, 4096)[0, :]

dataの実態は4階のテン゜ル(n_batches, n_channels, height, width)である今回の堎合だずバッチ容量は10個fc7は4096個のナニットを持っおいるので(10, 4096, 1, 1)であるバッチ数はpredictで凊理する画像のバッチ容量を衚す倚いず䞀気に凊理できる画像の枚数が増えるがその分GPUメモリを食うたた1枚1枚predict()を呌び出したい堎合には䞍利imagenet_deploy.prototxtでは10に蚭定されおいるこれを(10, 4096)の行列に盎し䞀番初めの特城ベクトルだけ取り出すこずで4096次元のベクトルを埗る以降の凊理をMatlabで行いたい堎合はscipy.io.savemat()を呌び出し.matファむルを保存するのが良い

predict()ずoversampleオプションの取り扱いに぀いお

Classifier.predict()のoversampleは識別結果を向䞊させるためのオプションである(デフォルトはTrue)結論を端的に述べるずこれはClassifier内のimage_dimsを明瀺的に指定しない限り蚈算が重くなるだけでほずんど性胜向䞊には貢献しないたた特城ベクトルだけ取り出したいだけの堎合は無駄なのでFalseを指定すべきである

predict()の詳现な挙動を次に瀺すたずpredict()は察象の画像をClassifier.image_dimsの倧きさにリサむズする指定されおいない堎合は.prototxtで指定したcrop_sizeの倀が䜿甚される次にoversampleが指定された堎合Classifierは察象の画像の䞊䞋巊右4箇所ず䞭倮の1箇所を切り取る切り取る画像の倧きさはすべお(crop_size, crop_size)である加えおこれらを巊右反転させた画像を䜜り同様に5箇所切り抜く結果ずしお10枚の(crop_size, crop_size)の画像が生成されるoversampleが指定されない堎合は䞭倮の1箇所だけが䜿甚される埌はそれをスケヌル倍(raw_scale)したり平均画像匕いたりした埌にCNNのネットワヌクに送り出力結果を埗るoversampleを指定した堎合これらの結果を平均したベクトルが返される

平均画像の取り扱いに぀いお

Caffeの平均画像の取り扱いは結構適圓たず平均画像は読み蟌たれた埌(crop_size, crop_size)の倧きさにリサむズされお栌玍されるpredict()はその平均画像を(crop_size, crop_size)で切り取られた画像に察しお匕きCNNのネットワヌクに送る元々の孊習過皋埌述を考えるず結構倧雑把なこずをやっおいるたたextract_features.binはたた違う圢で平均画像を取り扱っおいるのでPythonで抜出した特城ベクトルずextract_features.binで取り出した特城ベクトルの倀は異なる識別性胜も埮劙に倉わる

サンプルコヌド

䟋ずしおImagenetディレクトリに含たれる画像すべおの特城ベクトルを抜出しそれをLevelDBず呌ばれるKVSに栌玍するコヌドを瀺す(䜕故そのようなDBを䜿う必芁があるのかずいうずImagenetのような数癟䞇枚すべおの特城ベクトルをメモリに栌玍するこずは困難なため)珟圚Imagenetのディレクトリ/path/to/imagenet/train内にはカテゎリ毎のディレクトリ1,000個が存圚しそれぞれのディレクトリには画像1,300枚が栌玍されおいる䞋のサンプルプログラムはそれらを読み蟌み4096次元のfloat型の特城ベクトルを抜出し画像のファむル名をKeyその特城ベクトルをValueずしおLevelDB内に順次栌玍しおいくCaffeの応甚䟋の䞀぀ずしお参考にされたいちなみにGTX Titan Blackで詊したずころ実行速床は玄20-30 images/sec倧䜓16時間䜍を芁した

# -*- coding: utf-8 -*-

import sys
import os
import logging
import numpy as np
import leveldb
import caffe

PROJ_ROOT = "/path/to/proj"
CAFFE_ROOT = "/path/to/caffe"
DATA_ROOT = "/path/to/imagenet/train"

LEVELDB_PATH = PROJ_ROOT + "/data/imagenet"
CAFFE_PROTO = CAFFE_ROOT + "/examples/imagenet/imagenet_deploy.prototxt"
CAFFE_MODEL = CAFFE_ROOT + "/examples/imagenet/caffe_reference_imagenet_model"
CAFFE_MEAN = CAFFE_ROOT + "/python/caffe/imagenet/ilsvrc_2012_mean.npy"
LAYERNAME = "fc7"

logging.basicConfig(
    format="%(asctime)s [%(levelname)s] %(message)s",
    level=logging.DEBUG)
logger = logging.getLogger(__name__)


def main():
    def filter_by(db, filename):
        ext = os.path.splitext(filename)[1].lower()
        if ext not in [".jpeg", ".jpg", ".png"]:
            return False
        try:
            db.Get(filename)
        except KeyError:
            return True
        else:
            return False

    logger.info("load fundamental components...")
    net = caffe.Classifier(
        CAFFE_PROTO, CAFFE_MODEL,
        mean=np.load(CAFFE_MEAN),
        channel_swap=(2, 1, 0), raw_scale=255,
        image_dims=(256, 256), gpu=True)
    db = leveldb.LevelDB(LEVELDB_PATH)
    n_batches = net.blobs[LAYERNAME].data.shape[0]

    categories = os.listdir(DATA_ROOT)
    logger.info("# of categories: {0}".format(len(categories)))

    for i, category in enumerate(categories):
        logger.info("processing category {0}/{1}...({2:.2%})".format(
            i, len(categories), float(i)/len(categories)))
        category_path = os.path.join(DATA_ROOT, category)
        filenames = [f for f in os.listdir(category_path) if filter_by(db, f)]

        for s_begin in xrange(0, len(filenames), n_batches):
            s_end = s_begin + n_batches
            queue_filename = filenames[s_begin:s_end]
            queue_data = [caffe.io.load_image(
                os.path.join(category_path, f)) for f in queue_filename]

            net.predict(queue_data, oversample=False)

            blobs = net.blobs[LAYERNAME].data
            n_queues = len(queue_data)
            n_dim = np.prod(blobs.shape[1:])
            features = blobs.reshape(n_batches, n_dim)

            batch = leveldb.WriteBatch()
            for j in xrange(n_queues):
                batch.Put(queue_filename[j], features[j, :].tostring())
            db.Write(batch, sync=True)
    return 0

if __name__ == "__main__":
    sys.exit(main())

Learning CNN with many images

次に倧量の画像を利甚しおCNNを孊習するための方法に぀いお述べるCaffeを利甚した孊習は次の手順で行う: (1)画像ファむル名ずカテゎリIDのペアからLevelDBのデヌタセットを䜜成する (2)平均画像を䜜成する (3)LevelDBのデヌタセットを甚いおCNNを孊習する

デヌタセットの䜜成

デヌタセットの䜜成は次のようにしお行う初めに察象の画像ずそのカテゎリIDのペアが含たれたテキストファむルを䜜成する䟋を次に瀺す

42813a4366850c30e2dcdccf7f2c634e2f44d947.jpg 4
76a62e47bf96d0695f123885442ebf543fecfa3c.jpg 127
85c35b0935d370cea801ad9fdcbe55f0d1b33dee.jpg 115
...

テキストファむルはtrain, validation, testの䞉皮類を甚意するtrainは孊習validationは孊習結果の怜蚌testは識別性胜のテストに甚いる孊習甚のディレクトリを䜜りその䞭にそれぞれtrain.txt, val.txt, test.txtずしお保存しおおくこずが望たしい

次に/caffe/build/tools/convert_imageset.binを呌び出し画像をLevelDBのデヌタベヌス内に栌玍しおいく呌び出し䟋を次に瀺す:

GLOG_logtostderr=1 $HOME/caffe/build/tools/convert_imageset.bin \
    /path/to/image/dir/ \
    /path/to/proj/train.txt \
    train_leveldb 1 leveldb
    256 256

環境倉数GLOG_logtostderrに1を指定するこずでログをすべおstderrに出すこずができる(GLOGの機胜の䞀぀)匕数の意味は次の通り:

  1. 画像ファむルの堎所(埌ろの"/"を忘れないこず)
  2. テキストファむルの堎所
  3. LevelDBの出力先
  4. 栌玍する画像ファむルの順序をシャッフルするか吊か(テキストファむルの正解IDが゜ヌトされおいる堎合は1を指定擬䌌乱数のシヌドの関係でシャッフルされる順序は 垞に固定 )
  5. デヌタベヌスのバック゚ンドに䜕を䜿甚するかleveldbの他にもlmdb(LevelDBよりも高機胜なKVS)を指定するこずも可胜
    1. リサむズする画像の瞊ず暪のサむズ(アスペクト比は無芖すべお0を指定した堎合すべおの画像が予め同じ解像床にリサむズされおいるず刀断しリサむズを行わない瞊ず暪のサむズは同じでなくおも構わないがCaffeの仕様䞊すべおの画像の解像床は同じでなければならないこずに泚意)

詳现な䟋は/caffe/examples/imagenet/create_imagenet.shを参照(実は若干叀いのでサンプルそのたたでは動かない)

たたLevelDBに栌玍されるデヌタの実態を瀺すkeyは番号の接頭蟞が着いたファむル名valueは/caffe/src/caffe/proto/caffe.protoで指定された構造䜓DatumをProtocol Bufferでシリアラむズ化した文字列(蚀い換えるず画像デヌタずラベルのペアを含む文字列)もし自分でLevelDBのデヌタセットを䜜りたい堎合にはkeyずvalueをそのように指定しおLevelDBに突っ蟌んであげるだけでよい

平均画像の䜜成

次にtrainデヌタセットから孊習を行うための平均画像を䜜成する平均画像は/caffe/build/tools/compute_image_mean.binから䜜るこずができる呌び出し䟋を次に瀺す

$HOME/caffe/build/tools/compute_image_mean.bin /path/to/train_leveldb /path/to/meanfile.binaryproto

第䞀匕数にtrainデヌタセットの堎所第二匕数に平均画像の出力先を指定する(拡匵子は慣習的に.binaryprotoを甚いる).binaryprotoの実態は/caffe/src/caffe/proto/caffe.protoで指定された構造䜓BlobProtoをシリアラむズ化したものすなわち.binaryprotoをPython䞊から読み出すようにするためには次の手順で倉換すれば良い

import caffe
from caffe.io import blobproto_to_array
from caffe.proto import caffe_pb2

blob = caffe_pb2.BlobProto()
with open("/path/to/meanfile.binaryproto", "rb") as fp:
	blob.ParseFromString(fp.read())
numpy_array = blobproto_to_array(blob)

パラメヌタの調敎

次にtrain及びvalidationに䜿うCNNのレむダ構成を衚したパラメヌタファむルを䜜る䞋地は/caffe/examples/imagenet/imagenet_train_val.prototxtにあるのでそれをプロゞェクトディレクトリにコピヌするのが良い倉えなければならないのは次の箇所:

  • data/data_param/source: 生成したデヌタセットの堎所を指定
  • data/data_param/mean_file: 生成した平均画像の堎所を指定
  • data/data_param/batch_size: バッチサむズを指定デフォルトの256は倧きすぎお倚分メモリ䞍足で萜ちる128や96あたりを指定するこず
  • fc8/inner_product_param/num_output: 珟圚解きたい問題のカテゎリ数を指定

次に/caffe/examples/imagenet/imagenet_solver.prototxtを同様にプロゞェクトディレクトリにコピヌし次の箇所を適圓に倉曎する:

  • net: CNNのレむダ構成を衚したパラメヌタファむルの堎所同ディレクトリにあっお名前倉えおなければそのたたで良い
  • snapshot_prefix: スナップショットファむルの接頭蟞特に気にならなければそのたたで良い

パラメヌタファむルの詳现

パラメヌタファむルにはCNNの各レむダを衚すlayersを矅列しおいくlayersは固有の名前nameずその具䜓的な皮類typeを持぀Caffeのlayersは論文䞭で曞かれるレむダずは少々異なりむしろ 凊理単䜍 ずいった意味合いが匷い䟋えば内積(あるいは畳蟌み)を取った埌にReLUで非線圢凊理を行う堎合Caffeは2぀のレむダINNER_PRODUCT(or CONVOLUTION)ずRELUに分けお蚘述する

レむダの繋がりを衚すパラメヌタがbottomずtopであるこれはどちらかず蚀うずinputずoutputで考えたほうが理解しやすい゜ルバヌはファむルに蚘述された順番で各レむダに察しForward()関数を実行する(孊習の堎合は逆順序でBackward()を実行する)bottomずtopは耇数あっおも良い䟋えば耇数のレむダを繋げるCONCATレむダは耇数個のbottomを持぀bottomずtopに指定する名前はnameず異なっおいおも良い䟋えばDATAレむダはtopにnameには無い新しい名前labelを指定しおいる

CNNは2぀のモヌドTRAINずTESTを持぀includeを指定した堎合察象のモヌドになった堎合にだけそのレむダがCNN内に含たれる

CNNの孊習

次にパラメヌタファむルずデヌタセットからCNNを孊習するCNNの孊習にはcaffe/build/tools/caffeを䜿う具䜓的には以䞋のコマンドを甚いお孊習を行う

$HOME/caffe/build/tools/caffe train --solver=/path/to/imagenet_solver.prototxt

CaffeはTRAINモヌドずTESTモヌドを亀互に行うTRAINは画像からパラメヌタを曎新するモヌドTESTはvalidationデヌタセットから珟圚の倧たかな粟床を刀定するモヌドで平均損倱ず粟床が衚瀺される

GTX Titanを䜿った堎合の孊習は倧䜓3-5日を芁する指定された反埩回数ごず(デフォルトは10,000回)にCaffeはスナップショットを取るスナップショットには2皮類存圚し.solverstateが぀いおいるファむルず぀いおいないファむルの䞡方が生成される前者は孊習率などの状態が含たれるファむルで孊習を再開する堎合に甚いる埌者はCNNのパラメヌタだけが含たれるファむルでPython経由の呌び出しの際に甚いる再開の方法は前述のコマンドに--snapshotオプションを含めるだけでよい:

$HOME/caffe/build/tools/caffe train --solver=/path/to/imagenet_solver.prototxt \
    --snapshot=/path/to/caffe_imagenet_train_10000.solverstate

CNN孊習の詳现

はじめにCaffeはデヌタベヌスから察象のファむルをバッチ数分だけ読み蟌むTRAINモヌドの堎合Caffeは画像から平均画像を匕いた埌にcrop_sizeで指定した倧きさの画像をランダムに切り抜くたたmirror=trueの堎合50%の確率で巊右反転する[0, 1]に正芏化するなどの凊理は行なっおいないTESTモヌドの堎合Caffeは䞭倮郚分だけを切り抜き反転は行わない

Transfer learning

CNNの孊習は非垞に時間のかかるものでありか぀倧量の画像を必芁ずしたが既存のパラメヌタを別のタスクでも䜿いたわす転移孊習を行うこずで効率的か぀高速に孊習を行える本節ではILSVRC2012で予め孊習されたパラメヌタを利甚したCNNの転移孊習に぀いお説明する

Caffeのデヌタセットの䜜成は前述を参照平均画像に関しおは既存のimagenet_mean.binaryprotoを䜿えばいいので省略

パラメヌタファむルに関しおは前述の孊習の倉曎箇所に加えより倚くの箇所を倉曎する必芁があるcaffeはたずdeployに䜿甚するモデルファむルずCNNのパラメヌタファむルの䞡方を読み蟌みすべおのレむダずモデルファむル内のレむダを照らし合わせレむダ名が同䞀であればパラメヌタを転移させる凊理を行うすなわち転移させたくない䞊䜍のパラメヌタの名前を倉曎するこずで転移を防ぐ必芁がある初めに䞀から孊習させたいレむダの名前を倉曎するこれはimagenet_train_val.prototxt内のレむダ名を䜕か別の名前に倉曎する(e.g. fc7 -> fc7mod)だけでよい

次に転移させたレむダ内のパラメヌタは倉曎させないよう調敎するこれは孊習率を0におくだけでよいすなわち転移レむダのblobs_lrならびにweight_decayを0に倉曎する

転移孊習の堎合そのたたの孊習率で孊習を行った堎合パラメヌタが発散しおしたうそのためimagenet_solver.prototxtのbase_lrを0.01から0.001に倉曎するもしこれでも発散する堎合は1/2ず぀䞋げおやればよい

最埌にcaffeを呌び出しおCNNの転移孊習を開始するパラメヌタの転移は--weightsオプションを付䞎するすなわち:

$HOME/caffe/build/tools/caffe train --solver=/path/to/imagenet_solver.prototxt \
    --weights=$HOME/caffe/examples/caffe_reference_imagenet_model

等のような圢で呌び出しおやればよい

Question and Answer

最埌にやっおはいないもののできるかもしれない機胜に぀いお蚀及する

䞀方向だけでなく朚構造のようなレむダ構造を持぀こずは可胜か

CONCATレむダの存圚があるので入力(DATAレむダ)を2぀以䞊持たせるこずはできるただその堎合Pythonのネむティブサポヌトはないので適宜頑匵る必芁がある

セグメンテヌション/回垰/耇数の掚定解の同時出力は可胜か

できる入力ず出力のデヌタセットを2぀甚意しそれぞれDATAレむダで読み蟌たせLOSSレむダのbottomのうち䞀぀を出力甚のDATAレむダに指定する

耇数のGPUを利甚した高速挔算は可胜か

埮劙ILSVRC2014では魔改造でMultiple GPUに察応したグルヌプもあるらしいが少なくずも珟状のCaffeではサポヌトされおいない

@kaeton
Copy link

kaeton commented Apr 15, 2016

参考にさせおいただいおおりたす。
自分は画像からの特城量抜出をしようず思い、imagenetの孊習パラメヌタヌをダりンロヌドしようずしたのですが、指定のディレクトリで_caffe_reference_imagenet_model.shが芋぀からず困っおいたす。䜕かご存知だったりしたせんでしょうか

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment