2016-09-27 5 views
0

私はテンソルフローと機械学習の初心者ですが、それより前の埋め込みレイヤでDNNをモデル化しようとしています。何らかの理由で私は費用の結果と正確さの罪の波を得続けます。私はここに、私のコードに問題があると想像:DNN埋め込みレイヤがsin波のコスト/精度を返す

これは私のモデルとトレーニングのルーチンです:

def neural_network_model(x): 
    W = tf.Variable(
     tf.truncated_normal([vocab_size, embedding_size], stddev=1/math.sqrt(vocab_size)), 
     name="W") 

    embedded = tf.nn.embedding_lookup(W, x)  
    embedding_aggregated = tf.reduce_sum(embedded, [1]) 

    hidden_1_layer = { 
     'weights': tf.Variable(tf.random_normal([embedding_size, n_nodes_hl1])), 
     'biases': tf.Variable(tf.random_normal([n_nodes_hl1])) 
    } 

    hidden_2_layer = { 
     'weights': tf.Variable(tf.random_normal([n_nodes_hl1, n_nodes_hl2])), 
     'biases': tf.Variable(tf.random_normal([n_nodes_hl2])) 
    }  

    hidden_3_layer = { 
     'weights': tf.Variable(tf.random_normal([n_nodes_hl2, n_nodes_hl3])), 
     'biases': tf.Variable(tf.random_normal([n_nodes_hl3]))   
    }  

    output = { 
     'weights': tf.Variable(tf.random_normal([n_nodes_hl3, n_classes])), 
     'biases': tf.Variable(tf.random_normal([n_classes])) 
    }  

    l1 = tf.matmul(embedding_aggregated, hidden_1_layer['weights']) + hidden_1_layer['biases'] 
    l1 = tf.nn.relu(l1) 

    l2 = tf.matmul(l1, hidden_2_layer['weights']) + hidden_2_layer['biases'] 
    l2 = tf.nn.relu(l2) 

    l3 = tf.matmul(l2, hidden_3_layer['weights']) + hidden_3_layer['biases'] 
    l3 = tf.nn.relu(l3)  

    output = tf.matmul(l3, output['weights']) + output['biases']   
    return output 

def train_neural_network(x_batch, y_batch, test_x, test_y): 
    global_step = tf.Variable(0, trainable=False, name='global_step')  

    logits = neural_network_model(x_batch) 
    cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits, y_batch)) 
    tf.scalar_summary('cost', cost) 
    optimizer = tf.train.AdagradOptimizer(0.01).minimize(cost, global_step = global_step) 

    test_logits = neural_network_model(test_x) 
    prediction = tf.nn.softmax(test_logits) 
    correct = tf.equal(tf.argmax(prediction, 1), tf.argmax(test_y, 1)) 
    accuracy = tf.reduce_mean(tf.cast(correct, tf.float32)) 
    tf.scalar_summary('accuracy', accuracy) 

    merged = tf.merge_all_summaries() 

    saver = tf.train.Saver() 
    model_dir = "model_embedding" 
    latest_checkpoint = tf.train.latest_checkpoint(model_dir) 

    with tf.Session() as sess:   
     train_writer = tf.train.SummaryWriter(model_dir + "/eval", sess.graph) 
     if (latest_checkpoint != None): 
      print("Restoring: ", latest_checkpoint) 
      saver.restore(sess, latest_checkpoint) 
     else: 
      print("Nothing to restore") 
      sess.run(tf.initialize_all_variables()) 

     coord = tf.train.Coordinator() 
     threads = tf.train.start_queue_runners(sess=sess, coord=coord) 
     try: 
      epoch = 1 
      while not coord.should_stop(): 
       epoch_loss = 0 

       _, c, summary = sess.run([optimizer, cost, merged]) 
       # embd = sess.run(emb) 
       # for idx in range(xb.size): 
       #  print(xb[idx]) 
       #  print(yb[idx]) 

       train_writer.add_summary(summary, global_step = global_step.eval()) 
       epoch_loss += c    

       print('Epoch', epoch, 'completed out of',hm_epochs,'loss:',epoch_loss) 
       print("Global step: ", global_step.eval()) 
       print('Accuracy:',accuracy.eval()) 
       #saver.save(sess, model_dir+'/model.ckpt', global_step=global_step) # default to last 5 checkpoint saves 

       epoch += 1 
     except tf.errors.OutOfRangeError: 
      print('Done training -- epoch limit reached') 
     finally:    
      coord.request_stop() 
      coord.join(threads) 
    sess.close() 

私のデータは、ワード整数IDの束がで均一に2056のサイズにパディングです末尾にパディングトークンが追加されるので、多くのテンソルは最後にvocab_size整数値の束を持っています。

私のコードは明らかに間違っていますか?

私のエラーがneural_network_model()機能を再利用するため、変数の新しいセットを作成していた。同じ問題に遭遇し、誰のために

答えて

1

。その答えは、変数を共有する方法を読むことにあります.TFは、Sharing Variables

関連する問題