मैं केरस में कंक्रीट ड्रॉपआउट के कार्यान्वयन को https में पोर्ट करने का प्रयास कर रहा हूं ://github.com/yaringal/ConcreteDropout/blob/master/concrete-dropout-keras.ipynb से tensorflow 2. यह अधिकतर सीधा है, क्योंकि tf 2 में अधिकांश keras API अंतर्निहित हैं। हालांकि, फिटिंग से पहले कस्टम लॉस को क्लियर किया जा रहा है।

मॉडल को परिभाषित करने के बाद, और इसे संकलित करने से पहले, मैं देख सकता हूं कि प्रत्येक कंक्रीट ड्रॉपआउट परत के नुकसान को मॉडल के नुकसान में जोड़ा गया है self.layer.add_loss(regularizer) जब परतें बनाई जाती हैं:

>>> print(model.losses)
[<tf.Tensor: id=64, shape=(), dtype=float32, numpy=-8.4521576e-05>, <tf.Tensor: id=168, shape=(), dtype=float32, numpy=-0.000650166>, <tf.Tensor: id=272, shape=(), dtype=float32, numpy=-0.000650166>, <tf.Tensor: id=376, shape=(), dtype=float32, numpy=-0.000650166>, <tf.Tensor: id=479, shape=(), dtype=float32, numpy=-0.000650166>]

हालांकि, संकलन के बाद, model.losses एक खाली सूची बन जाती है, और अभिकथन assert len(model.losses) == 5 विफल हो जाता है। अगर मैं दावे को अनदेखा करना चुनता हूं, तो यह तथ्य कि परत के नुकसान की उपेक्षा की जा रही है, मॉडल को प्रशिक्षित करते समय चेतावनी WARNING:tensorflow:Gradients do not exist for variables ['concrete_dropout/p_logit:0', 'concrete_dropout_1/p_logit:0', 'concrete_dropout_2/p_logit:0', 'concrete_dropout_3/p_logit:0', 'concrete_dropout_4/p_logit:0'] when minimizing the loss. में दिखाई देता है।

https://github.com/tensorflow/tensorflow/blob/r2.0/tensorflow/python/keras/engine/training.py#L184 मेरा मानना ​​है कि समस्याग्रस्त रेखाएं हैं

    # Clear any `_eager_losses` that was added.
    self._clear_losses()

यह मॉडल संकलन पर क्यों किया जा रहा है? और अगर यह ऐसा करने का तरीका नहीं है, तो मैं टेंसरफ़्लो 2 में प्रति परत नुकसान कैसे जोड़ सकता हूं?

2
user121664 12 अप्रैल 2020, 01:13

1 उत्तर

सबसे बढ़िया उत्तर

चूंकि कस्टम नुकसान मॉडल के इनपुट पर निर्भर नहीं है, इसलिए आपको इसे शून्य-तर्क कॉल करने योग्य का उपयोग करके जोड़ना चाहिए:

self.layer.add_loss(lambda: regularizer)
1
today 23 अप्रैल 2020, 02:08