1

CNNでは、出力が1次元ベクトル(たとえば事前ロジットレイヤ)である場合、畳み込みのみを使用して次元を指定されたサイズまでどのように減らすことができますか?1次元ベクトルの次元数を減らすためのコンボリューション

このようなタスクを達成するには、どのようにフィルタの次元/受容野を導きますか?

これは、ネットワークの最後に完全に接続されたレイヤーを積み重ねることによって実現できますが、これはあまり優雅に見えません。

+0

このため、特定の理由がある:

ここでは64〜32のテンソル長さを短くtensorflowのコードは、ですか?空間情報などを保存しますか? –

答えて

0

はもともとAll Convolutional Net論文で提案したアイデアを使用して、後で広くInception networkで使用される、すなわち、次元削減のために畳み込みを適用します。

トリックは、少ない数のフィルタでfilter(2次元畳み込みの場合は1x1、3次元の場合は1x1x1など)のコンボリューションを実行することです。今日、このトリックは非常に深い畳み込みネットワークで計算を節約するために常に適用されるので、畳み込みレイヤの前でもそれを使うことができます。あなたの質問では、出力テンソルは1次元(バッチサイズを除く)なので、1カーネルサイズの1次元畳み込みを使用してください。

       # `x` shape: [batch, length] = [?, 64] 
layer = tf.expand_dims(x, 2) # reshape to: [batch, channels, 1] = [?, 64, 1] 

output = tf.layers.conv1d(layer, filters=32, kernel_size=1, 
          strides=1, padding='valid', 
          data_format='channels_first') 

           # new shape: [batch, filters, 1] = [?, 32, 1] 
output = tf.squeeze(output) # reshape to: [batch, length] = [?, 32] 
+1

サイズ1の空間フィールドに対するこの1x1コンボリューションは、完全に接続されたレイヤーを使用するのとまったく同じであることに注意することは重要です。これは[Network in Network](https://arxiv.org/abs/1312.4400)の基礎となります。 –

0

畳み込み後にプールレイヤーを追加する可能性はありますか?はいの場合は、このレイヤの主な目的の1つで、ベクトルを下位次元のものにダウンサンプリングします。

それ以外の場合、適用されるフィルタの数は出力スペースの次元数です。

0

1次元畳み込みはどうですか?あなたは、次のようにstridesを使用することができます。

n,w = x.shape 
c = 1 
x = x.reshape(n,w,c) # 1d vector with one 1 channel 
x = conv1d(x, 1, 3, stride=2, pad=1) # 1 filter so output size will be (n,w/2,c) 
x = x.reshape(n,w//2) 

は、それはあなたの現在の次元の整数部門を与えるでしょう。それとも、あなたの出力のための各次元のチャネルを持っているし、その後全体1D領域にわたってプールでした:「これらのいずれかが実際にうまく動作しますが、これは、彼らはおそらく勝ったニューラルネットワークであることかどうかについての

x = x.reshape(n,w,c) 
x = conv1d(x, d, 3, pad=1) # d filters so output (n,w,d) 
x = x.mean(1) # mean over 1d space so now (n,d) 

保証あまりにも悪くないものを壊す

最後に、チート答え:

x = x.reshape(n,c,w) # (n,1,w) 
x = conv1d(x, d, 1) # (n,1,d) 
x = x.reshape(n,d)