मैं tensorflow बैकएंड का उपयोग कर keras के लिए एक कस्टम नुकसान समारोह को लागू करने की कोशिश कर रहा हूँ। जिस विचार के साथ मैं काम कर रहा हूं वह "सिग्नल" की "लागत" को y_true के रूप में प्रदान करना है और सिग्नल को y_pred के रूप में संभालना है। यह मूल रूप से एक जटिल वर्गीकरण स्थिति है।

एक उदाहरण के रूप में मान लें कि मेरे पास 3 संभावित आउटपुट सिग्नल और एन नमूने हैं तो मेरे पास एक लागत मैट्रिक्स होगा जो कि एनएक्स 3 है और मेरी भविष्यवाणियां भी एनएक्स 3 होंगी (ताकि y_true और y_pred के साथ समस्याओं में एक ही आकार की आवश्यकता न हो।

जिस तरह से मैं अपने वास्तविक सिग्नल का चयन कर रहा हूं वह अधिकतम तीन आउटपुट मानों को लेकर है और फिर इस सिग्नल की लागत संबंधित इंडेक्स पर लागत मैट्रिक्स में मूल्य है। कुल लागत इन व्यक्तिगत लागतों का योग है।

मैंने इसे टेंसरफ़्लो में लागू किया है (मुझे इकट्ठा_एन्ड का उपयोग करने की आवश्यकता है, इसलिए मैं keras.backend का उपयोग नहीं कर सकता, लेकिन सभी उदाहरण जो मैंने ऑनलाइन पढ़े हैं, वे इस तथ्य की परवाह नहीं करते हैं)। मेरे कार्यान्वयन के लिए कोड है:

def maxSignalLossTF(costs, signals):

    signalChoices = tf.transpose(tf.stack((tf.to_int64(tf.range(tf.shape(signals)[0])), tf.argmax(signals, axis=1))))

    signalCosts = tf.gather_nd(costs, signalChoices)
    return tf.reduce_sum(signalCosts)

मैंने पुष्टि की है कि यह फ़ंक्शन numpy समकक्ष से तुलना करके अपेक्षा के अनुरूप काम कर रहा है। संकलन करते समय मैं इस नुकसान फ़ंक्शन को अपने मॉडल में पास कर रहा हूं:

model = Sequential()
model.add(Dense(250, input_shape=(trainX.shape[1],)))
model.add(Activation('relu'))
model.add(Dropout(0.1))

model.add(Dense(250))
model.add(Activation('relu'))

model.add(Dense(3))
model.add(Activation('linear'))
model.compile(optimizer='adam', loss=maxSignalLossTF)

यह सब तब तक ठीक काम करता है जब तक कि मैं मॉडल के साथ फिट करने की कोशिश नहीं करता:

    Traceback (most recent call last):
  File "tensortest.py", line 331, in <module>
    model.fit(TrainX, TrainY, epochs=100)
  File "/home/myname/anaconda2/lib/python2.7/site-packages/keras/models.py", line 845, in fit
    initial_epoch=initial_epoch)
  File "/home/myname/anaconda2/lib/python2.7/site-packages/keras/engine/training.py", line 1457, in fit
    self._make_train_function()
  File "/home/myname/anaconda2/lib/python2.7/site-packages/keras/engine/training.py", line 1001, in _make_train_function
    self.total_loss)
  File "/home/myname/anaconda2/lib/python2.7/site-packages/keras/optimizers.py", line 398, in get_updates
    m_t = (self.beta_1 * m) + (1. - self.beta_1) * g
  File "/home/myname/anaconda2/lib/python2.7/site-packages/tensorflow/python/ops/math_ops.py", line 856, in binary_op_wrapper
    y = ops.convert_to_tensor(y, dtype=x.dtype.base_dtype, name="y")
  File "/home/myname/anaconda2/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 611, in convert_to_tensor
    as_ref=False)
  File "/home/myname/anaconda2/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", line 676, in internal_convert_to_tensor
    ret = conversion_func(value, dtype=dtype, name=name, as_ref=as_ref)
  File "/home/myname/anaconda2/lib/python2.7/site-packages/tensorflow/python/framework/constant_op.py", line 121, in _constant_tensor_conversion_function
    return constant(v, dtype=dtype, name=name)
  File "/home/myname/anaconda2/lib/python2.7/site-packages/tensorflow/python/framework/constant_op.py", line 102, in constant
    tensor_util.make_tensor_proto(value, dtype=dtype, shape=shape, verify_shape=verify_shape))
  File "/home/myname/anaconda2/lib/python2.7/site-packages/tensorflow/python/framework/tensor_util.py", line 364, in make_tensor_proto
    raise ValueError("None values not supported.")
