2016-01-02 38 views
5

Tôi đang cố gắng làm việc với LSTMs trong Tensor Flow. Tôi tìm thấy một hướng dẫn trực tuyến, nơi một tập hợp các chuỗi được lấy vào và hàm mục tiêu bao gồm đầu ra cuối cùng của LSTM và các giá trị đã biết. Tuy nhiên, tôi muốn có thông tin sử dụng chức năng khách quan của mình từ mỗi đầu ra. Cụ thể, tôi đang cố gắng để có LSTM học tập các chuỗi (tức là tìm hiểu tất cả các ký tự trong các từ trong câu) .:Tensorflow: Danh sách Tensors cho Chi phí

cell = rnn_cell.BasicLSTMCell(num_units) 
inputs = [tf.placeholder(tf.float32,shape=[batch_size,input_size]) for _ in range(seq_len)] 
result = [tf.placeholder(tf.float32, shape=[batch_size,input_size]) for _ in range(seq_len)] 

W_o = tf.Variable(tf.random_normal([num_units,input_size], stddev=0.01))  
b_o = tf.Variable(tf.random_normal([input_size], stddev=0.01)) 

outputs, states = rnn.rnn(cell, inputs, dtype=tf.float32) 

losses = [] 

for i in xrange(len(outputs)): 
    final_transformed_val = tf.matmul(outputs[i],W_o) + b_o 
    losses.append(tf.nn.softmax(final_transformed_val)) 

cost = tf.reduce_mean(losses) 

Làm quả này trong các lỗi:

TypeError: List of Tensors when single Tensor expected 

thế nào Tôi có nên khắc phục vấn đề này không? Liệu các tf.reduce_mean() có trong một danh sách các giá trị tensor, hoặc là có một số đối tượng tensor đặc biệt mà có họ?

Trả lời

3

Trong mã của bạn, losses là danh sách Python. TensorFlow's reduce_mean() mong đợi một tensor đơn, không phải là một danh sách Python.

losses = tf.reshape(tf.concat(1, losses), [-1, size]) 

trong đó kích thước là số giá trị bạn đang dùng softmax hơn nên làm những gì bạn muốn. Hãy xem concat()

Nhưng, một điều tôi nhận thấy trong mã của bạn có vẻ hơi lạ, là bạn có danh sách trình giữ chỗ cho dữ liệu nhập của mình, trong khi mã trong the TensorFlow Tutorial sử dụng đơn đặt hàng 3 tensor cho đầu vào. Dữ liệu đầu vào của bạn là danh sách thứ tự 2 tensors. Tôi khuyên bạn nên xem xét mã trong hướng dẫn, bởi vì nó gần như chính xác những gì bạn đang yêu cầu.

Một trong các tệp chính trong hướng dẫn đó là here. Đặc biệt, dòng 139 là nơi họ tạo ra chi phí của họ. Về đầu vào của bạn, dòng 90 và 91 là nơi thiết lập đầu vào và trình giữ chỗ mục tiêu được thiết lập. Điểm chính trong 2 dòng này là toàn bộ chuỗi được chuyển vào trong một trình giữ chỗ duy nhất thay vì với danh sách trình giữ chỗ.

Xem dòng 120 trong tệp ptb_word_lm.py để xem vị trí của chúng nối.

+1

OK, tôi đã hiểu lầm. Tôi đã xóa câu trả lời của tôi :) Bạn có thể muốn chỉ hiển thị ví dụ mã từ hướng dẫn trong bài đăng của bạn, vì nó có thể giúp người mới đến (và tôi cũng muốn hiểu). – Will

+1

Mã tôi đang nói đến là tại https://tensorflow.googlesource.com/tensorflow/+/master/tensorflow/models/rnn/ptb/ptb_word_lm.py#139 và phần về đầu vào ở dòng 90 trong đó tập tin. num_steps trong dòng 90 của tệp đó là giống nhau (xấp xỉ) như seq_len trong mã OP. Bạn có đề xuất nội tuyến phương thức __init__ hay chỉ cung cấp liên kết tới tệp không? –

