मैं Tensorflow में आरएनएन को लागू करने की कोशिश कर रहा हूँ। मैं अभ्यास करने के लिए आरएनएन कोशिकाओं का उपयोग करने के बजाय अपने कार्यों को लिख रहा हूं।

समस्या अनुक्रम टैगिंग है, इनपुट आकार [32, 48, 900] है जहां 32 बैच आकार है, 48 समय कदम है और 900 शब्द शब्द का आकार है जो एक-हॉट एन्कोडेड वेक्टर है। आउटपुट [32, 48, 145] है जहां पहले दो आयाम इनपुट के समान हैं, लेकिन अंतिम आयाम आउटपुट शब्दावली आकार (एक-गर्म) है। मूल रूप से यह एक एनएलपी टैगिंग समस्या है।

मुझे निम्न त्रुटि मिल रही है:

InvalidArgumentError (ट्रेसबैक के लिए ऊपर देखें): लॉग और लेबल एक ही आकार के होने चाहिए: logits_size=[48,145] label_size=[1536,145]

वास्तविक लेबल_साइज़ [32, 48, 145] है लेकिन यह मेरे नियंत्रण के बिना पहले दो आयामों को मिला देता है। FYI करें 32*48 = 1536

यदि मैं अपना आरएनएन बैच आकार 1 के साथ चलाता हूं, तो यह अपेक्षा के अनुरूप ठीक काम करता है। मैं समझ नहीं पा रहा था कि इस मसले को कैसे सुलझाऊं। मुझे कोड की अंतिम पंक्ति में समस्या हो रही है।

मैंने कोड के संबंधित भाग को चिपकाया:

    inputs = tf.placeholder(shape=[None, self.seq_length, self.vocab_size], dtype=tf.float32, name="inputs")
    targets = tf.placeholder(shape=[None, self.seq_length, self.output_vocab_size], dtype=tf.float32, name="targets")
    init_state = tf.placeholder(shape=[1, self.hidden_size], dtype=tf.float32, name="state")

    initializer = tf.random_normal_initializer(stddev=0.1)

    with tf.variable_scope("RNN") as scope:
        hs_t = init_state
        ys = []
        for t, xs_t in enumerate(tf.split(inputs[0], self.seq_length, axis=0)):
            if t > 0: scope.reuse_variables()
            Wxh = tf.get_variable("Wxh", [self.vocab_size, self.hidden_size], initializer=initializer)
            Whh = tf.get_variable("Whh", [self.hidden_size, self.hidden_size], initializer=initializer)
            Why = tf.get_variable("Why", [self.hidden_size, self.output_vocab_size], initializer=initializer)
            bh = tf.get_variable("bh", [self.hidden_size], initializer=initializer)
            by = tf.get_variable("by", [self.output_vocab_size], initializer=initializer)

            hs_t = tf.tanh(tf.matmul(xs_t, Wxh) + tf.matmul(hs_t, Whh) + bh)
            ys_t = tf.matmul(hs_t, Why) + by
            ys.append(ys_t)

    hprev = hs_t
    output_softmax = tf.nn.softmax(ys)  # Get softmax for sampling

    #outputs = tf.concat(ys, axis=0)
    loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=targets, logits=ys))
2
alan turing 6 जुलाई 2017, 02:42

1 उत्तर

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

समस्या ys के आकार में आ सकती है, y का आकार [32, 48, 145] होना चाहिए, लेकिन आउटपुट ys का आकार केवल [48,145] है, इसलिए यदि बैचसाइज़ 1 है, तो टैगेट का आकार है [ 1, 48, 145], जो कि आयामीता में कमी के बाद [48,145] के समान आकार का है।

समस्या को हल करने के लिए आप बैचसाइज़ (इनपुट्स [0]) से निपटने के लिए एक लूप जोड़ सकते हैं:

जैसे कि :

for i in range(inputs.getshape(0)):
   for t, xs_t in enumerate(tf.split(inputs[i], self.seq_length, axis=0)):
0
ycd 6 जुलाई 2017, 04:09
धन्यवाद, इसने समस्या को हल कर दिया, लेकिन सिंटैक्स निम्न जैसा है: मैं श्रेणी में (inputs.get_shape()[0])
 – 
alan turing
6 जुलाई 2017, 18:40