मैंने इसे https://www.tensorflow.org/guide/keras/custom_callback पढ़ा , लेकिन मुझे नहीं पता कि मैं अन्य सभी पैरामीटर कैसे प्राप्त कर सकता हूं।

यह मेरा कोड है

 (hits, ndcgs) = evaluate_model(model, testRatings, testNegatives, topK, evaluation_threads)
  hr, ndcg, loss = np.array(hits).mean(), np.array(ndcgs).mean(), hist.history['loss'][0]
  print('Iteration %d [%.1f s]: HR = %.4f, NDCG = %.4f, loss = %.4f [%.1f s]' 
                  % (epoch,  t2-t1, hr, ndcg, loss, time()-t2))
 if hr > best_hr:
     best_hr, best_ndcg, best_iter = hr, ndcg, epoch
 if args.out > 0:
     model.save(model_out_file, overwrite=True)

जैसा कि आप देख सकते हैं मुझे model, hist और model.save की आवश्यकता है। कस्टम कॉलबैक में इन तीन पैरामीटर का उपयोग करने का कोई तरीका है? ताकि मैं यह सब एक कस्टम कॉलबैक में लिख सकूं।

class CustomCallback(keras.callbacks.Callback):

   def on_epoch_end(self, logs=None):
       keys = list(logs.keys())
       print("Stop training; got log keys: {}".format(keys))
0
Ella 15 पद 2020, 11:01

1 उत्तर

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

मॉडल एक tf.keras.callbacks.Callback, ताकि आप इसे सीधे self.model से एक्सेस कर सकें। नुकसान के मूल्य तक पहुँचने के लिए, आप "लॉग्स" ऑब्जेक्ट का उपयोग कर सकते हैं जो tf.keras.callbacks.Callback के तरीके, जिसमें "लॉस" नाम की एक कुंजी होगी।

यदि आपको अन्य चरों तक पहुंच की आवश्यकता है (जो प्रशिक्षण के दौरान नहीं बदलेगा), तो आप उन्हें अपने कॉलबैक के आवृत्ति चर के रूप में सेट कर सकते हैं, और __init__ फ़ंक्शन को परिभाषित करके कॉलबैक के निर्माण के दौरान उन्हें जोड़ सकते हैं।

class CustomCallback(keras.callbacks.Callback):
   def __init__(self, testRatings, testNegatives, topK, evaluation_threads):
       super().__init__()
       self.testRatings = testRatings
       self.testNegatives = testNegatives
       self.topK = topK
       self.evaluation_threads = evaluation_threads

   def on_epoch_end(self, epoch, logs=None):
       logs = logs or {}
       current_loss = logs.get("loss")
       if current_loss:
           print("my_loss: ", current_loss)
       print("my_model", self.model)
       # the attributes are accessble with self
       print("my topK atributes", self.topK)

# you can then create the callback by passing the correct attributes
my_callback = CustomCallback(testRatings, testNegatives, topK, evaluation_threads)

ध्यान दें: यदि आप प्रत्येक युग के बीच मॉडल का मूल्यांकन करना चाहते हैं, और यदि मॉडल को सर्वश्रेष्ठ मीट्रिक मिले हैं तो मॉडल को सहेजना है, तो मेरा सुझाव है कि आप इसे देखें:

  • fit फ़ंक्शन, जहां आप वास्तव में एक परीक्षण सेट प्रदान कर सकते हैं
  • मेट्रिक्स मॉड्यूल, जो ऐसे मेट्रिक्स प्रदान करता है ट्रेन और परीक्षण सेट पर गणना की गई
  • ModelCheckpoint कॉलबैक, जो save_best_only विकल्प प्रदान करने पर सर्वोत्तम भार रखते हुए, प्रत्येक युग में मॉडल
2
Lescurel 15 पद 2020, 17:28
आपका बहुत बहुत धन्यवाद! तो self model है? क्या मैं model को भी सहेज सकता हूं और model प्राप्त कर सकता हूं? और मैं क्षमा चाहता हूं कि एक युग के हर छोर पर कोड को ऐसा करना चाहिए।
 – 
Ella
15 पद 2020, 13:03
1
आप इसे प्रत्येक युग में करने के लिए on_epoch_end विधि को परिभाषित कर सकते हैं। self एक कीवर्ड है जो ऑब्जेक्ट का संदर्भ देता है, पायथन देखें दस्तावेज़ीकरण, इसलिए उस स्थिति में, यह कॉलबैक ऑब्जेक्ट का संदर्भ देता है। यदि आप मॉडल को सहेजना चाहते हैं, तो आप विशेषता के माध्यम से मॉडल तक पहुंच सकते हैं, इसलिए self.model.save("/path/to/saved_model") चाल चलेगा।
 – 
Lescurel
15 पद 2020, 13:17
उत्तर के लिए बहुत धन्यवाद! क्या कॉलबैक में पैरामीटर पास करने का विकल्प भी है? उदाहरण के लिए, मैं यहां testRatings, testNegatives, topK, evaluation_threads का उपयोग कर रहा हूं। क्या इसे कॉलबैक पर पास किया जा सकता है?
 – 
Ella
15 पद 2020, 13:50
1
हां, आप इसे अपने कॉलबैक के __init__ फंक्शन (कंस्ट्रक्टर) में पास कर सकते हैं। वे "उदाहरण चर" के रूप में सुलभ होंगे, आप इसके बारे में पायथन दस्तावेज़ीकरण
 – 
Lescurel
15 पद 2020, 13:55
धन्यवाद, मैंने इसके बारे में पढ़ा। दुर्भाग्य से, मैं इसे सही नहीं समझता। क्या आप कृपया मुझे एक कोड उदाहरण दिखा सकते हैं?
 – 
Ella
15 पद 2020, 14:27