Caffe2-独自のネットワークの作成
このレッスンでは、を定義する方法を学びます。 single layer neural network (NN)Caffe2で、ランダムに生成されたデータセットで実行します。ネットワークアーキテクチャ、印刷入力、出力、重み、およびバイアス値をグラフィカルに表現するコードを記述します。このレッスンを理解するには、次の知識が必要です。neural network architectures、その terms そして mathematics それらで使用されます。
ネットワークアーキテクチャ
次の図に示すように、単層NNを構築したいとします。
数学的には、このネットワークは次のPythonコードで表されます-
Y = X * W^T + b
どこ X, W, b テンソルと Y出力です。3つのテンソルすべてにランダムなデータを入力し、ネットワークを実行して、Y出力。ネットワークとテンソルを定義するために、Caffe2はいくつかを提供しますOperator 関数。
Caffe2オペレーター
Caffe2では、 Operatorは計算の基本単位です。Caffe2Operator は次のように表されます。
Caffe2は、オペレーターの完全なリストを提供します。現在設計しているネットワークでは、入力ベクトルを渡した結果を計算するFCという演算子を使用します。X 2次元の重み行列を使用して完全に接続されたネットワークに W および一次元バイアスベクトル b。つまり、次の数式を計算します。
Y = X * W^T + b
どこ X 寸法があります (M x k), W 寸法があります (n x k) そして b です (1 x n)。出力Y 次元になります (M x n)、 どこ M はバッチサイズです。
ベクトルの場合 X そして W、使用します GaussianFillいくつかのランダムデータを作成する演算子。バイアス値を生成するためb、 我々は使用するだろう ConstantFill オペレーター。
次に、ネットワークの定義に進みます。
ネットワークの作成
まず、必要なパッケージをインポートします-
from caffe2.python import core, workspace
次に、を呼び出してネットワークを定義します core.Net 次のように-
net = core.Net("SingleLayerFC")
ネットワークの名前は次のように指定されます SingleLayerFC。この時点で、netというネットワークオブジェクトが作成されます。これまでのところ、レイヤーは含まれていません。
テンソルの作成
次に、ネットワークに必要な3つのベクトルを作成します。まず、を呼び出してXテンソルを作成しますGaussianFill 次のように演算子-
X = net.GaussianFill([], ["X"], mean=0.0, std=1.0, shape=[2, 3], run_once=0)
ザ・ X ベクトルには次元があります 2 x 3 平均データ値が0,0、標準偏差が 1.0。
同様に、 W 次のようにテンソル-
W = net.GaussianFill([], ["W"], mean=0.0, std=1.0, shape=[5, 3], run_once=0)
ザ・ W ベクトルのサイズ 5 x 3。
最後に、バイアスを作成します b サイズ5の行列。
b = net.ConstantFill([], ["b"], shape=[5,], value=1.0, run_once=0)
さて、コードの最も重要な部分が来て、それはネットワーク自体を定義することです。
ネットワークの定義
次のPythonステートメントでネットワークを定義します-
Y = X.FC([W, b], ["Y"])
私たちは FC 入力データの演算子 X。重みはで指定されますWとbのバイアス。出力はY。または、次のPythonステートメントを使用してネットワークを作成することもできます。これはより冗長です。
Y = net.FC([X, W, b], ["Y"])
この時点で、ネットワークは単純に作成されます。ネットワークを少なくとも1回実行するまで、データは含まれません。ネットワークを実行する前に、そのアーキテクチャを調べます。
印刷ネットワークアーキテクチャ
Caffe2はJSONファイルでネットワークアーキテクチャを定義します。これは、作成されたものでProtoメソッドを呼び出すことで調べることができます。 net オブジェクト。
print (net.Proto())
これにより、次の出力が生成されます-
name: "SingleLayerFC"
op {
output: "X"
name: ""
type: "GaussianFill"
arg {
name: "mean"
f: 0.0
}
arg {
name: "std"
f: 1.0
}
arg {
name: "shape"
ints: 2
ints: 3
}
arg {
name: "run_once"
i: 0
}
}
op {
output: "W"
name: ""
type: "GaussianFill"
arg {
name: "mean"
f: 0.0
}
arg {
name: "std"
f: 1.0
}
arg {
name: "shape"
ints: 5
ints: 3
}
arg {
name: "run_once"
i: 0
}
}
op {
output: "b"
name: ""
type: "ConstantFill"
arg {
name: "shape"
ints: 5
}
arg {
name: "value"
f: 1.0
}
arg {
name: "run_once"
i: 0
}
}
op {
input: "X"
input: "W"
input: "b"
output: "Y"
name: ""
type: "FC"
}
上記のリストでわかるように、最初に演算子を定義します X, W そして b。の定義を調べてみましょうW例として。の種類W として指定されます GausianFill。ザ・mean フロートとして定義されます 0.0、標準偏差はフロートとして定義されます 1.0、 そしてその shape です 5 x 3。
op {
output: "W"
name: "" type: "GaussianFill"
arg {
name: "mean"
f: 0.0
}
arg {
name: "std"
f: 1.0
}
arg {
name: "shape"
ints: 5
ints: 3
}
...
}
の定義を調べる X そして bあなた自身の理解のために。最後に、ここで再現されている単層ネットワークの定義を見てみましょう。
op {
input: "X"
input: "W"
input: "b"
output: "Y"
name: ""
type: "FC"
}
ここで、ネットワークタイプは FC (完全に接続されている) X, W, b 入力としておよび Y出力です。このネットワーク定義は冗長すぎて、大規模なネットワークの場合、その内容を調べるのは面倒になります。幸い、Caffe2は、作成されたネットワークのグラフィック表現を提供します。
ネットワークのグラフィック表現
ネットワークのグラフィック表現を取得するには、次のコードスニペットを実行します。これは、基本的に2行のPythonコードのみです。
from caffe2.python import net_drawer
from IPython import display
graph = net_drawer.GetPydotGraph(net, rankdir="LR")
display.Image(graph.create_png(), width=800)
コードを実行すると、次の出力が表示されます-
大規模なネットワークの場合、グラフィック表現はネットワーク定義エラーの視覚化とデバッグに非常に役立ちます。
最後に、ネットワークを実行する時が来ました。
実行中のネットワーク
ネットワークを実行するには、 RunNetOnce 上の方法 workspace オブジェクト-
workspace.RunNetOnce(net)
ネットワークが一度実行されると、ランダムに生成されたすべてのデータが作成され、ネットワークに送られ、出力が作成されます。ネットワークの実行後に作成されるテンソルは、blobsCaffe2で。ワークスペースは、blobs作成してメモリに保存します。これはMatlabと非常によく似ています。
ネットワークを実行した後、あなたは調べることができます blobs 以下を使用してワークスペースに含まれていること print コマンド
print("Blobs in the workspace: {}".format(workspace.Blobs()))
次の出力が表示されます-
Blobs in the workspace: ['W', 'X', 'Y', 'b']
ワークスペースは3つの入力BLOBで構成されていることに注意してください- X, W そして b。また、と呼ばれる出力BLOBも含まれていますY。これらのブロブの内容を調べてみましょう。
for name in workspace.Blobs():
print("{}:\n{}".format(name, workspace.FetchBlob(name)))
次の出力が表示されます-
W:
[[ 1.0426593 0.15479846 0.25635982]
[-2.2461145 1.4581774 0.16827184]
[-0.12009818 0.30771437 0.00791338]
[ 1.2274994 -0.903331 -0.68799865]
[ 0.30834186 -0.53060573 0.88776857]]
X:
[[ 1.6588869e+00 1.5279824e+00 1.1889904e+00]
[ 6.7048723e-01 -9.7490678e-04 2.5114202e-01]]
Y:
[[ 3.2709925 -0.297907 1.2803618 0.837985 1.7562964]
[ 1.7633215 -0.4651525 0.9211631 1.6511179 1.4302125]]
b:
[1. 1. 1. 1. 1.]
すべての入力がランダムに作成されるため、マシン上のデータ、または実際にはネットワークの実行ごとに異なるデータが異なることに注意してください。これで、ネットワークが正常に定義され、コンピューターで実行されました。