機械の深さは二種類の映画の感情問題を勉強します。


二分类の问题は最も広范な机械の勉强の问题を応用するのかもしれません。今日は映画評論の文字内容によって、プラスかマイナスかに分けて勉強します。
一、データセットソース
私たちはIMDBデータセットを使っています。インターネット映画データベース(IMDB)から50000本の深刻な両極化の評論を含んでいます。モデルのフィッティングを避けるためにはトレーニングデータだけを覚えています。私たちはデータセットを訓練用の25000のコメントとテスト用の25000のコメントに分けています。トレーニングセットとテストセットは全部50%のポジティブコメントと50%のマイナスコメントが含まれています。
MNISTデータセットと同様に、IMDBデータセットもKerasライブラリに内蔵されています。これは前処理されました。コメント(単語のシーケンス)はすでに整数シーケンスに変換されています。各整数は辞書の中のある単語を表しています。
以下のコードを通じてデータセットをロードし、各コメントの最大1万個前の常用ワードを制限して、ベクトル処理を容易にします。

import tensorflow as tf
imdb = tf.keras.datasets.imdb
(train_data, train_labels),(test_data, test_labels) = imdb.load_data(num_words=10000)
print(train_data[0])
print(train_labels[0])
出力で見ることができます。dataとtest_dataは評論記録の集合であり、各評論記録はまた多くの単語索引からなる集合である。
トレイlabelsとtest_Labelsはコメントの分類に対する集合であり、0は負のコメントを示し、1は肯定的なコメントを示している。

[1, 14, 22, 16, 43, 530, 973, 1622, 1385, 65, 458, 4468, 66, 3941, 4, 173, 36, 256, 5, 25, 100, 43, 838, 112, 50, 670, 2, 9, 35, 480, 284, 5, 150, 4, 172, 112, 167, 2, 336, 385, 39, 4, 172, 4536, 1111, 17, 546, 38, 13, 447, 4, 192, 50, 16, 6, 147, 2025, 19, 14, 22, 4, 1920, 4613, 469, 4, 22, 71, 87, 12, 16, 43, 530, 38, 76, 15, 13, 1247, 4, 22, 17, 515, 17, 12, 16, 626, 18, 2, 5, 62, 386, 12, 8, 316, 8, 106, 5, 4, 2223, 5244, 16, 480, 66, 3785, 33, 4, 130, 12, 16, 38, 619, 5, 25, 124, 51, 36, 135, 48, 25, 1415, 33, 6, 22, 12, 215, 28, 77, 52, 5, 14, 407, 16, 82, 2, 8, 4, 107, 117, 5952, 15, 256, 4, 2, 7, 3766, 5, 723, 36, 71, 43, 530, 476, 26, 400, 317, 46, 7, 4, 2, 1029, 13, 104, 88, 4, 381, 15, 297, 98, 32, 2071, 56, 26, 141, 6, 194, 7486, 18, 4, 226, 22, 21, 134, 476, 26, 480, 5, 144, 30, 5535, 18, 51, 36, 28, 224, 92, 25, 104, 4, 226, 65, 16, 38, 1334, 88, 12, 16, 283, 5, 16, 4472, 113, 103, 32, 15, 16, 5345, 19, 178, 32]
1
ワードと番号のマッピング関係を通じてコメントの内容を具体的なテキストに変換できます。

def get_text(comment_num):
    """             """
    # word_index = tf.keras.datasets.imdb.get_word_index()
    word_index = imdb.get_word_index()
    reverse_word_index = dict([(value, key) for (key, value) in word_index.items()])
    text = ' '.join([reverse_word_index.get(i - 3, '?') for i in comment_num])
    return text
comment = get_text(train_data[0])
print(comment)
第一条映画評論の内容

? this film was just brilliant casting location scenery story direction everyone's really suited the part they played and you could just imagine being there robert ? is an amazing actor and now the same being director ?
二、入力データの書式設定
整数系列を直接神経ネットワークに入力できないので、テンソルに変換する必要があります。次の2つの方法で変換できます。
リストを塗りつぶして、同じ長さにして、リストを(samples,word_)に変換します。index)の2 D形状の整数テンソル。リストをone-hot符号化し、0と1のベクトルに変換します。
ここではone-hotを使って符号化処理を行います。

def vectorize_sequences(sequences, diamension = 10000):
    results = np.zeros((len(sequences), diamension))
    for i, sequence in enumerate(sequences):
        results[i, sequence] = 1
    return results
x_train = vectorize_sequences(train_data)
print(x_train[0])
print(len(x_train[0]))
x_test = vectorize_sequences(test_data)
print(x_test[0])
print(len(x_test[0]))
変換完了の入力結果
[0.1.1....0.0.0.]
10000
[0.1.1....0.0.0.]
ラベルを量子化する

