2017-11-18 24 views
0

나는 tensorflow에 의해 tflearn의 lstm imdb example을 구현하고 있습니다.TFlearn 구현 imdb lstm 예 : tensorflow

tflearn 모델처럼 동일한 데이터 세트, 아키텍처 및 하이퍼 매개 변수 (포함 크기, 최대 길이 등)를 사용했지만 모델의 성능이 tflearn 예보다 좋지 않습니다 (10 기 이후, 내 모델에 약 52 % 정도의 정확도를 보였으 나 80 % 정도의 정확도를 보였다).

예제의 적절한 성능을 얻기 위해 몇 가지 조언을 해 주시면 감사하겠습니다.

import tensorflow as tf 
from tflearn.data_utils import to_categorical, pad_sequences 
from tflearn.datasets import imdb 
from tensorflow.contrib.rnn import BasicLSTMCell 
import time 



n_class = 2 
n_words = 10000 
EMBEDDING_SIZE = 128 
HIDDEN_SIZE = 128 
MAX_LENGTH = 100 
lr = 1e-3 

epoch = 10 
TRAIN_SIZE = 22500 
validation_size = 2500 
batch_size = 128 
KP = 0.8 

# IMDB Dataset loading 
train, test, _ = imdb.load_data(path='imdb.pkl', n_words=n_words, 
           valid_portion=0.1, sort_by_len=False) 
trainX, trainY = train 
validationX, validationY = test 
testX, testY = _ 


# Data preprocessing 
# Sequence padding 
trainX = pad_sequences(trainX, maxlen=MAX_LENGTH, value=0.) 
validationX = pad_sequences(validationX, maxlen=MAX_LENGTH, value=0.) 
testX = pad_sequences(testX, maxlen=MAX_LENGTH, value=0.) 

# Converting labels to binary vectors 
trainY = to_categorical(trainY, n_class) 
validationY = to_categorical(validationY, n_class) 
testY = to_categorical(testY, n_class) 

graph = tf.Graph() 
with graph.as_default(): 
    # input 
    text = tf.placeholder(tf.int32, [None, MAX_LENGTH]) 
    labels = tf.placeholder(tf.float32, [None, n_class]) 
    keep_prob = tf.placeholder(tf.float32) 

    embeddings_var = tf.Variable(tf.truncated_normal([n_words, EMBEDDING_SIZE]), trainable=True) 
    text_embedded = tf.nn.embedding_lookup(embeddings_var, text) 

    print(text_embedded.shape) # [batch_size, length, embedding_size] 
    word_list = tf.unstack(text_embedded, axis=1) 

    cell = BasicLSTMCell(HIDDEN_SIZE) 
    dropout_cell = tf.contrib.rnn.DropoutWrapper(cell, input_keep_prob=keep_prob, output_keep_prob=keep_prob) 
    outputs, encoding = tf.nn.static_rnn(dropout_cell, word_list, dtype=tf.float32) 

    logits = tf.layers.dense(outputs[-1], n_class, activation=None) 

    loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=logits, labels=labels)) 
    optimizer = tf.train.AdamOptimizer(lr).minimize(loss) 

    prediction = tf.argmax(logits, 1) 
    accuracy = tf.reduce_mean(tf.cast(tf.equal(prediction, tf.argmax(labels, 1)), tf.float32)) 


train_steps = epoch * TRAIN_SIZE // batch_size + 1 
print("Train steps: ", train_steps) 


with tf.Session(graph=graph) as sess: 
    tf.global_variables_initializer().run() 
    print("Initialized!") 
    s = time.time() 
    offset = 0 

    for step in range(train_steps): 
     offset = (offset * step) % (TRAIN_SIZE - batch_size) 
     batch_text = trainX[offset: offset + batch_size, :] 
     batch_label = trainY[offset: offset + batch_size, :] 
     fd = {text: batch_text, labels: batch_label, keep_prob: KP} 
     _, l, acc = sess.run([optimizer, loss, accuracy], feed_dict=fd) 

     if step % 100 == 0: 
      print("Step: %d loss: %f accuracy: %f" % (step, l, acc)) 

     if step % 500 == 0: 
      v_l, v_acc = sess.run([loss, accuracy], feed_dict={ 
       text: validationX, 
       labels: validationY, 
       keep_prob: 1.0 
      }) 
      print("------------------------------------------------") 
      print("Validation: step: %d loss: %f accuracy: %f" % (step, v_l, v_acc)) 
      print("------------------------------------------------") 
    print("Training finished, time consumed:", time.time() - s, " s") 
    print("Test accuracy: %f" % accuracy.eval(feed_dict={ 
     text: testX, 
     labels: testY, 
     keep_prob: 1.0 
    })) 

답변

0

미안 해요, 난 바보 같은 실수를 :

다음은 내 코드입니다! 손실 :

손실 = tf.reduce_mean (tf.nn.sigmoid_cross_entropy_with_logits (logits의 = logits의 라벨 = 라벨))

손실 = TF로되어있다 .reduce_mean (tf.nn.softmax_cross_entropy_with_logits (logits의 = logits의 라벨 = 상표))

후, 정확성은 같다 예를 들어