2015-07-09 6 views
5

मेरे पास probs.shape = (max_time, num_batches, num_labels) के साथ एक टेंसर probs है।टेंसर के लिए थेनो उन्नत इंडेक्सिंग, साझा सूचकांक

और मेरे पास targetstargets.shape = (max_seq_len, num_batches) के साथ एक टेंसर है जहां मान लेबल इंडेक्स हैं, यानी probs में तीसरे आयाम के लिए।

अब मैं probs.shape = (max_time, num_batches, max_seq_len) के साथ एक टेंसर प्राप्त करना चाहता हूं जहां तीसरा आयाम targets में सूचकांक है। मूल रूप से

probs_y[:,i,:] = probs[:,i,targets[:,i]] 

सभी 0 <= i < num_batches के लिए।

मैं इसे कैसे प्राप्त कर सकता हूं?

समाधान के साथ एक समान समस्या here पोस्ट की गई थी।

वहाँ समाधान है, अगर मैं सही ढंग से समझ, होगा:

probs_y = probs[:,T.arange(targets.shape[1])[None,:],targets] 

लेकिन वह काम करने के लिए प्रतीत नहीं होता। मुझे मिलता है: IndexError: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices

इसके अलावा, अस्थायी T.arange थोड़ा महंगा नहीं है? Esp जब मैं वास्तव में इसे एक पूर्ण घना पूर्णांक सरणी बनाकर काम करने की कोशिश करता हूं। एक बेहतर तरीका होना चाहिए।

शायद theano.map? लेकिन जहां तक ​​मैं समझता हूं, वह कोड को समानांतर नहीं करता है, इसलिए यह समाधान भी नहीं है।

+0

बस एहसास हुआ कि मैंने आपकी लाइन से अलग-अलग किया है कि मैंने अक्षरों को 'टी। तारेंज' और 'लक्ष्य' दोनों में स्थानांतरित किया है। यह अजीब है। आपके मामले में भी काम करना चाहिए था। – eickenberg

+0

ठीक है, जिस तरह से आप इसे करते हैं, वह भी काम करता है, मैंने अपना जवाब अपडेट किया। तो समस्या कहीं और है। या तो थानो संस्करण या कुछ इस विशिष्ट ऑपरेशन से संबंधित नहीं है - हालांकि त्रुटि संदेश दिया गया है, बाद वाला असंभव प्रतीत होता है। – eickenberg

उत्तर

3

यह मेरे लिए काम करता है:

import theano 
import theano.tensor as T 

max_time, num_batches, num_labels = 3, 4, 6 
max_seq_len = 5 

probs_ = np.arange(max_time * num_batches * num_labels).reshape(
    max_time, num_batches, num_labels) 

targets_ = np.arange(num_batches * max_seq_len).reshape(max_seq_len, 
    num_batches) % (num_batches - 1) # mix stuff up 

probs, targets = map(theano.shared, (probs_, targets_)) 

print probs_ 
print targets_ 

probs_y = probs[:, T.arange(targets.shape[1])[:, np.newaxis], targets.T] 

print probs_y.eval() 

ऊपर अपने सूचकांकों की एक स्थानांतरित संस्करण का उपयोग किया। आपका सटीक प्रस्ताव भी

probs_y2 = probs[:, T.arange(targets.shape[1])[np.newaxis, :], targets] 

print probs_y2.eval() 
print (probs_y2.dimshuffle(0, 2, 1) - probs_y).eval() 

तो शायद आपकी समस्या कहीं और है।

गति के लिए, मुझे इस बात की हानि है कि इससे क्या तेज हो सकता है। map, जो scan का विशेषज्ञता है निश्चित रूप से निश्चित रूप से नहीं है। मुझे नहीं पता कि arange वास्तव में कितनी हद तक पुनर्निर्मित की बजाय बनाया गया है।

+1

धन्यवाद, मेरा उदाहरण वास्तव में भी काम करता है। मेरे टेस्ट कोड में, 'probs' गलती से अभी भी एक' numpy.ndarray' था। : पी – Albert

+0

आहा ठीक है - मैंने यह भी पहले किया होगा, क्योंकि त्रुटि संदेश बहुत परिचित लग रहा था। – eickenberg

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