+0

Ah, tôi hiểu, đó là một phương pháp rất lớn. Tôi nghĩ rằng liên kết đến tập tin, với một vài dòng có liên quan và một chút giải thích, sẽ làm cho nó rõ ràng nhất.Bài viết của bạn có vẻ là một điểm khởi đầu tuyệt vời, nhưng nhìn thấy một "ví dụ chính xác" của các phần của mã mà OP không làm đúng cách sẽ rất hữu ích tôi nghĩ. Một chiến lược khác mà tôi sử dụng đôi khi chỉ cần dán toàn bộ phương thức/lớp nhưng thay thế các dòng không liên quan bằng '# ...' để rút ngắn nó. – Will

2

dụ làm việc, kiểm tra notebook:

import tensorflow as tf 
from tensorflow.models.rnn import rnn, rnn_cell 
print(tf.__version__) 
#> 0.8.0 

batch_size = 2 
output_size = input_size = 2 
seq_len  = 10 
num_units = 2 

cell = rnn_cell.BasicLSTMCell(num_units) 
inputs = [tf.placeholder(tf.float32, shape=[batch_size,input_size ]) for _ in xrange(seq_len)] 
result = [tf.placeholder(tf.float32, shape=[batch_size,output_size]) for _ in xrange(seq_len)] 

W_o = tf.Variable(tf.random_normal([num_units,input_size], stddev=0.01))  
b_o = tf.Variable(tf.random_normal([input_size],   stddev=0.01)) 

outputs, states = rnn.rnn(cell, inputs, dtype=tf.float32) 

losses = [] 

for i in xrange(seq_len): 
    final_transformed_val = tf.matmul(outputs[i],W_o) + b_o 
    losses.append(tf.squared_difference(result[i],final_transformed_val)) 

losses = tf.reshape(tf.concat(1, losses), [-1, seq_len]) 
cost = tf.reduce_mean(losses) 

Để thấy điều này trong hành động, bạn có thể ăn đồ thị một cách hacky:

import matplotlib.pyplot as plt 
import numpy as np 

step = tf.train.AdamOptimizer(learning_rate=0.01).minimize(cost) 
sess = tf.InteractiveSession() 

sess.run(tf.initialize_all_variables()) 

costs = [] 

# EXAMPLE 
# Learn cumsum over each sequence in x 
# | t  | 0 | 1 | 2 | 3 | 4 | ...| 
# |----------|---|---|---|---|----|----| 
# | x[:,0,0] | 1 | 1 | 1 | 1 | 1 | ...| 
# | x[:,0,1] | 1 | 1 | 1 | 1 | 1 | ...| 
# |   | | | | | | | 
# | y[:,0,0] | 1 | 2 | 3 | 4 | 5 | ...| 
# | y[:,0,1] | 1 | 2 | 3 | 4 | 5 | ...| 

n_iterations = 300 
for _ in xrange(n_iterations): 
    x = np.random.uniform(0,1,[seq_len,batch_size,input_size]) 
    y = np.cumsum(x,axis=0) 

    x_list = {key: value for (key, value) in zip(inputs, x)} 
    y_list = {key: value for (key, value) in zip(result, y)} 

    err,_ = sess.run([cost, step], feed_dict=dict(x_list.items()+y_list.items())) 
    costs.append(err) 

plt.plot(costs) 
plt.show() 

enter image description here

Như tensorflow-người mới bắt đầu tôi vẫn chưa tìm được cách thực hành thống nhất/cách tốt nhất để xử lý RNN nhưng như đã đề cập ở trên, tôi chắc rằng điều này không được khuyến khích. Đã thích kịch bản của bạn như một phần giới thiệu rất hay, cảm ơn các đoạn trích. Ngoài ra, có những điều đang diễn ra, ví dụ: implementation of scan and RNN-tuple-friendliness ngay bây giờ, vì vậy hãy cẩn thận

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