更新:
私は最終的なプロジェクトのためにニューラルネットワークを構築しています。私は助けが必要です。感情分析のための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。
私にとっては弱点:最終層と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**
データをどのようにフォーマットしたのでしょうか。ツイートごとに20単語あります。すべてのツイートは正確に20語ですか?あなたはパディングを使いましたか?そうであれば、あなたの正確さと損失は、埋め込まれた単語から隠されなければなりません。また、LSTMには演奏のシーケンス長を指定する必要があります。我々に教えてください。 –
つぶやきは可変長です。私はデータセットから各ツイートを取り出し、単語をトークン化し、word2vecモデルをベクトル化するために使用します。単語がモデルボキャブラリーにない場合は、モデルと同じ形のランダムベクトルを生成します(-0.25、 0.25)。そして、最大の長さ(20)に達するように、各ツイートにゼロベクトルを埋めました。それは大丈夫ですか? – SiM