2015-12-08 23 views
7

Tôi đang cố gắng triển khai mô hình hồi quy logistic đơn giản được đào tạo với bộ hình ảnh của riêng tôi, nhưng tôi nhận được lỗi này khi tôi cố gắng để đào tạo các mô hình:Tensorflow (python): "ValueError: thiết lập một phần tử mảng với một chuỗi" trong train_step.run (...)

Traceback (most recent call last): 
File "main.py", line 26, in <module> 
model.entrenar_modelo(sess, training_images, training_labels) 
File "/home/jr/Desktop/Dropbox/Machine_Learning/TF/Míos/Hip/model_log_reg.py", line 24, in entrenar_modelo 
train_step.run({x: batch_xs, y_: batch_ys}) 
File "/home/jr/.local/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 1267, in run 
_run_using_default_session(self, feed_dict, self.graph, session) 
File "/home/jr/.local/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 2763, in _run_using_default_session 
session.run(operation, feed_dict) 
File "/home/jr/.local/lib/python2.7/site-packages/tensorflow/python/client/session.py", line 334, in run 
np_val = np.array(subfeed_val, dtype=subfeed_t.dtype.as_numpy_dtype) 
ValueError: setting an array element with a sequence. 

các dữ liệu tôi đang ăn để train_step.run({x: batch_xs, y_: batch_ys}) là như thế này:

  • batch_xs: danh sách các đối tượng tensor đại diện cho hình ảnh của 100x100 (10.000 tensors dài)
  • batch_ys: danh sách nhãn s phao (1.0 hoặc 0.0)

Tôi đang làm gì sai? Thx trước!

EDIT 1: Nó vỉa vấn đề là tôi đã phải đánh giá tensors trong batch_xs trước khi đi qua họ train_step.run(...). Tôi nghĩ rằng phương pháp chạy sẽ chăm sóc đó, nhưng tôi đoán tôi đã sai? Dù sao, vì vậy một khi tôi đã làm điều này trước khi gọi hàm:

for i, x in enumerate(batch_xs): 
    batch_xs[i] = x.eval() 
    #print batch_xs[i].shape 
    #assert all(x.shape == (100, 100, 3) for x in batch_xs) 
# Now I can call the function 

EDIT 2: Tôi có một số vấn đề ngay cả sau khi làm những gì được diễn tả bằng những câu trả lời dưới đây. Cuối cùng tôi đã sửa tất cả mọi thứ bằng cách bỏ máng tensors và sử dụng các mảng numpy.

Hy vọng điều này sẽ giúp người khác

Trả lời

16

Lỗi cụ thể này sắp ra khỏi numpy. Gọi np.array trên một chuỗi có thứ nguyên không nhất quán có thể ném nó.

>>> np.array([1,2,3,[4,5,6]]) 

ValueError: setting an array element with a sequence. 

Dường như nó không tại điểm mà tf đảm bảo rằng tất cả các yếu tố của feed_dictnumpy.array s.

Kiểm tra feed_dict của bạn.

+0

Cảm ơn! Tôi đã gặp sự cố này bằng cách sử dụng dữ liệu hình ảnh từ một tập dữ liệu hdf5 nơi mỗi hình ảnh có hình dạng khác nhau. –

5

Các feed_dict lập luận để Operation.run() (còn Session.run()Tensor.eval()) chấp nhận một ánh xạ từ điển Tensor đối tượng (thường tf.placeholder() tensors) vào một mảng NumPy (hoặc đối tượng có thể được trivially chuyển đổi sang một mảng NumPy).

Trong trường hợp của bạn, bạn đang chuyển batch_xs, đây là danh sách các mảng có nhiều mảng và TensorFlow không biết cách chuyển đổi thành mảng có nhiều mảng. Hãy nói rằng batch_xs được định nghĩa như sau:

batch_xs = [np.random.rand(100, 100), 
      np.random.rand(100, 100), 
      ...,      # 29 rows omitted. 
      np.random.rand(100, 100)] # len(batch_xs) == 32. 

Chúng tôi có thể chuyển đổi batch_xs thành một mảng 32 x 100 x 100 sử dụng như sau:

# Convert each 100 x 100 element to 1 x 100 x 100, then vstack to concatenate. 
batch_xs = np.vstack([np.expand_dims(x, 0) for x in batch_xs]) 
print batch_xs.shape 
# ==> (32, 100, 100) 

Lưu ý rằng, nếu batch_ys là danh sách các phao nổi, đây sẽ là minh bạch chuyển đổi thành mảng 1-D numpy bởi TensorFlow, vì vậy bạn không cần phải chuyển đổi đối số này.

EDIT: mdaoust làm cho một điểm hợp lệ trong các ý kiến: Nếu bạn vượt qua một danh sách các mảng vào np.array (và do đó là giá trị trong một feed_dict), nó sẽ tự động được vstack ed, vì vậy không nên có nhu cầu để chuyển đổi đầu vào của bạn như tôi đã đề xuất. Thay vào đó, có vẻ như bạn có sự không khớp giữa các hình dạng của các phần tử danh sách của bạn. Hãy thử thêm các mục sau:

assert all(x.shape == (100, 100) for x in batch_xs) 

... trước khi gọi tới train_step.run() và điều này sẽ cho biết bạn có không khớp không.

+0

np tự động xếp chồng danh sách mảng như thế này, vì vậy tôi vẫn đặt cược vào kích thước không thống nhất. 'p = tf.placeholder (tf.float32, [2,10,10]);' 'q = tf.identity (p);' 'q.eval (feed_dict = {p: [np.random.randn (10 , 10), np.random.randn (10,10)]}) ‌ .shape # ==> (2, 10, 10) ' – mdaoust

+1

@mrry Có cách nào để nạp TF tensors vào' feed_dict' không? Như bạn biết tôi read_and_decode hình ảnh hoàn toàn trong TF và bây giờ có cùng một vấn đề khi cho ăn –

+0

@HamedMP: Hiện tại không có cách nào để cấp một 'Tensor' (tượng trưng) làm giá trị trong' feed_dict'. Ba lựa chọn chính ở đây là: (i) đánh giá tensor và truyền giá trị của nó, (ii) xây dựng biểu đồ để bạn sử dụng giá trị của 'Tensor' trong biểu thức gốc, hoặc (iii) sử dụng" hàng đợi " một indirection, đánh giá 'Tensor' và enqueue nó; sau đó xác định biểu thức ban đầu như một hàm của 'dequeue' thay vì một trình giữ chỗ. – mrry

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