2016-05-16 20 views
8

में सॉफ्टमैक्स आउटपुट के तापमान को कैसे बदलें, मैं वर्तमान में निम्न आलेख के परिणामों को पुन: उत्पन्न करने का प्रयास कर रहा हूं।
http://karpathy.github.io/2015/05/21/rnn-effectiveness/
मैं थानो बैकएंड के साथ केरा का उपयोग कर रहा हूं। लेख में वह विभिन्न आउटपुट देने के लिए अंतिम सॉफ्टमैक्स परत के तापमान को नियंत्रित करने के बारे में बात करता है।केरास

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

मेरा मॉडल निम्नानुसार है।

model = Sequential() 
model.add(LSTM(128, batch_input_shape = (batch_size, 1, 256), stateful = True, return_sequences = True)) 
model.add(LSTM(128, stateful = True)) 
model.add(Dropout(0.1)) 
model.add(Dense(256, activation = 'softmax')) 

model.compile(optimizer = Adam(), 
       loss = 'categorical_crossentropy', 
       metrics = ['accuracy']) 

एक ही रास्ता मैं अंतिम घने परत के तापमान को समायोजित करने के लिए वजन मैट्रिक्स हो और तापमान से गुणा किया जाएगा सोच सकते हैं। क्या किसी को ऐसा करने का बेहतर तरीका पता है? अगर कोई मॉडल को सेटअप करने के तरीके में कुछ भी गलत देखता है तो मुझे बताएं क्योंकि मैं आरएनएन के लिए नया हूं।

उत्तर

7

वैसे ऐसा लगता है कि तापमान कुछ ऐसा है जो आप सॉफ्टमैक्स परत के आउटपुट में करते हैं। मुझे यह उदाहरण मिला।

https://github.com/fchollet/keras/blob/master/examples/lstm_text_generation.py

वह निम्नलिखित समारोह नरम अधिकतम उत्पादन नमूने के लिए लागू होता है।

def sample(a, temperature=1.0): 
    # helper function to sample an index from a probability array 
    a = np.log(a)/temperature 
    a = np.exp(a)/np.sum(np.exp(a)) 
    return np.argmax(np.random.multinomial(1, a, 1)) 
+1

क्या अंतिम 'np.random.choice (लेन (ए), पी = ए) से अलग है? – danijar

+0

यह तापमान के साथ मानक सॉफ्टमैक्स नहीं है जैसा कि यहां परिभाषित किया गया है: https: //en.wikipedia.org/wiki/Softmax_function (सुदृढीकरण सीखने के अनुभाग में)। तापमान से विभाजित होने से पहले एक लॉग लागू क्यों किया जा रहा है? –

0

@ chasep255 से उत्तर ठीक काम करता है लेकिन आपको लॉग (0) के कारण चेतावनियां मिलेंगी। आप आपरेशन ई^लॉग (क)/टी = एक^(1/टी) को आसान बनाने में कर सकते हैं और लॉग

def sample(a, temperature=1.0): 
    a = np.array(a)**(1/temperature) 
    p_sum = a.sum() 
    sample_temp = a/p_sum 
    return np.argmax(np.random.multinomial(1, sample_temp, 1)) 

आशा है कि यह मदद करता है से छुटकारा पाने के!

+1

मुझे लगता है कि आपका मतलब है ई^(लॉग (ए)/टी) = ए^(1/टी) – Visionscaper

+1

@ विजनसेपर हाँ, धन्यवाद! बस इसे ठीक किया – Julian

संबंधित मुद्दे