>  기사  >  백엔드 개발  >  시퀀스 분류, IMDB 영화 등급 등의 기능에 대한 자세한 설명

시퀀스 분류, IMDB 영화 등급 등의 기능에 대한 자세한 설명

巴扎黑
巴扎黑원래의
2017-06-23 14:59:531902검색

전체 입력 시퀀스의 클래스 레이블을 예측하는 시퀀스 분류입니다. 텍스트를 작성할 때 사용자의 주제 태도를 예측하기 위한 감정 분석입니다. 선거 결과나 제품 또는 영화 등급을 예측합니다.

국제 영화 데이터베이스 영화 리뷰 데이터 세트. 목표 값은 이진수, 양수 또는 음수입니다. 언어에는 부정과 아이러니, 모호함이 많이 담겨 있습니다. 단어가 나오는지 눈으로만 볼 수는 없습니다. 단어 벡터 순환 네트워크를 구축하고, 각 댓글을 단어별로 보고, 마지막으로 단어의 발화 값을 기반으로 전체 댓글의 감정을 예측하도록 분류기를 훈련시킵니다.

IMDB 영화 리뷰 데이터 세트: 스탠포드 대학 인공 지능 연구소: http://ai.stanford.edu/~amaas/data/sentiment/. 압축된 tar 파일, 긍정적인 의견과 부정적인 의견은 두 개의 폴더 텍스트 파일에서 얻습니다. 정규식을 사용하여 일반 텍스트를 추출하고 모든 문자를 소문자로 변환합니다.

단어 벡터 임베딩 표현은 원-핫 인코딩 단어보다 의미 체계가 더 풍부합니다. 어휘는 단어 인덱스를 결정하고 올바른 단어 벡터를 찾습니다. 시퀀스는 동일한 길이로 채워지고 여러 영화 리뷰 데이터가 일괄적으로 네트워크로 전송됩니다.

순서 라벨링 모델은 두 개의 자리 표시자를 전달합니다. 하나는 입력 데이터 데이터 또는 순서이고 다른 하나는 목표 값 목표 또는 감정입니다. 구성 매개변수 params 객체인 옵티마이저를 전달합니다.

현재 배치 데이터 시퀀스 길이의 동적 계산. 데이터는 단일 텐서 형태이며, 각 시퀀스는 가장 긴 영화 리뷰 길이를 기준으로 0으로 채워집니다. 단어 벡터의 절대 최대 감소입니다. 0 벡터, 스칼라 0. 실수 벡터로, 실수가 0보다 큰 스칼라입니다. tf.sign()은 개별적으로 0 또는 1입니다. 결과는 시간 단계에 따라 추가되어 시퀀스 길이를 얻습니다. 텐서 길이는 배치 데이터 용량과 동일하며 스칼라는 시퀀스 길이를 나타냅니다.

params 객체를 사용하여 단위 유형과 단위 수량을 정의하세요. 길이 속성은 RNN에 제공되는 배치 데이터의 최대 행 수를 지정합니다. 각 시퀀스의 마지막 활동 값을 가져와 소프트맥스 계층으로 보냅니다. 각 영화 리뷰의 길이가 다르기 때문에 배치 데이터의 각 RNN 시퀀스의 최종 상관 출력 활동 값은 서로 다른 인덱스를 갖습니다. 시간 단계 차원(배치 데이터 모양 시퀀스*time_steps*word_Vectors)에 인덱스를 만듭니다. tf.gather()는 첫 번째 차원을 따라 인덱스를 만듭니다. 출력 활동 값 모양 시퀀스*시간_단계*워드_벡터의 처음 두 차원이 평면화되고 시퀀스 길이가 추가됩니다. 마지막으로 유효한 시간 단계를 선택하려면 길이-1을 추가하세요.

그라디언트 클리핑, 그라디언트 값이 합리적인 범위로 제한됩니다. 클래스의 모든 의미 있는 비용 함수를 사용할 수 있으며 모델 출력은 모든 클래스 확률 분포에 사용될 수 있습니다. 학습 결과를 개선하고 최대 가중치 업데이트를 제한하려면 그라데이션 클리핑을 추가하세요. RNN 훈련은 어렵고, 다양한 하이퍼파라미터가 적절하게 일치하지 않으며, 가중치가 쉽게 분기됩니다.

TensorFlow는 옵티마이저 인스턴스 Compute_gradients 함수 추론, 그라디언트 수정 및 가중치 변경 사항을 적용하는 apply_gradients 함수를 지원합니다. 그라데이션 구성 요소가 -limit보다 작으면 -limit를 설정하고, 그라데이션 구성 요소가 제한 내에 있으면 제한을 설정합니다. TensorFlow 파생물은 None일 수 있습니다. 이는 특정 변수가 비용 함수와 관계가 없음을 의미합니다. 수학적으로는 0 벡터여야 하지만 None은 내부 성능 최적화에 도움이 되며 None 값만 반환하면 됩니다.

영화 리뷰는 단어별로 순환 신경망에 입력되며, 각 시간 단계는 배치 데이터를 형성하는 단어 벡터로 구성됩니다. 일괄 처리 기능은 단어 벡터를 찾고 모든 시퀀스 길이를 완성합니다. 모델을 훈련시키고, 하이퍼파라미터를 정의하고, 데이터 세트와 단어 벡터를 로드하고, 전처리된 훈련 배치 데이터에 대해 모델을 실행합니다. 모델의 성공적인 훈련은 네트워크 구조, 하이퍼파라미터 및 단어 벡터 품질에 따라 달라집니다. 사전 훈련된 단어 벡터는 스킵 그램 모델 word2vec 프로젝트( ) 및 Stanford NLP 연구 그룹 Glove 모델(https://nlp.stanford.edu/projects/glove)에서 로드할 수 있습니다.

Kaggle 오픈러닝 대회( ), 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 Practice for Machine Intelligence"

WeChat에서 소통할 수 있도록 저를 추가해 주셔서 감사합니다: qingxingfengzi
내 WeChat 공개 계정: qingxingfengzigz
내 아내 Zhang Xingqing의 WeChat 공개 계정: qingqingfeifangz

위 내용은 시퀀스 분류, IMDB 영화 등급 등의 기능에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.