ValueError: None values not supported.

मैंने यह ट्रैक करने की कोशिश की कि यह संदेश केरस और टेंसरफ़्लो में कहाँ से आ रहा था, लेकिन जब मुझे फ़ंक्शंस मिले तो इससे मुझे यह पता नहीं चला कि मैं क्या गलत कर रहा हूँ। मैं अपने इनपुट एक्स और वाई पर tf.convert_to_tensor() का उपयोग करके मैन्युअल रूप से गणना करने के लिए पूरी तरह से हताशा से बाहर हूं, जिसमें कोई समस्या नहीं थी, इसलिए मैं इस बिंदु पर बहुत स्टंप हूं कि क्या गलत हो रहा है।

मैं केरस और टेंसरफ़्लो के लिए नया हूं और जब मैंने मूल रूप से हर उदाहरण को देखा है तो मुझे इसकी बहुत संभावना है कि मुझे कुछ बहुत आसान याद आ रहा है। तो किसी भी मदद की बहुत सराहना की जाती है। अग्रिम में धन्यवाद

इसके अलावा, अगर इस प्रकार की लागत के लिए पूर्व-निर्मित समाधान हैं, तो मुझे उनके बारे में जानकर खुशी होगी। मैं बिना किसी सफलता के कुछ अलग मानक विकल्पों के साथ छेड़छाड़ करने के बाद इस विचार के साथ आया था, इसलिए मैंने कुछ ऐसा करने की कोशिश करने का फैसला किया जो मुझे विभिन्न आउटपुट संकेतों को प्रोत्साहित करने पर अधिक प्रत्यक्ष नियंत्रण देगा जो अंतर्निहित समस्या को बेहतर ढंग से पकड़ते हैं (कुछ नमूनों का गलत वर्गीकरण नहीं है अन्य नमूनों का गलत वर्गीकरण जितना महत्वपूर्ण है)

0
Dennis Mckinnon 30 अक्टूबर 2017, 07:05

1 उत्तर

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

ऐसा इसलिए हो रहा है क्योंकि आपके मॉडल के वजन के संबंध में आपका नुकसान फ़ंक्शन अलग-अलग नहीं है।

आपका परिणाम पूरी तरह से "y_true" (जो "लागत" है) से आने वाले "स्थिरांक" पर आधारित है।

हालांकि यह सच है कि आप नुकसान फ़ंक्शन के परिणाम को बदल सकते हैं, यह बदलकर कि कौन से सिग्नल सबसे बड़े हैं, यह जानना असंभव है कि अलग-अलग कार्यों के बिना किस दिशा में जाना है।


सबसे पहले, मैं आपके फ़ंक्शन के प्रतिस्थापन के बारे में नहीं सोच सकता, और जो मैंने इसके बारे में समझा, वह यह है कि 3 परिणामों में से एक दूसरों की तुलना में बड़ा हो, स्वतंत्र रूप से उनके मूल्य क्या हैं। क्या वाकई आपकी यही मंशा है?

भूतपूर्व:

For a cost [1,4,2], any of the following signals are ok by your function:

[10,9,3]
[1,0,0]   
[10e+45,1,10e-12]
etc....

as long as the first one is greater, your loss is the lowest. 
0
Daniel Möller 30 अक्टूबर 2017, 15:17