2015-11-13 10 views
6

Tôi đang thử dùng TensorFlow và tôi đang gặp lỗi lạ. Tôi đã chỉnh sửa ví dụ MNIST sâu để sử dụng một tập hợp hình ảnh khác và thuật toán hội tụ lại một cách độc đáo, cho đến khoảng 8.000 lần lặp lại (độ chính xác 91% tại thời điểm đó) khi lỗi xảy ra với lỗi sau.Đầu vào yêu cầu ReluGrad của TensorFlow không phải là hữu hạn

tensorflow.python.framework.errors.InvalidArgumentError: ReluGrad input is not finite 

Lúc đầu, tôi nghĩ có lẽ một số hệ số được đạt đến giới hạn cho một phao, nhưng thêm quy tắc l2 trên tất cả các trọng & những thành kiến ​​không giải quyết được vấn đề này. Nó luôn là ứng dụng relu đầu tiên xuất hiện trong stacktrace:

h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1) 

Hiện tại tôi chỉ đang hoạt động trên CPU. Bất kỳ ý tưởng gì có thể gây ra điều này và làm thế nào để làm việc xung quanh nó?

Chỉnh sửa: Tôi đã truy tìm vấn đề này Tensorflow NaN bug?, giải pháp có hoạt động.

+0

Tôi cũng nhận thấy rằng nếu dòng 'train_step = tf.train.AdamOptimizer (1e-4) .minimize (cross_entropy)' Tôi sửa đổi giá trị thành 1e-3, sự cố xảy ra trước đó đáng kể. Tuy nhiên, việc thay đổi nó thành 1e-5 sẽ ngăn không cho thuật toán hội tụ. – user1111929

+0

Đối với Adam, bạn có thể muốn tăng đối số 'epsilon'. Giá trị mặc định hiện tại là 'epsilon = 1e-8'. Nhìn vào tài liệu. Nó nói "Ví dụ, khi đào tạo một mạng khởi động trên ImageNet một lựa chọn tốt hiện tại là 1.0 hoặc 0.1." Ngoài ra, hãy xem [this] (https://github.com/tensorflow/tensorflow/issues/323#issuecomment-159116515) thảo luận. – Albert

Trả lời

3

Vì tôi đã có một chủ đề về vấn đề này [Tensorflow NaN bug?] Tôi đã không giữ này được cập nhật, nhưng các giải pháp đã có một thời gian và từ đó đã được lặp lại bởi áp phích ở đây. Vấn đề thực sự là 0 * log (0) dẫn đến một NaN.

Một tùy chọn là sử dụng dòng Muaaz gợi ý ở đây hoặc tùy chọn tôi đã viết trong chủ đề được liên kết. Nhưng cuối cùng TensorFlow có thói quen này nhúng: tf.nn.softmax_cross_entropy_with_logits và điều này là hiệu quả hơn và do đó nên được ưa thích khi có thể. Điều này nên được sử dụng nếu có thể thay vì những điều tôi và Muaaz đề xuất trước đó, như được chỉ ra bởi một bình luận về liên kết cho biết.

1

Tôi đã gặp phải lỗi này: input is not finite trước đó (không phải với tf.nn.relu). Trong trường hợp của tôi, vấn đề là các phần tử trong biến tensor của tôi đạt tới số lượng rất lớn (đánh dấu chúng là vô hạn và do đó là thông báo input is not finite).

Tôi sẽ đề xuất thêm một loạt kết quả gỡ lỗi vào tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1) ở mọi lần lặp lại n-th để theo dõi thời điểm chính xác đến mức vô cùng.

này trông phù hợp với nhận xét của bạn:

I modify the value to 1e-3, the crash occurs significantly earlier. However, changing it to 1e-5 prevents the algorithm from converging

+0

Đồng ý bạn xây dựng lý do tại sao điều này phù hợp với nhận xét của tôi? Tôi đã thêm một clipping: relu (clip (...)) và bây giờ tôi nhận được giá trị NaN trong đầu ra của tôi thay vì vô cùng, vì vậy tôi cảm thấy rằng đây không phải là gốc của vấn đề. Nó có thể được rằng một khi một giải pháp được tốt, thuật toán tối ưu hóa không thể làm bất cứ điều gì nữa, và treo (hoặc không 0/0) thay vì chỉ dừng lại? Không chắc chắn làm thế nào để tiếp tục nếu đó là trường hợp. – user1111929

+0

Như để thêm thông tin gỡ lỗi, tôi đã làm và một số giá trị có hiệu quả tiếp tục phát triển. Hợp lý: convolution làm cho chúng tăng lên bởi một yếu tố lớn. Sự tăng trưởng quá lớn nên việc thường xuyên không giúp đủ (hoặc ít nhất là làm cho thuật toán không hiệu quả trước khi thực sự giải quyết vấn đề này). Clipping dường như không giúp được gì. Không thay thế relu bằng softplus (sau đó thuật toán không hội tụ thành một trình phân loại tốt nữa). Tôi có thể thử những ý tưởng nào khác không? – user1111929

+0

@ user1111929 nếu chúng đạt đến vô cực, thì câu hỏi này được giải quyết. Hãy hỏi một câu hỏi khác về cách đối phó với 'relu' để ngăn chặn nó đến vô cùng. –

9

Lỗi là do 0log (0)

Điều này có thể tránh được bằng cách:

cross_entropy = -tf.reduce_sum(y*tf.log(yconv+ 1e-9)) 
+1

Điều này dường như làm việc cho tôi. – bge0

+0

Bật. Làm thế nào bạn tìm ra điều này? – syzygy

1

không thể bình luận vì danh tiếng, nhưng Muaaz có câu trả lời. Lỗi có thể được nhân rộng bằng cách đào tạo một hệ thống có lỗi 0 - dẫn đến log (0). Giải pháp của anh ta hoạt động để ngăn chặn điều này. Ngoài ra, hãy bắt lỗi và tiếp tục.

...your other code... 
try : 
    for i in range(10000): 
    train_accuracy = accuracy.eval(feed_dict={ 
      x:batch_xs, y_: batch_ys, keep_prob: 1.0}) 

except : print("training interupted. Hopefully deliberately") 
Các vấn đề liên quan