CẢNH BÁO: tenorflow: chế độ sample_ weight đã bị ép buộc từ chế độ thành ['' ']


47

Huấn luyện một trình phân loại hình ảnh bằng cách sử dụng .fit_generator()hoặc .fit()chuyển từ điển thành class_weight=đối số.

Tôi chưa bao giờ gặp lỗi trong TF1.x nhưng trong 2.1 tôi nhận được đầu ra sau khi bắt đầu đào tạo:

WARNING:tensorflow:sample_weight modes were coerced from
  ...
    to  
  ['...']

Nó có nghĩa gì để ép buộc một cái gì đó từ ...đến ['...']?

Nguồn cho cảnh báo này trên tensorflowrepo là ở đây , các bình luận được đặt là:

Cố gắng ép mẫu_ weight_modes vào cấu trúc đích. Điều này hoàn toàn phụ thuộc vào thực tế là Model làm phẳng các đầu ra cho biểu diễn bên trong của nó.


7
Thật buồn cười khi thấy một câu hỏi gần đây như là kết quả tìm kiếm duy nhất cho các cảnh báo của riêng tôi.
jmkjaer

1
@jorijnsmit bạn có thể cung cấp mã để sao chép vấn đề / cảnh báo không?
thushv89

2
Trên thực tế, chuyển sang TF2 %tensorflow_version 2.xlà đủ để làm cho cảnh báo này xuất hiện: colab.research.google.com/gist/jorijnsmit/ (
jorijnsmit

1
@jorijnsmit, Không, tôi nhận được cảnh báo tương tự nhưng thực tế đã cài đặt TF2.1 như pip install tensorflow(trong môi trường pyenv / virtualenv)
lurix66

1
Có thực sự @ lurix66, mã tạo ra lỗi này được giới thiệu trong 2.1.0rc0.
jorijnsmit

Câu trả lời:


11

Điều này có vẻ như một tin nhắn không có thật. Tôi nhận được thông báo cảnh báo tương tự sau khi nâng cấp lên TensorFlow 2.1, nhưng tôi hoàn toàn không sử dụng bất kỳ trọng số lớp hoặc trọng lượng mẫu nào. Tôi sử dụng một trình tạo trả về một tuple như thế này:

return inputs, targets

Và bây giờ tôi chỉ thay đổi nó thành như sau để làm cho cảnh báo biến mất:

return inputs, targets, [None]

Tôi không biết điều này có liên quan hay không, nhưng mô hình của tôi sử dụng 3 đầu vào, vì vậy inputsbiến của tôi thực sự là một danh sách gồm 3 mảng numpy. targetschỉ là một mảng numpy duy nhất.

Trong mọi trường hợp, đó chỉ là một cảnh báo. Việc đào tạo hoạt động tốt một trong hai cách.

Chỉnh sửa cho TensorFlow 2.2:

Lỗi này dường như đã được sửa trong TensorFlow 2.2, đây là một lỗi rất lớn. Tuy nhiên, bản sửa lỗi ở trên sẽ thất bại trong TF 2.2, vì nó sẽ cố lấy hình dạng của các trọng số mẫu, điều này rõ ràng sẽ thất bại với AttributeError: 'NoneType' object has no attribute 'shape'. Vì vậy, hoàn tác sửa chữa ở trên khi nâng cấp lên 2.2.


Điều này làm việc cho tôi quá.
Robert Lugg

14

Tôi tin rằng đây là một lỗi với tenorflow sẽ xảy ra khi bạn gọi model.compile()với tham số mặc định sample_weight_mode=Nonevà sau đó gọi model.fit()với chỉ định sample_weighthoặc class_weight.

Từ repos dòng chảy:

  • fit() cuối cùng gọi _process_training_inputs()
  • _process_training_inputs() bộ sample_weight_modes = [None] dựa trên model.sample_weight_mode = Nonevà sau đó tạo ra một DataAdaptervớisample_weight_modes = [None]
  • các DataAdaptercuộc gọi broadcast_sample_weight_modes()với sample_weight_modes = [None]trong khởi
  • broadcast_sample_weight_modes() dường như mong đợi sample_weight_modes = None nhưng nhận được[None]
  • nó khẳng định đó [None]là một cấu trúc khác với sample_weight/ class_weight, ghi đè lên nó Nonebằng cách khớp với cấu trúc của sample_weight/ class_weightvà đưa ra cảnh báo

Cảnh báo sang một bên điều này không có tác dụng fit()như sample_weight_modestrong DataAdapterđược đặt lại None.

Lưu ý rằng trạng thái tài liệu tenorflow sample_weightphải là một mảng numpy. Nếu bạn gọi fit()bằng sample_weight.tolist()thay vào đó, bạn sẽ không nhận được cảnh báo mà sample_weightbị ghi đè âm thầm Nonekhi _process_numpy_inputs()được gọi trong tiền xử lý và nhận đầu vào có độ dài lớn hơn một.


1
Một lời giải thích rất kỹ lưỡng, cảm ơn. Điều duy nhất tôi không hiểu là cảnh báo mô tả ...việc bị ép buộc [...], trong khi đó trong trường hợp của bạn [None]bị ép buộc None...
jorijnsmit

4

Tôi đã lấy Gist của bạn và cài đặt Tensorflow 2.0, thay vì TFA và nó hoạt động mà không có bất kỳ Cảnh báo nào như vậy.

Đây là Gist của mã hoàn chỉnh. Mã để cài đặt Tensorflow được hiển thị dưới đây:

!pip install tensorflow==2.0

Ảnh chụp màn hình thực hiện thành công được hiển thị dưới đây:

nhập mô tả hình ảnh ở đây

Cập nhật: Lỗi này được sửa trongTensorflow Version 2.2.


5
Cảm ơn bạn đã phản hồi của bạn. Bạn đã đúng, thông báo cảnh báo không được giới thiệu cho đến phiên bản 2.1.0rc0. Tuy nhiên, tôi sợ còn lại câu hỏi của tôi: "gì nó có nghĩa là để ép buộc cái gì đó từ ...đến ['...']?"
jorijnsmit

3
Tôi nhận thấy rằng một số thứ có thể ngoài ý muốn xảy ra khi sample_weight_mode=Nonetarget_structurethuộc loại dict, sample_weight_modessau đó [None]và ngoại lệ broadcast_sample_weight_modesđược bắt gặp do dict. Điều này có thể được coi là một lỗi?
Franz Knülle

2
Không. Câu hỏi tiếp tục thu thập quan điểm và upvote nhưng không có câu trả lời.
jorijnsmit

1
@gkennos: Nếu bạn cảm thấy đó là một lỗi, Bạn có thể gửi một lỗi trong Kho lưu trữ hàng chục Github.
Hỗ trợ kéo căng

1
Đây chắc chắn là một lỗi, nhưng giờ nó đã được sửa trong TensorFlow 2.2
jlh

2

thay vì cung cấp một từ điển

weights = {'0': 42.0, '1': 1.0}

tôi đã thử một danh sách

weights = [42.0, 1.0]

và cảnh báo biến mất.


Cảm ơn người đàn ông! Tôi đã thử (không thành công) với từ điển. Bằng cách sử dụng danh sách, lỗi đã được sửa!
Victor Mondejar-Guerra

Trong khi điều này không có lỗi, đối với tôi, điều này phá vỡ trọng số cho mỗi lớp tạo ra kết quả tồi tệ hơn. Tôi sẽ kiểm tra tính nhất quán trước khi chuyển sang danh sách.
CanofDrink
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.