Использование предварительно обученного внедрения предложений в повторяющихся сетях - PullRequest
0 голосов
/ 09 июля 2019

Я хочу использовать Универсальное вложение предложений в повторяющихся сетях.

Таким образом, традиционное вложение слова с RNN кодирует каждое слово в вектор, а time_step RNN будет числом слов в предложении.

То, что я хочу сделать, это использовать вложение предложения для кодирования каждого предложения в 512-мерный вектор. Time_step RNN будет числом предложений в тексте или обзором IMDB в моем случае.

Я пытаюсь это сделать по двоичной классификации IMDB. Проблема в том, что как бы я ни настраивал гиперпараметры, модель не научится. Точность обучения и тестирования остается на уровне 50%, что означает, что модель прогнозирует только 1 из 2 классов.

Буду признателен за любую помощь!

_________________________________________________________________
Layer (type)                 Output Shape              Param #
=================================================================
lstm_1 (LSTM)                (None, 128)               131584
_________________________________________________________________
dense_1 (Dense)              (None, 2)                 258
=================================================================
Total params: 131,842
Trainable params: 131,842
Non-trainable params: 0
_________________________________________________________________
WARNING:tensorflow:From C:\Users\shaggyday\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow\python\ops\math_ops.py:3066: to_int32 (from tensorflow.python.ops.math_ops) is deprecated and will be removed in a future version.
Instructions for updating:
Use tf.cast instead.
W0709 14:26:44.883890  9716 deprecation.py:323] From C:\Users\shaggyday\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow\python\ops\math_ops.py:3066: to_int32 (from tensorflow.python.ops.math_ops) is deprecated and will be removed in a future version.
Instructions for updating:
Use tf.cast instead.
Epoch 1/10
249/249 [==============================] - 55s 220ms/step - loss: 0.6937 - acc: 0.5004 - val_loss: 0.6931 - val_acc: 0.5061
Epoch 2/10
249/249 [==============================] - 68s 274ms/step - loss: 0.6970 - acc: 0.5002 - val_loss: 0.6942 - val_acc: 0.5009
Epoch 3/10
249/249 [==============================] - 71s 285ms/step - loss: 0.6947 - acc: 0.4961 - val_loss: 0.6980 - val_acc: 0.5009
Epoch 4/10
249/249 [==============================] - 70s 279ms/step - loss: 0.6938 - acc: 0.4998 - val_loss: 0.6956 - val_acc: 0.5033
Epoch 5/10
249/249 [==============================] - 66s 267ms/step - loss: 0.6936 - acc: 0.5018 - val_loss: 0.6939 - val_acc: 0.5046
Epoch 6/10
249/249 [==============================] - 63s 251ms/step - loss: 0.6931 - acc: 0.5003 - val_loss: 0.6933 - val_acc: 0.5058

Код для предварительного встраивания текста:

file = 'train.csv'
df = pd.read_csv(file)
# df['sentiment'] = [1 if sentiment == 'positive' else 0 for sentiment in df['sentiment'].values]
x = df['review'].values
y = df['sentiment'].values
x_sent = []
for review in x:
    x_sent.append(sent_tokenize( review ) )


num_sample = len(x)
val_split = int(num_sample*0.5)
x_train, y_train = x_sent, y
x_test, y_test = x_sent[val_split:], y[val_split:]

module_url = "https://tfhub.dev/google/universal-sentence-encoder-large/2" 
out_dir = 'use(dan)'
embed = hub.Module(module_url)

num_files = 10
n_file = num_sample // num_files

for n in range( num_files ):

    def batch_embed( batch, labels, lens, set_ ):
        """
        batch:   1-D array of sentences
        labels:  labels for each reviews
        lens:    offsets for the reviews
        set_:    'train' | 'test'
        """
        with tf.Session( config=config ) as session:
          session.run([tf.global_variables_initializer(), tf.tables_initializer()])

          print( 'Getting embeddings for the {} data'.format( set_ ) )
          path = os.path.join( out_dir, 'embed_{}_{}.bin'.format( set_ , n ) )
          if not os.path.exists( path ):
            embeddings = session.run( embed( batch ) )
            offset = 0
            review_embeddings = []
            for l in lens:
                review_embeddings.append( embeddings[ offset : offset + l ] )
                offset += l
            with open( path, 'wb' ) as f:
                pickle.dump( (review_embeddings, labels), f )

            for i, re in enumerate(embeddings):
                if re.shape[0]==0:
                    print( i, batch[i] )

    train_batch = x_train[ n * n_file : min( len( x_train ),  ( n + 1 ) * n_file )  ]
    labels = y_train[ n * n_file : min( len( x_train ),  ( n + 1 ) * n_file )  ]
    lens = [ len( x ) for x in train_batch ]
    sent_batch = [ sent for review in train_batch for sent in review ]
    print( len( sent_batch ) )
    batch_embed(sent_batch, labels, lens, 'train')

    test_batch = x_test[ n * n_file : min( len( x_test ),  ( n + 1 ) * n_file )  ]
    labels = y_test[ n * n_file : min( len( x_test ),  ( n + 1 ) * n_file )  ]
    lens = [ len( x ) for x in test_batch ]
    sent_batch = [ sent for review in test_batch for sent in review ]
    print( len( sent_batch ) )
    batch_embed(sent_batch, labels, lens, 'test')

Модель представляет собой очень простую систему с одним слоем и 256 нейронами. Каждая партия дополняется, потому что каждый обзор IMDB имеет разное количество предложений

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...