2015-11-11 21 views

答えて

5

TensorFlowのドキュメントのshapes-and-shapingをご覧ください。利用可能なさまざまな形状変換について説明します。

最も一般的な機能は、そのnumpyの同等に類似している、おそらくtf.reshapeです。要素の数が同じであれば、任意の図形を指定できます。マニュアルにはいくつかの例があります。

4

Documentation shows再形成のための方法。それらは:

  • スクイーズ(テンソルの形状と大きさ1の寸法を除去)
  • expand_dims(サイズ1の寸法を加算)

ならびに方法の束を整形しますあなたのテンソルの、sizerankを取得します。おそらく最も使用はreshapeであり、ここでエッジケースのカップル(-1)とのコードの例です:

import tensorflow as tf 

v1 = tf.Variable([ 
    [1, 2, 3, 4], 
    [5, 6, 7, 8], 
    [9, 10, 11, 12] 
]) 
v2 = tf.reshape(v1, [2, 6]) 
v3 = tf.reshape(v1, [2, 2, -1]) 
v4 = tf.reshape(v1, [-1]) 
# v5 = tf.reshape(v1, [2, 4, -1]) will fail, because you can not find such an integer for -1 
v6 = tf.reshape(v1, [1, 4, 1, 3, 1]) 
v6_shape = tf.shape(v6) 
v6_squeezed = tf.squeeze(v6) 
v6_squeezed_shape = tf.shape(v6_squeezed) 

init = tf.initialize_all_variables() 

sess = tf.Session() 
sess.run(init) 
a, b, c, d, e, f, g = sess.run([v2, v3, v4, v6, v6_shape, v6_squeezed, v6_squeezed_shape]) 
# print all variables to see what is there 
print e # shape of v6 
print g # shape of v6_squeezed 
13

tf.Variableクラスは、変数を作成するための推奨される方法ですが、それは形状を変更する能力を制限し変数が作成されると、その変数のこの機能は、文書化され、公開APIになっていないことを

var = tf.Variable(tf.placeholder(tf.float32)) 
# ... 
new_value = ... # Tensor or numpy array. 
change_shape_op = tf.assign(var, new_value, validate_shape=False) 
# ... 
sess.run(change_shape_op) # Changes the shape of `var` to new_value's shape. 

注:変数の形状を変更する必要がある場合は、次の(32ビット浮動小数点テンソル用など)を行うことができます

ので、変更される場合があります。あなた自身がこの機能を使用する必要が発見した場合は、私たちに知らせて、我々は前進し、それをサポートするための方法を調べることができます。

+0

このアプローチの問題は、それに応じて 'var.shape'が更新されないということです。これは、チェックポイントを格納するときにも維持され、可変シェイプがウェイトシェイプと一致しないため、チェックポイントの読み込みを再度禁止します。 'var.shape'に強制的に更新させる方法はありますか?私はGitHubの問題を作成する必要がありますか? –

+0

このスレッドで問題を議論しました:https://github.com/tensorflow/tensorflow/issues/10091#issuecomment-304301817 しかし、既存のネットワークの重みを拡張する方法があるのだろうか –

1
tf.Variable(tf.placeholder(tf.float32)) 

はPythonシェルでtensorflow 1.2.1

で有効ではありません。

import tensorflow as tf 
tf.Variable(tf.placeholder(tf.float32)) 

あなたが取得します:

ValueError: initial_value must have a shape specified: Tensor("Placeholder:0", dtype=float32) 

アップデート:あなたがvalidate_shape=Falseを追加した場合、そこになります何のエラーもありません。

tf.Variable(tf.placeholder(tf.float32), validate_shape=False) 

tf.py_funcはあなたの条件に一致した場合:

def init(): 
    return numpy.random.rand(2,3) 
a = tf.pyfun(init, [], tf.float32) 

あなたがあなた自身のinit関数を渡すことで任意の形状を持つ変数を作成することができます。

別の方法:あなたがnumpyの配列を返すtf.constantまたはinit関数を渡すことができ

var = tf.get_varible('my-name', initializer=init, shape=(1,1)) 

。提供された形状は検証されません。出力形状は実際のデータ形状です。

関連する問題