इस प्रश्न के अनुसार, मैंने सीखा कि class_weight में keras प्रशिक्षण के दौरान भारित हानि लागू कर रहा है, और sample_weight नमूना-वार कुछ कर रहा है यदि मुझे सभी प्रशिक्षण नमूनों में समान विश्वास नहीं है।

तो मेरे सवाल होंगे,

  1. क्या सत्यापन के दौरान होने वाली हानि को class_weight द्वारा भारित किया जाता है, या क्या यह केवल प्रशिक्षण के दौरान भारित होता है?
  2. मेरे डेटासेट में 2 वर्ग हैं, और मेरे पास वास्तव में गंभीर रूप से असंतुलित वर्ग वितरण नहीं है। अनुपात लगभग है। 1.7 : 1. क्या नुकसान को संतुलित करने के लिए class_weight का उपयोग करना या ओवरसैंपलिंग का उपयोग करना आवश्यक है? क्या सामान्य डेटासेट के रूप में थोड़ा असंतुलित डेटा छोड़ना ठीक है?
  3. क्या मैं केवल sample_weight को ट्रेन के प्रत्येक नमूने को दिए गए भार के रूप में मान सकता हूं? और मेरे ट्रेनिग नमूनों को समान विश्वास के साथ माना जा सकता है, इसलिए शायद मुझे इसका उपयोग करने की आवश्यकता नहीं है।
2
yujuezhao 22 अगस्त 2019, 16:45

1 उत्तर

सबसे बढ़िया उत्तर
  1. केरस प्रलेखन से यह कहता है

class_weight: वैकल्पिक डिक्शनरी मैपिंग क्लास इंडेक्स (पूर्णांक) से एक वज़न (फ्लोट) मान, जिसका उपयोग हानि फ़ंक्शन (केवल प्रशिक्षण के दौरान) को भारित करने के लिए किया जाता है। यह मॉडल को कम प्रतिनिधित्व वाले वर्ग के नमूनों पर "अधिक ध्यान देने" के लिए बताने के लिए उपयोगी हो सकता है।

तो class_weight केवल प्रशिक्षण के दौरान होने वाले नुकसान को प्रभावित करता है। मुझे स्वयं यह समझने में दिलचस्पी रही है कि परीक्षण और प्रशिक्षण के दौरान कक्षा और नमूना भार को कैसे संभाला जाता है। केरस जीथब रेपो और मेट्रिक और लॉस के लिए कोड को देखकर ऐसा नहीं लगता कि न तो नुकसान हुआ है और न ही मेट्रिक पर इनका असर है। प्रशिक्षण कोड जैसे model.fit() और इसके संबंधित टेंसरफ़्लो बैकएंड प्रशिक्षण कार्यों में मुद्रित मूल्यों को ट्रैक करना काफी कठिन है। इसलिए मैंने संभावित परिदृश्यों का परीक्षण करने के लिए एक परीक्षण कोड बनाने का निर्णय लिया, नीचे दिए गए कोड को देखें। निष्कर्ष यह है कि class_weight और sample_weight दोनों ही केवल प्रशिक्षण हानि को प्रभावित करते हैं, किसी भी मेट्रिक्स या सत्यापन हानि पर कोई प्रभाव नहीं पड़ता है। val_sample_weights (जिसे आप निर्दिष्ट कर सकते हैं) के रूप में थोड़ा आश्चर्यजनक लगता है कि कुछ भी नहीं (??)

  1. इस प्रकार का प्रश्न हमेशा आपकी समस्या पर निर्भर करता है कि तिथि कितनी विषम है और आप किस तरह से मॉडल को अनुकूलित करने का प्रयास करते हैं। क्या आप सटीकता के लिए अनुकूलन कर रहे हैं, तब तक जब तक प्रशिक्षण डेटा समान रूप से तिरछा होता है जब मॉडल उत्पादन में होता है, तो सबसे अच्छा परिणाम बिना किसी अधिक/अंडर नमूने और/या वर्ग भार के बिना प्रशिक्षण प्राप्त किया जाएगा। अगर दूसरी तरफ आपके पास कुछ ऐसा है जहां एक वर्ग दूसरे की तुलना में अधिक महत्वपूर्ण (या महंगा) है तो आपको डेटा को भारित करना चाहिए। उदाहरण के लिए धोखाधड़ी की रोकथाम में, जहां धोखाधड़ी आमतौर पर गैर-धोखाधड़ी की आय की तुलना में बहुत अधिक महंगी होती है। मेरा सुझाव है कि आप बिना भार वाली कक्षाओं, भारित वर्गों और कुछ अंडर/ओवर-सैंपलिंग को आज़माएं और जांचें कि कौन सा सत्यापन परिणाम सर्वोत्तम देता है। एक सत्यापन फ़ंक्शन का उपयोग करें (या अपना खुद का लिखें) जो विभिन्न मॉडलों की तुलना करेगा (उदाहरण के लिए, वास्तविक-सकारात्मक, गलत-सकारात्मक, सच्चे-नकारात्मक और झूठे-नकारात्मक अलग-अलग लागत पर निर्भर)। एक अपेक्षाकृत नया नुकसान-फ़ंक्शन जिसने विषम डेटा पर कागल प्रतियोगिताओं में शानदार परिणाम दिखाया है, वह है Focal-lossFocal-loss अधिक/अंडर-सैंपलिंग की आवश्यकता को कम करता है। दुर्भाग्य से Focal-loss केरस (अभी तक) में एक अंतर्निहित इन फ़ंक्शन नहीं है, लेकिन इसे मैन्युअल रूप से प्रोग्राम किया जा सकता है।

  2. हाँ मुझे लगता है कि तुम सही हो। मैं आमतौर पर दो कारणों से sample_weight का उपयोग करता हूं। 1, प्रशिक्षण डेटा में किसी प्रकार की माप अनिश्चितता होती है, जिसे यदि ज्ञात हो तो गलत माप से अधिक सटीक डेटा को भारित करने के लिए उपयोग किया जा सकता है। या 2, हम पुराने डेटा की तुलना में नए डेटा को अधिक महत्व दे सकते हैं, जिससे मॉडल को मूल्यवान पुराने डेटा को अनदेखा किए बिना नए व्यवहार के लिए अधिक तेज़ी से अनुकूलित करने के लिए मजबूर किया जा सकता है।

