2016-08-11 13 views
10

Khi tôi đọc tệp với tf.read_file Tôi nhận được thứ gì đó với loại tf.string. Tài liệu chỉ nói rằng nó là "mảng byte có độ dài thay đổi. Mỗi phần tử của một Tensor là một mảng byte." (https://www.tensorflow.org/versions/r0.10/resources/dims_types.html). Tôi không có ý tưởng làm thế nào để giải thích điều này.TensorFlow strings: chúng là gì và cách làm việc với chúng

Tôi không thể làm gì với loại này. Trong python thông thường, bạn có thể lấy các phần tử theo chỉ mục như my_string[:4], nhưng khi tôi chạy mã sau, tôi nhận được một lỗi.

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 

Nó nói

 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 

Ngoài ra tôi không thể chuyển đổi chuỗi của tôi để tf.float32 tensor. Nó là .flo tệp và nó có tiêu đề ma thuật "PIEH". Mã thành công này chuyển đổi tiêu đề thành số (xem ví dụ ở đây https://stackoverflow.com/a/28016469/4744283) nhưng tôi không thể làm điều đó với lưu lượng tensorflow. Tôi đã thử tf.string_to_number(string, out_type=tf.float32) nhưng nó cho biết

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

Vì vậy, chuỗi là gì? Hình dạng của nó là gì? Làm thế nào tôi có thể ít nhất nhận được một phần của chuỗi? Tôi cho rằng nếu tôi có thể tham gia, tôi có thể bỏ qua phần "PIEH".

UPD: Tôi quên nói rằng tf.slice(string, [0], [4]) cũng không hoạt động với cùng một lỗi.

+0

BTW, bạn có thể nhận danh sách các tùy chọn chấp nhận các loại dữ liệu chuỗi sử dụng tập lệnh này: https: // gist .github.com/yaroslavvb/16bb81fcfb0932169087add47ecb8c3a –

+0

Cảm ơn bạn đã trả lời! Tập lệnh này có dành cho phiên bản TF cụ thể không? Nó không hoạt động ít nhất là 0,9. Sẽ cố gắng cập nhật lên 0,10. – ckorzhik

+0

Không, nó cũng không hoạt động cho 0.10 '' '$ python list_ops.py Traceback (cuộc gọi gần đây nhất): Tệp" list_ops.py ", dòng 23, trong nếu arg.type == tf .string: Tệp "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/dtypes.py", dòng 244, trong __eq__ và self._type_enum == as_dtype (khác) .as_datatype_enum) Tệp "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/dtypes.py", dòng 532, trong as_dtype nếu khóa == type_value: LoạiError: loại dữ liệu không được hiểu '' ' Bạn có thể giúp tôi khắc phục sự cố không? – ckorzhik

Trả lời

11

Không giống như Python, trong đó chuỗi có thể được coi là danh sách các ký tự cho mục đích cắt và như vậy, các giá trị không thể tách rời của TensorFlow là tf.string s. Ví dụ: x bên dưới là Tensor có hình dạng (2,) mà mỗi phần tử là một chuỗi có độ dài thay đổi.

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

Tuy nhiên, để đạt được những gì bạn muốn, TensorFlow cung cấp toán tử tf.decode_raw. Phải mất một dây chuyền tf.string làm đầu vào, nhưng có thể giải mã chuỗi thành bất kỳ loại dữ liệu nguyên thủy nào khác. Ví dụ: để diễn giải chuỗi dưới dạng hàng chục ký tự, bạn có thể thực hiện như sau:

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

Cảm ơn. Vì vậy, chúng là vô hướng hay cái gì khác? – ckorzhik

+1

Chúng là loại chuỗi gốc. Bạn có thể chia nó thành các ký tự (chiều dài 1 chuỗi) bằng cách sử dụng 'tf.string_split (s, delimiter =" ")' trong phiên bản mới nhất –

+0

'print (" ". Join (map (chr, y.eval())))' có nhiều khả năng bạn muốn –

Các vấn đề liên quan