Tensorflow DNNclassifier получает плохие результаты - PullRequest
0 голосов
/ 07 мая 2018

Я пытаюсь сделать классификатор, чтобы узнать, был ли обзор фильма положительным или отрицательным по его содержанию. Я использую пару релевантных файлов: файл общей лексики (одно слово в строке) по каждому документу, два CSV (один для обучающего набора, один для тестирования), содержащий оценку каждого документа, полученную в конкретном документе. порядок и два CSV (то же, что и выше), где в одной строке это индекс каждого слова, которое появляется в этом обзоре, смотря на словарь в виде списка. Так что для каждого отзыва типа «Мне понравился этот фильм» есть что-то вроде строки оценки 1 (0: неприязнь, 1 нравится) и словосочетания [2,13,64,33]. Я использую DNNClassifier и в настоящее время использую 1 функцию, которая представляет собой встраиваемый столбец, обернутый вокруг categoryor_column_with_identity. Мой код работает, но он требует абсолютно ужасных результатов, и я не уверен, почему. Возможно, кто-то с большим знанием о тензорном потоке мог бы помочь мне. Кроме того, я здесь не часто, но я честно пытался и не смог найти пост, который бы мне напрямую помог.

import tensorflow as tf
import pandas as pd
import numpy as np
import os




embedding_d = 18
label_name = ['Label']
col_name = ["Words"]
hidden_unit = [10]*5
BATCH = 50
STEP = 5000

#Ignore some warning messages but an optional compiler
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'

##Function to feed into training
def train_input_fn(features, labels, batch_size):
    # Convert the inputs to a Dataset.
    dataset = tf.data.Dataset.from_tensor_slices((dict(features), labels))
    # Shuffle, repeat, and batch the examples.
    dataset = dataset.shuffle(1000).repeat().batch(batch_size)
    # Return the dataset.
    return dataset

##Orignal Eval. Untouched so far. Mostly likely will need to be changed.
def eval_input_fn(features, labels, batch_size):
    """An input function for evaluation or prediction"""
    features=dict(features)
    if labels is None:
        # No labels, use only features.
        inputs = features
    else:
        inputs = (features, labels)
    # Convert the inputs to a Dataset.
    dataset = tf.data.Dataset.from_tensor_slices(inputs)
    # Batch the examples
    assert batch_size is not None, "batch_size must not be None"
    dataset = dataset.batch(batch_size)
    # Return the dataset.
    return dataset

## Produces dataframe for labels and features(words) using pandas
def loadData():
    train_label =pd.read_csv("aclImdb/train/yaynay.csv",names=label_name)
    test_label =pd.read_csv("aclImdb/test/yaynay.csv",names=label_name)
    train_feat = pd.read_csv("aclImdb/train/set.csv", names = col_name)
    test_feat = pd.read_csv("aclImdb/test/set.csv", names =  col_name)
    train_feat[col_name] =train_feat[col_name].astype(np.int64)
    test_feat[col_name] =test_feat[col_name].astype(np.int64)
    return (train_feat,train_label),(test_feat,test_label)

## Stuff that I believe is somewhat working
# Get labels for test and training data
(train_x,train_y), (test_x,test_y) = loadData()

## Get the features for each document
train_feature = []
#Currently only one key but this could change in the future
for key in train_x.keys():
    #Create a categorical_column column
    idCol = tf.feature_column.categorical_column_with_identity(
        key= key,
        num_buckets=89528)
embedding_column = tf.feature_column.embedding_column(
    categorical_column= idCol,
    dimension=embedding_d)
train_feature.append(embedding_column)

##Create the neural network
classifier = tf.estimator.DNNClassifier(
    feature_columns=train_feature,
    # Species no. of layers and no. of neurons in each layer
    hidden_units=hidden_unit,
    # Number of output options(here there are 11 for scores 0-10 inclusive)
    n_classes= 2)

    # Train the Model
    #First numerical value is batch size, second is total steps to take.
classifier.train(input_fn= lambda: train_input_fn(train_x, train_y, BATCH),steps=STEP)


#Evaluate the model
eval_result = classifier.evaluate(
    input_fn=lambda:eval_input_fn(test_x, test_y,
                                                BATCH), steps = STEP)
print('\nTest set accuracy: {accuracy:0.3f}\n'.format(**eval_result))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...