シーケンス分類、入力シーケンス全体のクラスラベルを予測します。感情分析により、テキストを書くときのユーザーのトピックに対する態度を予測します。選挙結果や製品や映画の評価を予測する。
国際映画データベースの映画レビュー データセット。ターゲット値はバイナリ、正または負です。この言語には多くの否定、皮肉、曖昧さが含まれています。単語が出現するかどうかだけを見ることはできません。単語ベクトルリカレント ネットワークを構築し、各コメントを単語ごとに表示し、最後に分類器をトレーニングして単語の発話値に基づいてコメント全体の感情を予測します。
スタンフォード大学人工知能研究所の IMDB 映画レビュー データセット: http://ai.stanford.edu/~amaas/data/sentiment/。圧縮された tar ファイル。肯定的なコメントと否定的なコメントが 2 つのフォルダー テキスト ファイルから取得されます。正規表現を使用してプレーン テキストを抽出し、すべての文字を小文字に変換します。
単語ベクトル埋め込み表現は、ワンホット エンコーディング単語よりもセマンティクスが豊富です。語彙は単語インデックスを決定し、正しい単語ベクトルを見つけます。シーケンスは同じ長さにパディングされ、複数の映画レビュー データがバッチでネットワークに送信されます。
シーケンス ラベリング モデル。2 つのプレースホルダーを渡します。1 つは入力データ データまたはシーケンス、もう 1 つは目標値ターゲットまたは感情です。構成パラメーター params オブジェクト、オプティマイザーを渡します。
現在のバッチデータシーケンスの長さの動的計算。データは単一のテンソルの形式であり、各シーケンスには最長の映画レビューの長さに基づいて 0 が埋め込まれます。単語ベクトルの絶対最大削減。ゼロベクトル、スカラー 0。実数ベクトル、0 より大きいスカラー実数。 tf.sign() は離散的に 0 または 1 になります。結果はタイム ステップに沿って加算され、シーケンスの長さが取得されます。テンソルの長さはバッチ データの容量と同じで、スカラーはシーケンスの長さを表します。
paramsオブジェクトを使用してユニットタイプとユニット数量を定義します。 length 属性は、RNN に提供されるバッチ データの最大行数を指定します。各シーケンスの最後のアクティビティ値を取得し、それをソフトマックス層に送信します。各映画レビューの長さが異なるため、バッチ データ内の RNN の各シーケンスの最終的な相関出力アクティビティ値のインデックスは異なります。タイム ステップ ディメンション (バッチ データ シェイプ シーケンス*time_steps*word_vectors) でインデックスを作成します。 tf.gather() は 1 次元に沿ってインデックスを作成します。出力アクティビティ値形状シーケンス*time_steps*word_vectors の最初の 2 次元が平坦化され、シーケンスの長さが追加されます。 length-1 を追加して、最後の有効なタイム ステップを選択します。
グラデーションクリッピング、グラデーション値は適切な範囲に制限されます。クラス内の任意の意味のあるコスト関数を使用でき、モデルの出力をすべてのクラスの確率分布で使用できます。勾配クリッピングを追加して学習結果を改善し、最大重み更新を制限します。 RNN トレーニングは難しく、さまざまなハイパーパラメーターが適切に一致せず、重みが容易に発散する可能性があります。
TensorFlow は、オプティマイザー インスタンスの compute_gradients 関数の推定、勾配の変更、重みの変更を適用する apply_gradients 関数をサポートしています。勾配成分が -limit 未満の場合は、-limit を設定します。勾配成分が限界内にある場合は、limit を設定します。 TensorFlow 導関数は None にすることができます。これは、特定の変数がコスト関数と関係がないことを意味します。数学的にはゼロ ベクトルである必要がありますが、None は内部パフォーマンスの最適化に役立ち、None 値のみを返す必要があります。
映画レビューは単語ごとにリカレント ニューラル ネットワークに入力され、各タイム ステップはバッチ データを形成する単語ベクトルで構成されます。バッチ関数は単語ベクトルを検索し、すべてのシーケンス長を完了します。モデルをトレーニングし、ハイパーパラメーターを定義し、データ セットとワード ベクトルを読み込み、前処理されたトレーニング バッチ データに対してモデルを実行します。モデルのトレーニングが成功するかどうかは、ネットワーク構造、ハイパーパラメーター、およびワード ベクトルの品質に依存します。事前トレーニングされた単語ベクトルは、スキップグラム モデル word2vec プロジェクト ( ) およびスタンフォード NLP 研究グループのグローブ モデル (https://nlp.stanford.edu/projects/glove) からロードできます。
Kaggle Open Learning Competition ()、IMDB 映画レビュー データ、予測結果を他のものと比較します。
import tarfileimport refrom helpers import downloadclass ImdbMovieReviews: DEFAULT_URL = \'http://ai.stanford.edu/~amaas/data/sentiment/aclImdb_v1.tar.gz'TOKEN_REGEX = re.compile(r'[A-Za-z]+|[!?.:,()]')def __init__(self, cache_dir, url=None): self._cache_dir = cache_dir self._url = url or type(self).DEFAULT_URLdef __iter__(self): filepath = download(self._url, self._cache_dir) with tarfile.open(filepath) as archive:for filename in archive.getnames():if filename.startswith('aclImdb/train/pos/'):yield self._read(archive, filename), Trueelif filename.startswith('aclImdb/train/neg/'):yield self._read(archive, filename), Falsedef _read(self, archive, filename): with archive.extractfile(filename) as file_: data = file_.read().decode('utf-8') data = type(self).TOKEN_REGEX.findall(data) data = [x.lower() for x in data]return dataimport bz2import numpy as npclass Embedding:def __init__(self, vocabulary_path, embedding_path, length): self._embedding = np.load(embedding_path) with bz2.open(vocabulary_path, 'rt') as file_: self._vocabulary = {k.strip(): i for i, k in enumerate(file_)} self._length = lengthdef __call__(self, sequence): data = np.zeros((self._length, self._embedding.shape[1])) indices = [self._vocabulary.get(x, 0) for x in sequence] embedded = self._embedding[indices] data[:len(sequence)] = embeddedreturn data @propertydef dimensions(self):return self._embedding.shape[1]import tensorflow as tffrom helpers import lazy_propertyclass SequenceClassificationModel:def __init__(self, data, target, params): self.data = data self.target = target self.params = params self.prediction self.cost self.error self.optimize @lazy_propertydef length(self): used = tf.sign(tf.reduce_max(tf.abs(self.data), reduction_indices=2)) length = tf.reduce_sum(used, reduction_indices=1) length = tf.cast(length, tf.int32)return length @lazy_propertydef prediction(self):# Recurrent network.output, _ = tf.nn.dynamic_rnn( self.params.rnn_cell(self.params.rnn_hidden), self.data, dtype=tf.float32, sequence_length=self.length, ) last = self._last_relevant(output, self.length)# Softmax layer.num_classes = int(self.target.get_shape()[1]) weight = tf.Variable(tf.truncated_normal( [self.params.rnn_hidden, num_classes], stddev=0.01)) bias = tf.Variable(tf.constant(0.1, shape=[num_classes])) prediction = tf.nn.softmax(tf.matmul(last, weight) + bias)return prediction @lazy_propertydef cost(self): cross_entropy = -tf.reduce_sum(self.target * tf.log(self.prediction))return cross_entropy @lazy_propertydef error(self): mistakes = tf.not_equal( tf.argmax(self.target, 1), tf.argmax(self.prediction, 1))return tf.reduce_mean(tf.cast(mistakes, tf.float32)) @lazy_propertydef optimize(self): gradient = self.params.optimizer.compute_gradients(self.cost)try: limit = self.params.gradient_clipping gradient = [ (tf.clip_by_value(g, -limit, limit), v)if g is not None else (None, v)for g, v in gradient]except AttributeError:print('No gradient clipping parameter specified.') optimize = self.params.optimizer.apply_gradients(gradient)return optimize @staticmethoddef _last_relevant(output, length): batch_size = tf.shape(output)[0] max_length = int(output.get_shape()[1]) output_size = int(output.get_shape()[2]) index = tf.range(0, batch_size) * max_length + (length - 1) flat = tf.reshape(output, [-1, output_size]) relevant = tf.gather(flat, index)return relevantimport tensorflow as tffrom helpers import AttrDictfrom Embedding import Embeddingfrom ImdbMovieReviews import ImdbMovieReviewsfrom preprocess_batched import preprocess_batchedfrom SequenceClassificationModel import SequenceClassificationModel IMDB_DOWNLOAD_DIR = './imdb'WIKI_VOCAB_DIR = '../01_wikipedia/wikipedia'WIKI_EMBED_DIR = '../01_wikipedia/wikipedia'params = AttrDict( rnn_cell=tf.contrib.rnn.GRUCell, rnn_hidden=300, optimizer=tf.train.RMSPropOptimizer(0.002), batch_size=20, ) reviews = ImdbMovieReviews(IMDB_DOWNLOAD_DIR) length = max(len(x[0]) for x in reviews) embedding = Embedding( WIKI_VOCAB_DIR + '/vocabulary.bz2', WIKI_EMBED_DIR + '/embeddings.npy', length) batches = preprocess_batched(reviews, length, embedding, params.batch_size) data = tf.placeholder(tf.float32, [None, length, embedding.dimensions]) target = tf.placeholder(tf.float32, [None, 2]) model = SequenceClassificationModel(data, target, params) sess = tf.Session() sess.run(tf.initialize_all_variables())for index, batch in enumerate(batches): feed = {data: batch[0], target: batch[1]} error, _ = sess.run([model.error, model.optimize], feed)print('{}: {:3.1f}%'.format(index + 1, 100 * error))
参考:
「機械知能のための TensorFlow 実践」
WeChat でのコミュニケーションに私を追加してください: qingxingfengzi
私の WeChat 公開アカウント: qingxingfengzigz
私の妻 Zhang Xingqing の WeChat 公開アカウント: qingqingfeifang z
以上がシーケンス分類やIMDB動画レーティングなどの機能を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。