2

更新:

私は最終的なプロジェクトのためにニューラルネットワークを構築しています。私は助けが必要です。感情分析のためのTensorflow lstmは学習しません。更新されました

私はスペイン語のテキストに対して感情分析を行うためにrnnを構築しようとしています。私は、20万ラベルされたつぶやきを持っていると私はスペイン語埋め込む

データセット&ベクトル化とword2vecを使用してそれらをベクトル化:私は重複を消去し、トレーニングとテストセットにデータセットを分割

  • ベクトル化するときに、パディング、未知数、および文末トークンが適用されます。
  • 私は、word2vecモデルで既知の名前に@mentionsをマップしました。例:@iamthebest => "ジョン"

マイモデル:

  • マイデータテンソルは、形状=(BATCH_SIZE、20、300)を有しています。
  • 私は3つのクラスを持っています:ニュートラル、ポジティブ、ネガティブなので、私のターゲットテンソルはshape =(batch_size、3)です。
  • 私はBasicLstmセルとダイナミックrnnを使ってネットを構築します。
  • 私は損失計算のためにAdam Optimizerとsoftmax_crossエントロピーを使用します
  • 私はオーバーフィットを減らすためにドロップアウトラッパーを使用します。

最終実行:

  • 私は別の構成で試してみましたが、それらの非が動作するように見えます。
  • 最後の設定:2レイヤー、512バッチサイズ、15エポックと0.001のlr。

Accuracy

Loss

私にとっては弱点:最終層と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)データセット:大きなデータセットがありましたが、正しくフォーマットしませんでした。

  • 私は(ニュートラル正および負)ツイートラベルの分布をチェックし、前記ツイートの分布と正規の不均衡があった実現。
  • URLハッシュタグと不要な句読点を消去することで、それをさらに改善しました。
  • 私はベクトル化する前にシャッフルしました。

2)初期化:

  • は私がゼロでMultiRNNCellを初期化し、私はtf.contrib.fully_connectedする私のカスタム最終層を変更しました。バイアスとウェイトマトリックスの初期化も追加しました。

3)ドロップアウト(これを固定することで、私はTensorboardに優れた損失や精度のプロットを参照し始めた):私はこの論文では、Recurrent Dropout without Memory Lossを読ん

  • を、と私はそれに応じて自分のドロップアウトを変更しました。私は損失と正確さの改善を見始めました。学習率減衰

4):

  • を私はオーバーフィッティングを制御するために万歩後に指数関数的減衰率を追加しました。

最終結果:

これらの変化の全てを適用した後、私は私のデータセットがまだ吸うために許容される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
関連する問題