3

私は次のNNアーキテクチャを持っています:

パート1:

nn.Sequential {
  [input -> (1) -> (2) -> (3) -> (4) -> (5) -> (6) -> (7) -> output]
  (1): nn.TemporalConvolution
  (2): nn.TemporalMaxPooling
  (3): nn.TemporalConvolution
  (4): nn.TemporalMaxPooling
  (5): nn.Reshape(14336)
  (6): nn.Dropout(0.500000)
  (7): nn.Linear(14336 -> 128)
}

パート2:

nn.Sequential {
  [input -> (1) -> (2) -> (3) -> output]
  (1): nn.Linear(4 -> 8)
  (2): nn.ReLU
  (3): nn.Linear(8 -> 4)
}

私がやりたいことは、これら2つの部分の出力を別の部分への入力として使用することです:

nn.Sequential {
  [input -> (1) -> (2) -> (3) -> (4) -> (5) -> (6) -> output]
  (1): nn.Linear(132 -> 32)
  (2): nn.ReLU
  (3): nn.Linear(32 -> 32)
  (4): nn.ReLU
  (5): nn.Linear(32 -> 2)
  (6): nn.LogSoftMax
}

パーツ 1 には 128 の出力があり、パーツ 2 には 4 があり、最後にパーツ 3 には 132 の入力があることに注意してください。したがって、基本的には、2 種類の入力 (パート 1 はテキスト用、パート 2 は数値ベクトル用) を受け取り、これらの両方の情報を 3 番目のレイヤーで 2 クラス分類に使用するネットワークが必要です。

さまざまなコンテナを見てきましたが、必要なものはないようです。具体的には、nn.Parallel を見てきましたが、ドキュメントからは、まったく異なることをしているように見えます (2 つの異なるモジュールに対する同じ入力)。最初の問題は、ネットワークの入力がどのように見えるかです (各部分は異なるタイプのテンソルを使用するため、最初の要素が 2D テンソルで、2 番目の要素が 1D テンソルである単純なテーブル (配列) で十分だと思いました)。 ) そして、その出力を別のネットワークに接続して、通常どおり前方/後方呼び出しを使用できるようにする方法。

これを行う方法はありますか?

ありがとう!

4

1 に答える 1

5

必要なのはnn.ParallelTablenn.JoinTableです。

local parallel = nn.ParallelTable()
parallel:add(part1)
parallel:add(part2)

local net = nn.Sequential()
net:add(parallel)                   -- (A)
net:add(nn.JoinTable(1))            -- (B)
net:add(part3)                      -- (C)

(ア):

parallel2つのテンソル(あなたの場合、テキストと数字)のテーブルを取り、最初のテンソルを に転送しpart1、2番目のテンソルを に転送し、part2両方の結果を2つのテンソルの別のテーブルに出力します。

(ロ):

以下nn.JoinTableは、このテーブルを入力として取り、2 つのテンソルを 1 つのテンソルに連結します。1テンソルの形状によっては、連結次元 (私の例では) を処理するパラメーターをいじる必要があるかもしれません。

(ハ):

最後に、連結されたテンソルを入力として受け取るネットワークの 3 番目の部分を追加できます。

于 2015-09-17T16:59:30.807 に答える