2

已更新:

我正在爲我的最終項目建立一個神經網絡,我需要一些幫助。Tensorflow lstm用於情感分析而不學習。已更新

我正在嘗試構建一個rnn來對西班牙文本進行情感分析。我有20萬左右標記的鳴叫,我使用word2vec與西班牙嵌入

數據集&矢量矢量其中:

  • 我刪除重複和分裂成集訓練和測試集。
  • 向量化時應用填充,未知和句子結束標記。
  • 我將@mentions映射到word2vec模型中的已知名稱。例如:@iamthebest => 「約翰」

我的模型:

  • 我的數據張量具有形狀=(的batch_size,20,300)。我有3類:中性,正面和負面,所以我的目標張量形狀=(batch_size,3)
  • 我使用BasicLstm單元格和動態rnn來建立網絡。
  • 我使用Adam Optimizer和softmax_cross entropy進行損失計算
  • 我使用一個丟棄包裝來減少過度擬合。

最後運行:

  • 我曾嘗試用不同的配置和他們的非似乎工作。
  • 最後設置:2層,512批次大小,15個紀元和lr的0.001。

Accuracy

Loss

我的弱點:

IM擔心最後一層和最終狀態在dynamic_rnn

代碼移交:

# set variables 
num_epochs = 15 
tweet_size = 20 
hidden_size = 200 
vec_size = 300 
batch_size = 512 
number_of_layers= 1 
number_of_classes= 3 
learning_rate = 0.001 

TRAIN_DIR="/checkpoints" 

tf.reset_default_graph() 

# Create a session 
session = tf.Session() 

# Inputs placeholders 
tweets = tf.placeholder(tf.float32, [None, tweet_size, vec_size], "tweets") 
labels = tf.placeholder(tf.float32, [None, number_of_classes], "labels") 

# Placeholder for dropout 
keep_prob = tf.placeholder(tf.float32) 

# make the lstm cells, and wrap them in MultiRNNCell for multiple layers 
def lstm_cell(): 
    cell = tf.contrib.rnn.BasicLSTMCell(hidden_size) 
    return tf.contrib.rnn.DropoutWrapper(cell=cell, output_keep_prob=keep_prob) 

multi_lstm_cells = tf.contrib.rnn.MultiRNNCell([lstm_cell() for _ in range(number_of_layers)], state_is_tuple=True) 

# Creates a recurrent neural network 
outputs, final_state = tf.nn.dynamic_rnn(multi_lstm_cells, tweets, dtype=tf.float32) 

with tf.name_scope("final_layer"): 
    # weight and bias to shape the final layer 
    W = tf.get_variable("weight_matrix", [hidden_size, number_of_classes], tf.float32, tf.random_normal_initializer(stddev=1.0/math.sqrt(hidden_size))) 
    b = tf.get_variable("bias", [number_of_classes], initializer=tf.constant_initializer(1.0)) 

    sentiments = tf.matmul(final_state[-1][-1], W) + b 

prob = tf.nn.softmax(sentiments) 
tf.summary.histogram('softmax', prob) 

with tf.name_scope("loss"): 
    # define cross entropy loss function 
    losses = tf.nn.softmax_cross_entropy_with_logits(logits=sentiments, labels=labels) 
    loss = tf.reduce_mean(losses) 
    tf.summary.scalar("loss", loss) 

with tf.name_scope("accuracy"): 
    # round our actual probabilities to compute error 
    accuracy = tf.to_float(tf.equal(tf.argmax(prob,1), tf.argmax(labels,1))) 
    accuracy = tf.reduce_mean(tf.cast(accuracy, dtype=tf.float32)) 
    tf.summary.scalar("accuracy", accuracy) 

# define our optimizer to minimize the loss 
with tf.name_scope("train"): 
    optimizer = tf.train.AdamOptimizer(learning_rate).minimize(loss) 

#tensorboard summaries 
merged_summary = tf.summary.merge_all() 
logdir = "tensorboard/" + datetime.datetime.now().strftime("%Y%m%d-%H%M%S") + "/" 
writer = tf.summary.FileWriter(logdir, session.graph) 

# initialize any variables 
tf.global_variables_initializer().run(session=session) 

# Create a saver for writing training checkpoints. 
saver = tf.train.Saver() 

# load our data and separate it into tweets and labels 
train_tweets = np.load('data_es/train_vec_tweets.npy') 
train_labels = np.load('data_es/train_vec_labels.npy') 

test_tweets = np.load('data_es/test_vec_tweets.npy') 
test_labels = np.load('data_es/test_vec_labels.npy') 

**HERE I HAVE THE LOOP FOR TRAINING AND TESTING, I KNOW ITS FINE** 
+0

我想知道您是如何格式化數據的。每個推文有20個字。每個推文都有20個字嗎?你有沒有使用填充?如果是這樣,你的準確性和損失必須由填充詞語掩蓋。而且LSTM也必須提供一個表演序列長度。讓我們知道。 –

+0

推文是可變長度。我從數據集中獲取每條推文,對這些詞進行標記,然後使用word2vec模型對它們進行向量化,如果該詞不在模型詞彙表中,則生成一個與模型具有相同形狀的隨機向量,並在間隔(-0.25, 0.25)。並且我用零矢量填充每個推文以達到最大長度(20)。這可以嗎? – SiM

回答

0

我已經解決了我的問題。在閱讀了一些論文和更多的試驗和錯誤之後,我找出了我的錯誤。

1)數據集:我有一個很大的數據集,但我沒有正確格式化。

  • 我檢查鳴叫標籤(中性,正和負)的分佈,意識到有所述鳴叫的分佈和規範化它的差距。
  • 我通過清除網址hashtags和不必要的標點符號來清理它。
  • 我在矢量化之前洗牌過。

2)初始化:

  • 我初始化MultiRNNCell用零和我改變了我的自定義的最終層tf.contrib.fully_connected。我還添加了偏置和權重矩陣的初始化。 (通過固定這一點,我開始看到Tensorboard更好損失和準確性地塊)

3)差:

4)腐爛的學習率:

  • 我增加了一個指數衰減速率後10000步過擬合來控制。

最終結果:

應用所有這些變化之後,實現了我的84%的測試精度,這是可接受的,因爲我的數據集仍然吸。

我的最終網絡配置爲:

  • num_epochs = 20
  • tweet_size = 20
  • hidden_​​size = 400
  • vec_size = 300
  • 的batch_size = 512
  • number_of_layers = 2
  • number_of_classes = 3
  • start_learning_rate = 0.001