5

मैं टेंसरफ्लो tf.nn.embedding_lookup() फ़ंक्शन के माध्यम से "स्क्रैच से" आईएमडीबी डेटासेट के शब्द का प्रतिनिधित्व सीखने की कोशिश कर रहा हूं। अगर मैं इसे सही ढंग से समझता हूं, तो मुझे दूसरी छिपी हुई परत से पहले एक एम्बेडिंग परत स्थापित करनी होगी, और फिर जब मैं ग्रेडियेंट वंश का प्रदर्शन करता हूं, तो परत इस परत के वजन में एक शब्द का प्रतिनिधित्व "सीख" लेगी। हालांकि, जब मैं ऐसा करने का प्रयास करता हूं, तो मुझे अपने एम्बेडिंग परत और मेरे नेटवर्क की पहली पूर्ण-कनेक्ट परत के बीच एक आकृति त्रुटि मिलती है।Tensorflow एम्बेडिंग_lookup

def multilayer_perceptron(_X, _weights, _biases): 
    with tf.device('/cpu:0'), tf.name_scope("embedding"): 
     W = tf.Variable(tf.random_uniform([vocab_size, embedding_size], -1.0, 1.0),name="W") 
     embedding_layer = tf.nn.embedding_lookup(W, _X)  
    layer_1 = tf.nn.sigmoid(tf.add(tf.matmul(embedding_layer, _weights['h1']), _biases['b1'])) 
    layer_2 = tf.nn.sigmoid(tf.add(tf.matmul(layer_1, _weights['h2']), _biases['b2'])) 
    return tf.matmul(layer_2, weights['out']) + biases['out'] 

x = tf.placeholder(tf.int32, [None, n_input]) 
y = tf.placeholder(tf.float32, [None, n_classes]) 

pred = multilayer_perceptron(x, weights, biases) 
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(pred,y)) 
train_step = tf.train.GradientDescentOptimizer(0.3).minimize(cost) 

init = tf.initialize_all_variables() 

त्रुटि मैं मिलता है:

ValueError: Shapes TensorShape([Dimension(None), Dimension(300), Dimension(128)]) 
and TensorShape([Dimension(None), Dimension(None)]) must have the same rank 

उत्तर

15

आकार त्रुटि पैदा होती है क्योंकि आप एक दो आयामी एम्बेडिंग टेन्सर W में एक दो आयामी टेन्सर, x सूचकांक करने के लिए प्रयोग कर रहे हैं। tf.nn.embedding_lookup() (और इसके करीबी चचेरे भाई tf.gather()) के बारे में सोचेंमें प्रत्येक पूर्णांक मान i लेते हुए और इसे W[i, :] पंक्ति के साथ बदल दें। त्रुटि संदेश से, कोई उस n_input = 300 और embedding_size = 128 का अनुमान लगा सकता है। आम तौर पर, tf.nn.embedding_lookup() का परिणाम rank(x) + rank(W) - 1 और नरक के बराबर आयामों की संख्या; इस मामले में, 3. त्रुटि तब उत्पन्न होती है जब आप _weights['h1'] द्वारा इस परिणाम को गुणा करने का प्रयास करते हैं, जो एक (द्वि-आयामी) मैट्रिक्स है।

इस कोड को ठीक करने के लिए, यह उस पर निर्भर करता है कि आप क्या करने का प्रयास कर रहे हैं, और आप एम्बेडिंग में इनपुट के मैट्रिक्स में क्यों जा रहे हैं। एक सामान्य बात यह है कि कुल प्रत्येक इनपुट उदाहरण के लिए एम्बेडेड वैक्टर tf.reduce_sum() जैसे ऑपरेशन का उपयोग करके प्रति पंक्ति एक पंक्ति में एम्बेडिंग वैक्टर है। उदाहरण के लिए, आप निम्न कार्य कर सकता है:

W = tf.Variable(
    tf.random_uniform([vocab_size, embedding_size], -1.0, 1.0) ,name="W") 
embedding_layer = tf.nn.embedding_lookup(W, _X) 

# Reduce along dimension 1 (`n_input`) to get a single vector (row) 
# per input example. 
embedding_aggregated = tf.reduce_sum(embedding_layer, [1]) 

layer_1 = tf.nn.sigmoid(tf.add(tf.matmul(
    embedding_aggregated, _weights['h1']), _biases['b1'])) 
+1

धन्यवाद! मुझे लगता है कि tf.nn.reduce_sum tf.reduce_sum होना चाहिए? जब आप एम्बेडिंग परत के आयाम को कम करना चुनते हैं, तो आपने "n_input = 300" और "embedding_size = 128" के बीच को कम करने के लिए कैसे चुना? – nicolasdavid

+2

आप टाइपो के बारे में सही हैं - इसे ऊपर सही किया गया, धन्यवाद! मैंने 'n_input' आयाम के साथ कम करना चुना क्योंकि यह अधिक संभावना है कि इससे आपकी समस्या का सामना होगा, और मुझे लगता है कि (उदा।) इनपुट का क्रम महत्वपूर्ण नहीं था। बैग-ऑफ-शब्द प्रकार की समस्याओं के लिए ऐसा करना काफी आम है। आप * एम्बेडिंग_साइज 'के साथ कम कर सकते हैं लेकिन मुझे लगता है कि एम्बेडिंग से बहुत सारी जानकारी खो जाएगी, इसलिए शायद यह भी काम नहीं करेगा। – mrry

0

एक अन्य संभावित समाधान है: embedding वैक्टर जोड़ने के बजाय, एक भी वेक्टर में इन वैक्टर जोड़ और छिपी परत में न्यूरॉन्स की संख्या में वृद्धि।
मैं प्रयोग किया है:
embedding_aggregated = tf.reshape(embedding_layer, [-1, embedding_size * sequence_length])
इसके अलावा, मैं embedding_size * sequence_length को छिपी परत में न्यूरॉन्स की संख्या बदल दिया है। निरीक्षण: अतिरिक्तता के बजाय concatenation का उपयोग करने पर भी शुद्धता में सुधार हुआ।