2017-06-27 28 views
6

Tôi đang cố truy xuất các ký tự trong chuỗi tensor để dự đoán mức ký tự. Những sự thật mặt đất là những từ mà mỗi nhân vật có một id trong từ điển. Tôi có một tensor tương ứng với độ dài của chuỗi.Tensorflow - Lấy mỗi ký tự trong một chuỗi tensor

Bây giờ, tôi phải lấy từng ký tự trong chuỗi tensor. Sau khi kiểm tra các bài viết liên quan, một lần truy xuất đơn giản có thể như sau. Chuỗi mẫu là "This"

a= tf.constant("This",shape=[1]) 
b=tf.string_split(a,delimiter="").values #Sparse tensor has the values array which stores characters 

Bây giờ tôi muốn tạo một chuỗi có khoảng trắng giữa các chữ "This" tức là "T h i s". Tôi cần khoảng cách lúc bắt đầu và kết thúc quá. Làm cách nào để thực hiện việc này?

Tôi đã cố gắng để lặp qua các nhân vật như dưới đây

for i in xrange(b.dense_shape[1]): # b.dense_shape[1] has the length of string 
     x=b.values[i] 

Nhưng vòng lặp hy vọng một số nguyên chứ không phải là một tensor.

Bất kỳ ý tưởng nào về cách thực hiện các tác vụ trên? Tôi không thể tìm thấy bất kỳ tài liệu nào liên quan đến điều này (ngoài chức năng tf.string_split). Mọi đề xuất đều được chào đón. Cảm ơn

Trả lời

5

Vấn đề của bạn là bạn đang cố gắng lặp qua Tensor, điều đó không thể lặp lại được. Có một số lựa chọn thay thế cho tác vụ này, chẳng hạn như chuyển đổi nó thành mảng numpy với eval() hoặc sử dụng tf.map_fn.

Nếu bạn muốn mối đe dọa b như numpy array bạn chỉ cần thêm các cuộc gọi .eval() trước .values và lặp qua kết quả như sau:

with tf.Session() as sess: 
    a = tf.constant("This", shape=[1]) 
    b = tf.string_split(a, delimiter="").values.eval() 

    for i in b: 
     print(i) 

Các lựa chọn thứ hai là thích hợp hơn vì nó tận dụng TensorFlow của đồ thị. Nó được dựa trên việc sử dụng một chức năng mà "bản đồ" Tensor. Điều này có thể được thực hiện như sau (trong đó trong số fn bạn có thể xác định hành vi của sự lặp lại):

with tf.Session() as sess: 
    a = tf.constant("This", shape=[1]) 
    b = tf.string_split(a, delimiter="").values 

    fn = lambda i: i 

    print(tf.map_fn(fn, b).eval()) 
+0

Thực ra vấn đề của tôi không phải là lặp qua tensor, thay vì nhận từng ký tự. Tôi không thể sử dụng eval() ở đây vì tôi cần các ký tự dưới dạng tensors. Nhiệm vụ chính của tôi là lấy một chuỗi tensor với các khoảng trống chèn vào giữa chuỗi gốc. Ý tưởng của tôi là thêm từng tensor ký tự với khoảng trắng để có được chuỗi tensor mong muốn. Nhưng tôi không chắc chắn làm thế nào để làm điều đó. –

+1

Nhiệm vụ dễ dàng với phương pháp thứ hai. Bạn có thể làm như sau: 'tf.string_split (tf.map_fn (lambda i: i +" ", b), delimiter =" "). Values' có nghĩa là bạn thêm một dấu cách ở cuối mỗi ký tự và sau đó lại -split các tensor kết quả. – garciparedes

+0

Hoạt động như một sự quyến rũ. Cảm ơn bạn –

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