मॉडल और बाकी सब कुछ स्थिर रखते हुए class_weights और sample_weights के साथ और बिना तुलना करने के लिए कोड।

import tensorflow as tf
import numpy as np

data_size = 100
input_size=3
classes=3

x_train = np.random.rand(data_size ,input_size)
y_train= np.random.randint(0,classes,data_size )
#sample_weight_train = np.random.rand(data_size)
x_val = np.random.rand(data_size ,input_size)
y_val= np.random.randint(0,classes,data_size )
#sample_weight_val = np.random.rand(data_size )

inputs = tf.keras.layers.Input(shape=(input_size))
pred=tf.keras.layers.Dense(classes, activation='softmax')(inputs)

model = tf.keras.models.Model(inputs=inputs, outputs=pred)

loss = tf.keras.losses.sparse_categorical_crossentropy
metrics = tf.keras.metrics.sparse_categorical_accuracy

model.compile(loss=loss , metrics=[metrics], optimizer='adam')

# Make model static, so we can compare it between different scenarios
for layer in model.layers:
    layer.trainable = False

# base model no weights (same result as without class_weights)
# model.fit(x=x_train,y=y_train, validation_data=(x_val,y_val))
class_weights={0:1.,1:1.,2:1.}
model.fit(x=x_train,y=y_train, class_weight=class_weights, validation_data=(x_val,y_val))
# which outputs:
> loss: 1.1882 - sparse_categorical_accuracy: 0.3300 - val_loss: 1.1965 - val_sparse_categorical_accuracy: 0.3100

#changing the class weights to zero, to check which loss and metric that is affected
class_weights={0:0,1:0,2:0}
model.fit(x=x_train,y=y_train, class_weight=class_weights, validation_data=(x_val,y_val))
# which outputs:
> loss: 0.0000e+00 - sparse_categorical_accuracy: 0.3300 - val_loss: 1.1945 - val_sparse_categorical_accuracy: 0.3100

#changing the sample_weights to zero, to check which loss and metric that is affected
sample_weight_train = np.zeros(100)
sample_weight_val = np.zeros(100)
model.fit(x=x_train,y=y_train,sample_weight=sample_weight_train, validation_data=(x_val,y_val,sample_weight_val))
# which outputs:
> loss: 0.0000e+00 - sparse_categorical_accuracy: 0.3300 - val_loss: 1.1931 - val_sparse_categorical_accuracy: 0.3100

भारित और भारित डेटा के लिए अलग-अलग बैकएंड फ़ंक्शन का उपयोग करके फिट होने के कारण या गोलाई त्रुटि के कारण वजन का उपयोग करने और नहीं (यहां तक ​​​​कि जब सभी वजन एक हैं) के बीच कुछ छोटे विचलन हैं?

3
KrisR89 22 अगस्त 2019, 17:20