y_train = np.asarray(train_labels).astype('float32')
y_test = np.asarray(test_labels).astype('float32')
三、神経ネットワークの構築
ここでの二分類の単一ラベルに対して,relu活性化関数を持つ全接続層の簡単なスタックを直接使用することができる。
16個の隠蔽ユニットを持つ中間層と一つの隠蔽ユニットを持つ層を二つ使用した。中間層で使用されるRelu活性化関数は、すべての負の値をゼロにする責任があり、最後の層は、sigmoid関数を使用して任意の値を[0,1]の間に圧縮し、予測結果としての確率を持つ。

model = models.Sequential()
model.add(layers.Dense(16, activation='relu', input_shape=(10000,)))
model.add(layers.Dense(16, activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))
ここでのDense層は次のようなテンソル計算を実現し、Dense層に流入したパラメータ16は、隠蔽ユニットの個数を表し、この層が出力するデータの次元数も表している。隠しユニットが多ければ多いほど、ネットワークはより複雑な表現を学ぶことができますが、ネット計算の価格はもっと高いです。

output = relu(dot(W, input) + b)
私たちはrmsprop最適化器とbinaryを使います。クローズセンntropy損失関数を用いてモデルを構成した。

model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['accuracy'])
四、トレーニングモデル
トレーニングデータを小さい部分に分けてチェックデータとし、512サンプルを一括処理として20ラウンドのトレーニングを行い、validation_に出入りする。dataは検査サンプルの損失と計算精度を監視する。

x_val = x_train[:10000]
partial_x_train = x_train[10000:]
y_val = y_train[:10000]
partial_y_train = y_train[10000:]
history = model.fit(partial_x_train, partial_y_train, epochs= 20, batch_size=512, validation_data=(x_val, y_val))
fit()を呼び出して返したhistoryオブジェクトは、トレーニングプロセスのすべてのデータを含む。

history_dict = history.history
print(history_dict.keys())
辞書には4つの項目が含まれています。トレーニングプロセスと検査プロセスの指標に対応しています。ここでlossはトレーニング中の損失指標です。accuracyはトレーニング過程の正確性指標です。lossは検査過程の損失指標であり、val_accuracyは検査過程の正確性の指標である。

dict_keys(['loss', 'accuracy', 'val_loss', 'val_accuracy'])
私たちはMatplotlibを使ってトレーニング損失と損失の状況をチェックします。

loss_values = history_dict['loss']
val_loss_values = history_dict['val_loss']
epochs = range(1, len(loss_values) + 1)
plt.plot(epochs, loss_values, 'bo', label='Training loss')
plt.plot(epochs, val_loss_values, 'b', label='Validation loss')
plt.title('Training and validation loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()
plt.show()
図から全体のトレーニングプロセスを見ることができます。損失関数値は常に小さくなりますが、検査過程の損失関数値は先に小さくなり、2.5-5の間のある点で最小値になります。

私たちはトレーニング精度と検査精度をMatplotlibを使ってかきました。

plt.clf()
acc = history_dict['accuracy']
val_acc = history_dict['val_accuracy']
plt.plot(epochs, acc, 'bo', label='Training accuracy')
plt.plot(epochs, val_acc, 'b', label='Validation accuracy')
plt.title('Training and validation accuracy')
plt.xlabel('Epochs')
plt.ylabel('Accuracy')
plt.legend()
plt.show()
図からはトレーニングプロセス全体が見られ、精度値は常に上昇しているが、検査プロセスの精度値は継続的に変動し、2.5-5の間のある点で最大値に達している。

訓練と検査の指標を分析することによって、訓練の損失は毎回減少しています。訓練の精度は毎回向上しています。しかし、検証損失と検査精度は基本的に第4ラウンドぐらいで最高値に達します。このような過当フィットの場合を防ぐために,第4ラウンドの完了後に直接訓練を停止することができた。

history = model.fit(partial_x_train, partial_y_train, epochs= 4, batch_size=512, validation_data=(x_val, y_val))
results = model.evaluate(x_test, y_test)
print(results)
再実行は、モデルの精度が87%に達すると見られます。

782/782 [==============================] - 1s 876us/step - loss: 0.3137 - accuracy: 0.8729
[0.3137112557888031, 0.8728799819946289]
五、テストデータを使って結果を予測する
トレーニングのモデルを使って、testデータセットを予測します。

result = model.predict(x_test)
print(result)
[[0.38168 3978]
 [0.9997941]
 [0.9842608]
 ...
 [0.8170357]
 [0.3360077]
六、まとめ
  • は、元のデータを前処理し、必要に応じたテンソルに変換する必要がある。
  • は、二分類問題に対して、最後の階層は、SIgmoidをアクティブ関数として使用し、結果の発生確率を0−1のスカラーを出力する。
  • 二二分類問題のsigmoidスカラ出力には、binary uを使うべきです。crossentropy損失関数
  • はトレーニングプロセスが進行すると、フィッティング現象が起こりやすくなります。非トレーニングデータセットにおけるモデルの表現を常時監視する必要があります。
  • ここでは、マシンの深さを学習する映画の2つの分類の感情的な問題についての記事を紹介します。これまでの記事を検索したり、次の関連記事を見たりしてください。これからもよろしくお願いします。