24

Tôi đã chạy TensorFlow và tôi xảy ra để có một cái gì đó tạo ra một NaN. Tôi muốn biết nó là gì nhưng tôi không biết làm thế nào để làm điều này. Vấn đề chính là trong một chương trình thủ tục "bình thường" tôi sẽ chỉ viết một tuyên bố in ngay trước khi hoạt động được thực hiện. Vấn đề với TensorFlow là tôi không thể làm điều đó vì lần đầu tiên tôi khai báo (hoặc xác định) biểu đồ, vì vậy việc thêm các câu lệnh in vào định nghĩa biểu đồ không giúp ích gì. Có bất kỳ quy tắc, lời khuyên, chẩn đoán, bất cứ điều gì để theo dõi những gì có thể gây ra NaN?Làm cách nào để gỡ lỗi giá trị NaN trong TensorFlow?


Trong trường hợp này tôi biết chính xác hơn những gì dòng để nhìn vào bởi vì tôi có những điều sau đây:

Delta_tilde = 2.0*tf.matmul(x,W) - tf.add(WW, XX) #note this quantity should always be positive because its pair-wise euclidian distance 
Z = tf.sqrt(Delta_tilde) 
Z = Transform(Z) # potentially some transform, currently I have it to return Z for debugging (the identity) 
Z = tf.pow(Z, 2.0) 
A = tf.exp(Z) 

khi dòng này là hiện tại tôi có nó mà nó trả về NaN như tuyên bố của các nhà văn tóm tắt của tôi . Tại sao điều này? Có cách nào ít nhất để khám phá giá trị Z có sau khi bắt nguồn từ hình vuông của nó không?


Ví dụ cụ thể mà tôi đã đăng, tôi đã thử tf.Print(0,Z) nhưng không thành công khi in không có gì. Như trong:

Delta_tilde = 2.0*tf.matmul(x,W) - tf.add(WW, XX) #note this quantity should always be positive because its pair-wise euclidian distance 
Z = tf.sqrt(Delta_tilde) 
tf.Print(0,[Z]) # <-------- TF PRINT STATMENT 
Z = Transform(Z) # potentially some transform, currently I have it to return Z for debugging (the identity) 
Z = tf.pow(Z, 2.0) 
A = tf.exp(Z) 

Tôi thực sự không hiểu những gì tf.Print là giả sử để làm. Tại sao cần hai đối số? Nếu tôi muốn in 1 tensor tại sao tôi cần phải vượt qua 2? Dường như kỳ lạ với tôi.


Tôi đã nhìn vào chức năng tf.add_check_numerics_ops() nhưng nó không nói như thế nào để sử dụng nó (cộng với các tài liệu có vẻ không được siêu hữu ích). Có ai biết cách sử dụng cái này không?


Vì tôi đã nhận xét về việc giải quyết dữ liệu có thể xấu, tôi đang sử dụng MNIST chuẩn. Tuy nhiên, tôi tính toán một số lượng tích cực (khoảng cách eucledian đôi khôn ngoan) và sau đó hình vuông rễ nó. Vì vậy, tôi sẽ không thấy cách dữ liệu cụ thể sẽ là một vấn đề.

Trả lời

5

Có vẻ như bạn có thể gọi nó sau khi bạn hoàn thành việc tạo biểu đồ.

check = tf.add_check_numerics_ops()

Tôi nghĩ rằng đây sẽ bổ sung việc kiểm tra đối với tất cả các hoạt động điểm nổi. Sau đó, trong các hàm chạy phiên, bạn có thể thêm hoạt động kiểm tra.

sess.run([check, ...])

+1

FYI này bỏ lỡ một số ops khi tối ưu được sử dụng - https://github.com/tensorflow/tensorflow/issues/2288 –

12

Có một vài lý do tại sao bạn có thể nhận được một NaN-kết quả, thường đó là vì một tỷ lệ học nhưng nhiều quá cao những lý do khác có thể xảy ra ví dụ như dữ liệu tham nhũng trong đầu vào hàng đợi của bạn hoặc một bản ghi 0 tính toán. Tuy nhiên, việc gỡ lỗi bằng bản in khi bạn mô tả không thể được thực hiện bằng một bản in đơn giản (vì điều này sẽ chỉ dẫn đến việc in thông tin tensor bên trong biểu đồ và không in bất kỳ giá trị thực tế nào).

Tuy nhiên, nếu bạn sử dụng tf.print làm biểu đồ trong đồ thị (tf.print) thì khi biểu đồ được thực thi, bạn sẽ nhận được các giá trị thực tế được in (và đó là một bài tập tốt để xem các giá trị này để gỡ lỗi và hiểu hành vi của mạng của bạn).

