2016-08-11 5 views
10

tf.read_fileでファイルを読むと、タイプがtf.stringになります。マニュアルでは「可変長バイト配列です.Tensorの各要素はバイト配列です」としか書かれていません。 (https://www.tensorflow.org/versions/r0.10/resources/dims_types.html)。私はこれをどのように解釈するのか分かりません。TensorFlowの文字列:それらの機能と使用方法

このタイプでは何もできません。通常のPythonでは、my_string[:4]のようなインデックスで要素を取得できますが、次のコードを実行するとエラーが発生します。

import tensorflow as tf 
import numpy as np 

x = tf.constant("This is string") 
y = x[:4] 


init = tf.initialize_all_variables() 
sess = tf.Session() 
sess.run(init) 
result = sess.run(y) 
print result 

それは

 File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/tensor_shape.py", line 621, in assert_has_rank 
    raise ValueError("Shape %s must have rank %d" % (self, rank)) 
ValueError: Shape() must have rank 1 

はまた、私はtf.float32テンソルに私の文字列を変換することはできませんと言います。それは.floファイルであり、魔法のヘッダー "PIEH"を持っています。このnumpyのコードは、このようなヘッダを成功してnumberに変換します(ここではhttps://stackoverflow.com/a/28016469/4744283の例を参照)。しかし、私はtensorflowでそれを行うことはできません。私はtf.string_to_number(string, out_type=tf.float32)を試しましたが、それは言っています

tensorflow.python.framework.errors.InvalidArgumentError: StringToNumberOp could not correctly convert string: PIEH 

だから、どのような文字列ですか?それは何の形ですか?どのようにして少なくとも文字列の一部を取得できますか?もし私がそれの一部を手に入れることができれば、私はちょうど "ピー"の部分をスキップすることができると思います。

UPD:同じエラーでもtf.slice(string, [0], [4])が動作しないと言いました。

+0

ところで、このスクリプトを使用してtf.stringデータ型受け入れるOPSのリストを取得することができますします。https://要旨を例えば、文字のテンソルとして文字列を解釈するために、次の操作を行うことができます.github.com/yaroslavvb/16bb81fcfb0932169087add47ecb8c3a –

+0

お返事ありがとうございます! TFの特定のバージョン用のスクリプトですか? 0.9以上は動作しません。 0.10に更新しようとします。 – ckorzhik

+0

いいえ、それは0.10 '' '$パイソンlist_ops.py トレースバック(最新の呼び出しの最後)のためにも動作しません: で ファイル "list_ops.py"、23行目、arg.type場合== TF .string: ファイル "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/dtypes.py"、244行目、__eq__ およびself._type_enum == as_dtype(other).as_datatype_enum )as_dtype におけるファイル "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/dtypes.py"、ライン532、キー==のtype_value場合: 例外TypeError:データ入力 を理解しません'' ' 私はそれを修正する手助けはできますか? – ckorzhik

答えて

11

文字列をスライスなどの目的で文字のリストとして扱うことができるPythonとは異なり、TensorFlowのtf.stringは分割できない値です。たとえば、xは、Tensorの形の(2,)で、各要素は可変長の文字列です。

x = tf.constant(["This is a string", "This is another string"]) 

しかし、あなたが望むものを達成するために、TensorFlowはtf.decode_raw演算子を提供します。それはテンソルを入力としてtf.stringを取りますが、その文字列を他のプリミティブデータ型にデコードできます。

x = tf.constant("This is string") 
x = tf.decode_raw(x, tf.uint8) 
y = x[:4] 
sess = tf.InteractiveSession() 
print(y.eval()) 
# prints [ 84 104 105 115] 
+0

ありがとうございます。 それで、スカラーですか? – ckorzhik

+1

これらはネイティブの文字列型です。最新版 –

+0

で 'tf.string_split(s、delimiter =" ")'を使って文字列(長さ1文字列)に分割することができます。 'print(" "。join(map(chr、y.eval())))'あなたが望むものよりも可能性が高い –

関連する問題