2016-10-04 3 views
5

私はテキスト(文字レベルで)に畳み込みニューラルネットワークを訓練しています。私は最大プールをしたいと思います。 tf.nn.max_poolはランク4のTensorを想定していますが、テンソルフロー([バッチ、幅、深度])のランク3は1-dコンビネーションですので、conv1dの出力をmax pool関数に渡すと、TensowFlowの1次元ConvNet(conv1d)で最大プールを実行するにはどうすればよいですか?

ValueError: Shape (1, 144, 512) must have rank 4 

私は、一般的にtensorflowする新しいと深い学習の枠組みだと私は複数の回避策があります想像することができるので、ここでのベストプラクティスのアドバイスをしたいと思います。 1-dの場合にmax-poolingを実行するにはどうすればよいですか?

ありがとうございました。

+0

あなたは[ 'tf.strided_slice'](https://www.tensorflow.org/versions/r0.11/api_docs/python/を組み合わせた場合、それが役立つだろうarray_ops.html#strided_slice)と['tf.reduce_max'](https://www.tensorflow.org/versions/r0.11/api_docs/python/math_ops.html#reduce_max)? – BarzinM

答えて

5

簡単な方法では、余分なシングルトンディメンションを追加することです。つまり、そこからシェイプ(1,1,4,4,512)を作成して、tf.squeezeで元に戻すことができます。

私は他のアプローチについても興味があります。

+2

それはまさに私がやったことです。 Tensorflowのドキュメントでは、conv1d関数がフードの下でconv2dであることを明示しています(あなたが言ったようにシングルトンの次元が追加されています)。同等のプーリング機能がない場合、なぜconv1d関数を追加したのか分かりません。 – ibairdo

+0

conv1d関数を追加するのに少し時間がかかりました。議論の一部は、それがconv2dと同じであることを示唆し、入力が1Dであることがわかっている場合は、より良い最適化が可能です。したがって、人気がある場合はmaxpool1Dを追加する可能性があります。オープンソースなので、プルリクエストを行うことも、機能要求の問題として追加することもできます。 – Steven

+0

「あなたは何を言いたいのですか? – ibairdo

2

もう1つのオプションは、tf.nn.pool機能を使用することです。形状のマトリックス[10 1、1,8] 8 [に変換され、例として

B = tf.nn.pool(A, [size], 'MAX', 'SAME', strides = [stride]) 

:入力[BATCH_SIZE、長さ、NUM_CHANNELS]形状であり、関数は次のように適用することができると仮定すると、2、1] max poolingを使用します。

[[[0, 1, ... 9]],  [[[4, 9]], 
[[0, 1, ..., 9]], ---> [[4, 9]], 
...,      ..., 
[[0, 1, ..., 9]]]  [[4, 9]]] 

Pythonのコード:

import numpy as np 
import tensorflow as tf 

X = np.tile(np.arange(10), 8).reshape(8, 10, 1) 
A = tf.Variable(X) 
B = tf.nn.pool(A, [5], 'MAX', 'SAME', strides = [5]) 
sess = tf.Session() 
init = tf.global_variables_initializer() 
sess.run(init) 
sess.run([B]) 
C = B.eval(session = sess) 

print(C) 
関連する問題