Tuy nhiên, bạn đang sử dụng lệnh in không hoàn toàn đúng cách.Đây là một op, vì vậy bạn cần phải vượt qua nó một tensor và yêu cầu một kết quả-tensor mà bạn cần phải làm việc với sau này trong biểu đồ thực hiện. Nếu không thì op sẽ không được thực thi và không có in nào xảy ra. Hãy thử điều này:

Z = tf.sqrt(Delta_tilde) 
Z = tf.Print(Z,[Z], message="my Z-values:") # <-------- TF PRINT STATMENT 
Z = Transform(Z) # potentially some transform, currently I have it to return Z for debugging (the identity) 
Z = tf.pow(Z, 2.0) 
+3

Tại sao một phải vượt qua Z đầu tiên nếu Z thứ hai là dữ liệu? Về bản chất, API cho 'tf.Print' là khó hiểu. Tại sao chúng ta cần hai đối số đầu vào để in một điều duy nhất? – Pinocchio

+0

Danh sách các tensors [Z] được in khi thiết bị Z đầu tiên được đánh giá. Đôi khi người ta có thể muốn in ra những thứ khác nhau. – holdenlee

+0

Đây là một snip nhỏ mà tôi thấy hữu ích cho một số tensor 'x': ' DEBUGGING = False' 'x = x nếu không DEBUGGING khác tf.Print (x, [x], 'Giá trị của x:')' –

1

Trước hết, bạn cần kiểm tra dữ liệu đầu vào của mình đúng cách. Trong hầu hết các trường hợp, đây là lý do. Nhưng không phải lúc nào cũng vậy.

Tôi thường sử dụng Tensorboard để xem điều gì đang xảy ra trong khi đào tạo. Vì vậy, bạn sẽ nhìn thấy giá trị trên mỗi bước với

Z = tf.pow(Z, 2.0)  
summary_z = tf.scalar_summary('z', Z) 
#etc.. 
summary_merge = tf.merge_all_summaries() 
#on each desired step save: 
    summary_str = sess.run(summary_merge) 
    summary_writer.add_summary(summary_str, i) 

Ngoài ra bạn có thể chỉ đơn giản là eval và in giá trị hiện tại:

print(sess.run(Z)) 
+0

vấn đề là nó nhận được giá trị NaN vì vậy tôi nhà văn tóm tắt thực sự thoát khỏi kịch bản của tôi vì vậy tôi không thể nhìn thấy nó. Thay vào đó, bạn có đề xuất viết giá trị trước op có thể gây ra NaN không? (có lẽ trước khi sqrt) Ngoài ra, đây là một phần của một mạng, vì vậy tôi gọi sess.run trên một số tàu op. Tôi không thể chỉ sess.run Z không may (hoặc tôi không biết làm thế nào để). – Pinocchio

+0

Bạn có thể chạy một số ops bằng 'op1_answer, op2_answer, opN_answer = sess.run ([op1, op2, opN], feed_dict = {etc ..})' –

0

Những câu trả lời là đã tốt. Nếu bạn đang tìm các kỹ thuật gỡ lỗi chung (tức là không cụ thể cho Tensorflow), tài liệu này rất hữu ích: http://russellsstewart.com/notes/0.html

+1

Điều này không trả lời câu hỏi OP – mhasan

2

Kể từ phiên bản 0.12, TensorFlow được gửi kèm với trình gỡ lỗi tích hợp có tên tfdbg. Nó tối ưu hóa luồng công việc gỡ lỗi loại vấn đề giá trị số-giá trị này (như infnan). Tài liệu có tại: https://www.tensorflow.org/programmers_guide/debugger

0

Tôi đã từng thấy khó khăn hơn nhiều trong việc xác định vị trí của nans và inf có thể xảy ra hơn để sửa lỗi. Là một bổ sung cho câu trả lời @ SCAI, tôi muốn thêm một số điểm ở đây:

Module gỡ lỗi, bạn có thể nhập khẩu theo:

from tensorflow.python import debug as tf_debug 

là tốt hơn nhiều so với bất kỳ in hoặc khẳng định.

Bạn chỉ có thể thêm chức năng debug bằng cách thay đổi wrapper bạn phiên của bạn bằng cách:

sess = tf_debug.LocalCLIDebugWrapperSession(sess) 
sess.add_tensor_filter("has_inf_or_nan", tf_debug.has_inf_or_nan) 

Và bạn sẽ nhắc nhở một giao diện dòng lệnh, sau đó bạn hãy nhập: run -f has_inf_or_nanlt -f has_inf_or_nan để tìm nơi Nans hoặc infs. Người đầu tiên là nơi đầu tiên xảy ra thảm họa. Bởi tên biến bạn có thể theo dõi nguồn gốc trong mã của bạn.

tham khảo: https://developers.googleblog.com/2017/02/debug-tensorflow-models-with-tfdbg.html

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