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.]

すべての入力がランダムに作成されるため、マシン上のデータ、または実際にはネットワークの実行ごとに異なるデータが異なることに注意してください。これで、ネットワークが正常に定義され、コンピューターで実行されました。