In [1]:
from google.colab import drive
drive.mount('/content/drive')
Go to this URL in a browser: https://accounts.google.com/o/oauth2/auth?client_id=947318989803-6bn6qk8qdgf4n4g3pfee6491hc0brc4i.apps.googleusercontent.com&redirect_uri=urn%3aietf%3awg%3aoauth%3a2.0%3aoob&response_type=code&scope=email%20https%3a%2f%2fwww.googleapis.com%2fauth%2fdocs.test%20https%3a%2f%2fwww.googleapis.com%2fauth%2fdrive%20https%3a%2f%2fwww.googleapis.com%2fauth%2fdrive.photos.readonly%20https%3a%2f%2fwww.googleapis.com%2fauth%2fpeopleapi.readonly

Enter your authorization code:
··········
Mounted at /content/drive
In [0]:
import os
os.chdir('/content/drive/Shared drives/Тяжелые проекты/ИАД/intro-to-dl-seminars/hw_5_text')
In [3]:
%tensorflow_version 2.x
TensorFlow 2.x selected.
In [0]:
import sys, os, re, csv, codecs, numpy as np, pandas as pd

import tensorflow as tf
import tensorflow.keras as keras
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences
from tensorflow.keras.layers import Dense, Input, LSTM, Embedding, Dropout, Activation, Bidirectional, GlobalMaxPool1D, GlobalAveragePooling1D, concatenate, Conv1D, LeakyReLU,BatchNormalization, MaxPooling1D, Flatten
from tensorflow.keras.models import Model
from tensorflow.keras import initializers, regularizers, constraints, optimizers, layers
from tensorflow.keras.optimizers import Adamax, Adam
from tqdm import tqdm_notebook
In [5]:
tf.test.gpu_device_name()
Out[5]:
'/device:GPU:0'

По результатам экспериментов, лучше себя показывает эмбединг, обученный на твиттере

In [0]:
EMBEDDING_FILE='glove/glove.twitter.27B.100d.txt'
TRAIN_DATA_FILE='x_train.txt'
TEST_DATA_FILE='x_test.txt'
TRAIN_LABELS='y_train.csv'
In [7]:
!cat {EMBEDDING_FILE} | wc -l
1193514
In [0]:
embed_size = 100 # Размерность эмбединга
max_features = 50000 # Максимальное количество фич
maxlen = 150 # Максимальная длина фразы в токенах
In [9]:
train = pd.read_csv(TRAIN_DATA_FILE, header=None, names=['text'], sep="ЯЯЯЯЯЯЯЯ")
test = pd.read_csv(TEST_DATA_FILE, header=None, names=['text'], sep="ЯЯЯЯЯЯЯЯ")
y = pd.read_csv(TRAIN_LABELS)['Probability'].values
/usr/local/lib/python3.6/dist-packages/ipykernel_launcher.py:1: ParserWarning: Falling back to the 'python' engine because the 'c' engine does not support regex separators (separators > 1 char and different from '\s+' are interpreted as regex); you can avoid this warning by specifying engine='python'.
  """Entry point for launching an IPython kernel.
/usr/local/lib/python3.6/dist-packages/ipykernel_launcher.py:2: ParserWarning: Falling back to the 'python' engine because the 'c' engine does not support regex separators (separators > 1 char and different from '\s+' are interpreted as regex); you can avoid this warning by specifying engine='python'.
  
In [0]:
list_sentences_train = train["text"].fillna("_na_").values
list_sentences_test = test["text"].fillna("_na_").values
In [11]:
%%time
tokenizer = Tokenizer(num_words=max_features)
tokenizer.fit_on_texts(list(list_sentences_train))
list_tokenized_train = tokenizer.texts_to_sequences(list_sentences_train)
list_tokenized_test = tokenizer.texts_to_sequences(list_sentences_test)
X_train = pad_sequences(list_tokenized_train, maxlen=maxlen)
X_test = pad_sequences(list_tokenized_test, maxlen=maxlen)
CPU times: user 7min 47s, sys: 2.86 s, total: 7min 50s
Wall time: 7min 50s

Как можно заметить, данные в векторах не соответствуют тому формату, который был подготовлен

In [12]:
def get_coefs(word,*arr): 
    return word, np.asarray(arr, dtype='float32')
with open(EMBEDDING_FILE) as f:
    embeddings_index = dict(get_coefs(*o.strip().split()) for o in tqdm_notebook(f))

In [0]:
sh = embeddings_index['a'].shape
In [14]:
for k, v in embeddings_index.items():
    if v.shape != sh:
        print(k)
        
-0.32053
In [0]:
del embeddings_index['-0.32053']
In [16]:
all_embs = np.stack(embeddings_index.values())
emb_mean,emb_std = all_embs.mean(), all_embs.std()
emb_mean,emb_std
/usr/local/lib/python3.6/dist-packages/IPython/core/interactiveshell.py:2822: FutureWarning: arrays to stack must be passed as a "sequence" type such as list or tuple. Support for non-sequence iterables such as generators is deprecated as of NumPy 1.16 and will raise an error in the future.
  if self.run_code(code, result):
Out[16]:
(0.02631098, 0.58370703)
In [0]:
word_index = tokenizer.word_index
nb_words = min(max_features, len(word_index))
embedding_matrix = np.random.normal(emb_mean, emb_std, (nb_words, embed_size))
for word, i in word_index.items():
    if i >= max_features: 
        continue
    embedding_vector = embeddings_index.get(word)
    if embedding_vector is not None: 
        embedding_matrix[i] = embedding_vector

Сводная таблица результата обучения простой CNN на 10% данных (эмбединг, Conv1D, GlobalMaxPooling, Dense).

Чем больше фильтров, тем лучше модель, но размер кернела лучше взять средним.

val_AUC 32 64 128 256
3 0.9678 0.9712 0.9732 0.9754
5 0.9704 0.9720 0.9741 0.9758
6 0.9694 0.9713 0.9738 0.9758

Далее возьмем 2 разноприродные модели, которые показали наилучший результат и объединим их.

Так же была попытка добавить еще 1 вход, основанный на метаданных текста (количество слов, символов, уникальных слов и т.д.), но такая модель показывала неудовлетворительное качество

In [0]:
def cnn_layers(inp):
    x = Embedding(max_features, embed_size, input_length=maxlen, weights=[embedding_matrix], trainable = True)(inp)

    x = Conv1D(filters=64, kernel_size=5)(x)
    x = LeakyReLU(0.1)(x)
    x = Conv1D(filters=64, kernel_size=5)(x)
    x = BatchNormalization()(x)
    x = LeakyReLU(0.1)(x)  
    x = MaxPooling1D(padding='same')(x)
    x = Dropout(0.2)(x)

    x = Conv1D(filters=128, kernel_size=5)(x)
    x = LeakyReLU(0.1)(x)
    x = Conv1D(filters=128, kernel_size=5)(x)
    x = BatchNormalization()(x)
    x = LeakyReLU(0.1)(x)  
    x = MaxPooling1D(padding='same')(x)
    x = Dropout(0.2)(x)

    x = Conv1D(filters=256, kernel_size=5)(x)
    x = LeakyReLU(0.1)(x)
    x = Conv1D(filters=256, kernel_size=5)(x)
    x = BatchNormalization()(x)
    x = LeakyReLU(0.1)(x)  
    x = MaxPooling1D(padding='same')(x)
    x = Dropout(0.2)(x)

    x = Flatten()(x)
    x = Dense(512)(x)
    x = BatchNormalization()(x)
    x = LeakyReLU(0.1)(x)  
    return x
In [0]:
def lstm_layers(inp):
    x = Embedding(max_features, embed_size, input_length=maxlen, weights=[embedding_matrix], trainable = True)(inp)
    x = Bidirectional(LSTM(80, return_sequences=True, dropout=0.1, recurrent_dropout=0.1))(x)
    gmx = GlobalMaxPool1D()(x)
    gax = GlobalAveragePooling1D()(x)
    concatenated = concatenate([gmx, gax])
    x = Dense(80, activation="relu")(concatenated)
    return x
In [0]:
input_text = Input(shape=(maxlen,))

cnn = cnn_layers(input_text)
lstm = lstm_layers(input_text)
concatenated = concatenate([cnn, lstm])

x = Dropout(0.1)(concatenated)
x = Dense(1, activation="sigmoid")(x)
model = Model(inputs=input_text, outputs=x)
model.compile(loss='binary_crossentropy', optimizer=Adam(clipvalue=2, clipnorm=2), metrics=['accuracy' ,'AUC'])
In [0]:
model=keras.models.load_model()
In [21]:
model.summary()
Model: "model"
__________________________________________________________________________________________________
Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
input_1 (InputLayer)            [(None, 150)]        0                                            
__________________________________________________________________________________________________
embedding (Embedding)           (None, 150, 100)     5000000     input_1[0][0]                    
__________________________________________________________________________________________________
conv1d (Conv1D)                 (None, 146, 64)      32064       embedding[0][0]                  
__________________________________________________________________________________________________
leaky_re_lu (LeakyReLU)         (None, 146, 64)      0           conv1d[0][0]                     
__________________________________________________________________________________________________
conv1d_1 (Conv1D)               (None, 142, 64)      20544       leaky_re_lu[0][0]                
__________________________________________________________________________________________________
batch_normalization (BatchNorma (None, 142, 64)      256         conv1d_1[0][0]                   
__________________________________________________________________________________________________
leaky_re_lu_1 (LeakyReLU)       (None, 142, 64)      0           batch_normalization[0][0]        
__________________________________________________________________________________________________
max_pooling1d (MaxPooling1D)    (None, 71, 64)       0           leaky_re_lu_1[0][0]              
__________________________________________________________________________________________________
dropout (Dropout)               (None, 71, 64)       0           max_pooling1d[0][0]              
__________________________________________________________________________________________________
conv1d_2 (Conv1D)               (None, 67, 128)      41088       dropout[0][0]                    
__________________________________________________________________________________________________
leaky_re_lu_2 (LeakyReLU)       (None, 67, 128)      0           conv1d_2[0][0]                   
__________________________________________________________________________________________________
conv1d_3 (Conv1D)               (None, 63, 128)      82048       leaky_re_lu_2[0][0]              
__________________________________________________________________________________________________
batch_normalization_1 (BatchNor (None, 63, 128)      512         conv1d_3[0][0]                   
__________________________________________________________________________________________________
leaky_re_lu_3 (LeakyReLU)       (None, 63, 128)      0           batch_normalization_1[0][0]      
__________________________________________________________________________________________________
max_pooling1d_1 (MaxPooling1D)  (None, 32, 128)      0           leaky_re_lu_3[0][0]              
__________________________________________________________________________________________________
dropout_1 (Dropout)             (None, 32, 128)      0           max_pooling1d_1[0][0]            
__________________________________________________________________________________________________
conv1d_4 (Conv1D)               (None, 28, 256)      164096      dropout_1[0][0]                  
__________________________________________________________________________________________________
leaky_re_lu_4 (LeakyReLU)       (None, 28, 256)      0           conv1d_4[0][0]                   
__________________________________________________________________________________________________
conv1d_5 (Conv1D)               (None, 24, 256)      327936      leaky_re_lu_4[0][0]              
__________________________________________________________________________________________________
batch_normalization_2 (BatchNor (None, 24, 256)      1024        conv1d_5[0][0]                   
__________________________________________________________________________________________________
leaky_re_lu_5 (LeakyReLU)       (None, 24, 256)      0           batch_normalization_2[0][0]      
__________________________________________________________________________________________________
max_pooling1d_2 (MaxPooling1D)  (None, 12, 256)      0           leaky_re_lu_5[0][0]              
__________________________________________________________________________________________________
dropout_2 (Dropout)             (None, 12, 256)      0           max_pooling1d_2[0][0]            
__________________________________________________________________________________________________
embedding_1 (Embedding)         (None, 150, 100)     5000000     input_1[0][0]                    
__________________________________________________________________________________________________
flatten (Flatten)               (None, 3072)         0           dropout_2[0][0]                  
__________________________________________________________________________________________________
bidirectional (Bidirectional)   (None, 150, 160)     115840      embedding_1[0][0]                
__________________________________________________________________________________________________
dense (Dense)                   (None, 512)          1573376     flatten[0][0]                    
__________________________________________________________________________________________________
global_max_pooling1d (GlobalMax (None, 160)          0           bidirectional[0][0]              
__________________________________________________________________________________________________
global_average_pooling1d (Globa (None, 160)          0           bidirectional[0][0]              
__________________________________________________________________________________________________
batch_normalization_3 (BatchNor (None, 512)          2048        dense[0][0]                      
__________________________________________________________________________________________________
concatenate (Concatenate)       (None, 320)          0           global_max_pooling1d[0][0]       
                                                                 global_average_pooling1d[0][0]   
__________________________________________________________________________________________________
leaky_re_lu_6 (LeakyReLU)       (None, 512)          0           batch_normalization_3[0][0]      
__________________________________________________________________________________________________
dense_1 (Dense)                 (None, 80)           25680       concatenate[0][0]                
__________________________________________________________________________________________________
concatenate_1 (Concatenate)     (None, 592)          0           leaky_re_lu_6[0][0]              
                                                                 dense_1[0][0]                    
__________________________________________________________________________________________________
dropout_3 (Dropout)             (None, 592)          0           concatenate_1[0][0]              
__________________________________________________________________________________________________
dense_2 (Dense)                 (None, 1)            593         dropout_3[0][0]                  
==================================================================================================
Total params: 12,387,105
Trainable params: 12,385,185
Non-trainable params: 1,920
__________________________________________________________________________________________________
In [0]:
class ModelSaveCallback(keras.callbacks.Callback):

    def __init__(self, file_name):
        super(ModelSaveCallback, self).__init__()
        self.file_name = file_name

    def on_epoch_end(self, epoch, logs=None):
        filename = self.file_name.format(epoch)
        keras.models.save_model(self.model, filename)
class ModelPredictCallback(keras.callbacks.Callback):

    def __init__(self, file_name):
        super(ModelPredictCallback, self).__init__()
        self.file_name = file_name

    def on_epoch_end(self, epoch, logs=None):
        filename = self.file_name.format(epoch)
        result = self.model.predict(X_test, batch_size=batch_size*16, verbose=0)
        df = pd.DataFrame()
        df['Id'] = range(1, len(X_test) + 1)
        df['Probability'] = result
        df.to_csv(filename, index=None)
In [0]:
TAKE=28 # Номер попытки
batch_size=512
NAME='kernel_conv_lstm_nofeatures_glove.twitter.27B.100d'
model_filename = '{0:02d}_{1:s}_{{0:02d}}.hdf5'.format(TAKE, NAME)
predict_filename = '{0:02d}_{1:s}_{{0:02d}}.csv'.format(TAKE, NAME)
In [0]:
model.fit(X_train, y, batch_size=batch_size, epochs=1, validation_split=0.1,verbose=1,
          initial_epoch=0,
        callbacks = [
            ModelSaveCallback(model_filename),
            ModelPredictCallback(predict_filename),
        ],
        )
In [34]:
from IPython.display import Audio
Audio('First_epoch.mp3', autoplay=True) 
Out[34]:
In [42]:
model.fit(X_train, y, batch_size=batch_size, epochs=7, validation_split=0.1,verbose=2,
          initial_epoch=1,
        callbacks = [
            ModelSaveCallback(model_filename),
            ModelPredictCallback(predict_filename),
        ],
        )
Train on 3240000 samples, validate on 360000 samples
Epoch 2/7
3240000/3240000 - 3480s - loss: 0.1211 - accuracy: 0.9559 - AUC: 0.9900 - val_loss: 0.1228 - val_accuracy: 0.9549 - val_AUC: 0.9899
Epoch 3/7
3240000/3240000 - 3433s - loss: 0.1052 - accuracy: 0.9628 - AUC: 0.9921 - val_loss: 0.1213 - val_accuracy: 0.9563 - val_AUC: 0.9899
Epoch 4/7
---------------------------------------------------------------------------
KeyboardInterrupt                         Traceback (most recent call last)
/tensorflow-2.1.0/python3.6/tensorflow_core/python/keras/engine/training_v2.py in on_epoch(self, epoch, mode)
    766     try:
--> 767       yield epoch_logs
    768     finally:

/tensorflow-2.1.0/python3.6/tensorflow_core/python/keras/engine/training_v2.py in fit(self, model, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, validation_freq, max_queue_size, workers, use_multiprocessing, **kwargs)
    341                 training_context=training_context,
--> 342                 total_epochs=epochs)
    343             cbks.make_logs(model, epoch_logs, training_result, ModeKeys.TRAIN)

/tensorflow-2.1.0/python3.6/tensorflow_core/python/keras/engine/training_v2.py in run_one_epoch(model, iterator, execution_function, dataset_size, batch_size, strategy, steps_per_epoch, num_samples, mode, training_context, total_epochs)
    127       try:
--> 128         batch_outs = execution_function(iterator)
    129       except (StopIteration, errors.OutOfRangeError):

/tensorflow-2.1.0/python3.6/tensorflow_core/python/keras/engine/training_v2_utils.py in execution_function(input_fn)
     97     return nest.map_structure(_non_none_constant_value,
---> 98                               distributed_function(input_fn))
     99 

/tensorflow-2.1.0/python3.6/tensorflow_core/python/eager/def_function.py in __call__(self, *args, **kwds)
    567     else:
--> 568       result = self._call(*args, **kwds)
    569 

/tensorflow-2.1.0/python3.6/tensorflow_core/python/eager/def_function.py in _call(self, *args, **kwds)
    598       # defunned version which is guaranteed to never create variables.
--> 599       return self._stateless_fn(*args, **kwds)  # pylint: disable=not-callable
    600     elif self._stateful_fn is not None:

/tensorflow-2.1.0/python3.6/tensorflow_core/python/eager/function.py in __call__(self, *args, **kwargs)
   2362       graph_function, args, kwargs = self._maybe_define_function(args, kwargs)
-> 2363     return graph_function._filtered_call(args, kwargs)  # pylint: disable=protected-access
   2364 

/tensorflow-2.1.0/python3.6/tensorflow_core/python/eager/function.py in _filtered_call(self, args, kwargs)
   1610                            resource_variable_ops.BaseResourceVariable))),
-> 1611         self.captured_inputs)
   1612 

/tensorflow-2.1.0/python3.6/tensorflow_core/python/eager/function.py in _call_flat(self, args, captured_inputs, cancellation_manager)
   1691       return self._build_call_outputs(self._inference_function.call(
-> 1692           ctx, args, cancellation_manager=cancellation_manager))
   1693     forward_backward = self._select_forward_and_backward_functions(

/tensorflow-2.1.0/python3.6/tensorflow_core/python/eager/function.py in call(self, ctx, args, cancellation_manager)
    544               attrs=("executor_type", executor_type, "config_proto", config),
--> 545               ctx=ctx)
    546         else:

/tensorflow-2.1.0/python3.6/tensorflow_core/python/eager/execute.py in quick_execute(op_name, num_outputs, inputs, attrs, ctx, name)
     60                                                op_name, inputs, attrs,
---> 61                                                num_outputs)
     62   except core._NotOkStatusException as e:

KeyboardInterrupt: 

During handling of the above exception, another exception occurred:

KeyboardInterrupt                         Traceback (most recent call last)
<ipython-input-42-a0111e607bc9> in <module>()
      3         callbacks = [
      4             ModelSaveCallback(model_filename),
----> 5             ModelPredictCallback(predict_filename),
      6         ],
      7         )

/tensorflow-2.1.0/python3.6/tensorflow_core/python/keras/engine/training.py in fit(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, validation_freq, max_queue_size, workers, use_multiprocessing, **kwargs)
    817         max_queue_size=max_queue_size,
    818         workers=workers,
--> 819         use_multiprocessing=use_multiprocessing)
    820 
    821   def evaluate(self,

/tensorflow-2.1.0/python3.6/tensorflow_core/python/keras/engine/training_v2.py in fit(self, model, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, validation_freq, max_queue_size, workers, use_multiprocessing, **kwargs)
    395                       total_epochs=1)
    396                   cbks.make_logs(model, epoch_logs, eval_result, ModeKeys.TEST,
--> 397                                  prefix='val_')
    398 
    399     return model.history

/usr/lib/python3.6/contextlib.py in __exit__(self, type, value, traceback)
     97                 value = type()
     98             try:
---> 99                 self.gen.throw(type, value, traceback)
    100             except StopIteration as exc:
    101                 # Suppress StopIteration *unless* it's the same exception that

/tensorflow-2.1.0/python3.6/tensorflow_core/python/keras/engine/training_v2.py in on_epoch(self, epoch, mode)
    769       if mode == ModeKeys.TRAIN:
    770         # Epochs only apply to `fit`.
--> 771         self.callbacks.on_epoch_end(epoch, epoch_logs)
    772       self.progbar.on_epoch_end(epoch, epoch_logs)
    773 

/tensorflow-2.1.0/python3.6/tensorflow_core/python/keras/callbacks.py in on_epoch_end(self, epoch, logs)
    300     logs = logs or {}
    301     for callback in self.callbacks:
--> 302       callback.on_epoch_end(epoch, logs)
    303 
    304   def on_train_batch_begin(self, batch, logs=None):

<ipython-input-30-62a00c34c04c> in on_epoch_end(self, epoch, logs)
     16     def on_epoch_end(self, epoch, logs=None):
     17         filename = self.file_name.format(epoch)
---> 18         result = self.model.predict(X_test, batch_size=batch_size*16, verbose=0)
     19         df = pd.DataFrame()
     20         df['Id'] = range(1, len(X_test) + 1)

/tensorflow-2.1.0/python3.6/tensorflow_core/python/keras/engine/training.py in predict(self, x, batch_size, verbose, steps, callbacks, max_queue_size, workers, use_multiprocessing)
   1011         max_queue_size=max_queue_size,
   1012         workers=workers,
-> 1013         use_multiprocessing=use_multiprocessing)
   1014 
   1015   def reset_metrics(self):

/tensorflow-2.1.0/python3.6/tensorflow_core/python/keras/engine/training_v2.py in predict(self, model, x, batch_size, verbose, steps, callbacks, max_queue_size, workers, use_multiprocessing, **kwargs)
    496         model, ModeKeys.PREDICT, x=x, batch_size=batch_size, verbose=verbose,
    497         steps=steps, callbacks=callbacks, max_queue_size=max_queue_size,
--> 498         workers=workers, use_multiprocessing=use_multiprocessing, **kwargs)
    499 
    500 

/tensorflow-2.1.0/python3.6/tensorflow_core/python/keras/engine/training_v2.py in _model_iteration(self, model, mode, x, y, batch_size, verbose, sample_weight, steps, callbacks, max_queue_size, workers, use_multiprocessing, **kwargs)
    473               mode=mode,
    474               training_context=training_context,
--> 475               total_epochs=1)
    476           cbks.make_logs(model, epoch_logs, result, mode)
    477 

/tensorflow-2.1.0/python3.6/tensorflow_core/python/keras/engine/training_v2.py in run_one_epoch(model, iterator, execution_function, dataset_size, batch_size, strategy, steps_per_epoch, num_samples, mode, training_context, total_epochs)
    126         step=step, mode=mode, size=current_batch_size) as batch_logs:
    127       try:
--> 128         batch_outs = execution_function(iterator)
    129       except (StopIteration, errors.OutOfRangeError):
    130         # TODO(kaftan): File bug about tf function and errors.OutOfRangeError?

/tensorflow-2.1.0/python3.6/tensorflow_core/python/keras/engine/training_v2_utils.py in execution_function(input_fn)
     96     # `numpy` translates Tensors to values in Eager mode.
     97     return nest.map_structure(_non_none_constant_value,
---> 98                               distributed_function(input_fn))
     99 
    100   return execution_function

/tensorflow-2.1.0/python3.6/tensorflow_core/python/eager/def_function.py in __call__(self, *args, **kwds)
    566         xla_context.Exit()
    567     else:
--> 568       result = self._call(*args, **kwds)
    569 
    570     if tracing_count == self._get_tracing_count():

/tensorflow-2.1.0/python3.6/tensorflow_core/python/eager/def_function.py in _call(self, *args, **kwds)
    604       # In this case we have not created variables on the first call. So we can
    605       # run the first trace but we should fail if variables are created.
--> 606       results = self._stateful_fn(*args, **kwds)
    607       if self._created_variables:
    608         raise ValueError("Creating variables on a non-first call to a function"

/tensorflow-2.1.0/python3.6/tensorflow_core/python/eager/function.py in __call__(self, *args, **kwargs)
   2361     with self._lock:
   2362       graph_function, args, kwargs = self._maybe_define_function(args, kwargs)
-> 2363     return graph_function._filtered_call(args, kwargs)  # pylint: disable=protected-access
   2364 
   2365   @property

/tensorflow-2.1.0/python3.6/tensorflow_core/python/eager/function.py in _filtered_call(self, args, kwargs)
   1609          if isinstance(t, (ops.Tensor,
   1610                            resource_variable_ops.BaseResourceVariable))),
-> 1611         self.captured_inputs)
   1612 
   1613   def _call_flat(self, args, captured_inputs, cancellation_manager=None):

/tensorflow-2.1.0/python3.6/tensorflow_core/python/eager/function.py in _call_flat(self, args, captured_inputs, cancellation_manager)
   1690       # No tape is watching; skip to running the function.
   1691       return self._build_call_outputs(self._inference_function.call(
-> 1692           ctx, args, cancellation_manager=cancellation_manager))
   1693     forward_backward = self._select_forward_and_backward_functions(
   1694         args,

/tensorflow-2.1.0/python3.6/tensorflow_core/python/eager/function.py in call(self, ctx, args, cancellation_manager)
    543               inputs=args,
    544               attrs=("executor_type", executor_type, "config_proto", config),
--> 545               ctx=ctx)
    546         else:
    547           outputs = execute.execute_with_cancellation(

/tensorflow-2.1.0/python3.6/tensorflow_core/python/eager/execute.py in quick_execute(op_name, num_outputs, inputs, attrs, ctx, name)
     59     tensors = pywrap_tensorflow.TFE_Py_Execute(ctx._handle, device_name,
     60                                                op_name, inputs, attrs,
---> 61                                                num_outputs)
     62   except core._NotOkStatusException as e:
     63     if name is not None:

KeyboardInterrupt: 

Наша модель полностью обучилась, добавим элемента неожиданности

In [54]:
for i in range(20):
    print(i)
    idx = np.random.randint(X_train.shape[0], size=int(X_train.shape[0]/20))
    X_train1 = X_train[idx, :]
    y1 = y[idx]
    model.fit(X_train1, y1, batch_size=int(batch_size/2), epochs=i+4,verbose=1, initial_epoch=i+3)
0
Train on 180000 samples
Epoch 4/4
180000/180000 [==============================] - 365s 2ms/sample - loss: 0.0925 - accuracy: 0.9684 - AUC: 0.9936
1
Train on 180000 samples
Epoch 5/5
180000/180000 [==============================] - 365s 2ms/sample - loss: 0.0906 - accuracy: 0.9683 - AUC: 0.9939
2
Train on 180000 samples
Epoch 6/6
180000/180000 [==============================] - 362s 2ms/sample - loss: 0.0891 - accuracy: 0.9696 - AUC: 0.9940
3
Train on 180000 samples
Epoch 7/7
180000/180000 [==============================] - 357s 2ms/sample - loss: 0.0883 - accuracy: 0.9693 - AUC: 0.9941
4
Train on 180000 samples
Epoch 8/8
180000/180000 [==============================] - 362s 2ms/sample - loss: 0.0876 - accuracy: 0.9701 - AUC: 0.9942
5
Train on 180000 samples
Epoch 9/9
180000/180000 [==============================] - 365s 2ms/sample - loss: 0.0906 - accuracy: 0.9692 - AUC: 0.9938
6
Train on 180000 samples
Epoch 10/10
180000/180000 [==============================] - 365s 2ms/sample - loss: 0.0895 - accuracy: 0.9695 - AUC: 0.9940
7
Train on 180000 samples
Epoch 11/11
180000/180000 [==============================] - 374s 2ms/sample - loss: 0.0869 - accuracy: 0.9701 - AUC: 0.9942
8
Train on 180000 samples
Epoch 12/12
180000/180000 [==============================] - 374s 2ms/sample - loss: 0.0863 - accuracy: 0.9706 - AUC: 0.9944
9
Train on 180000 samples
Epoch 13/13
180000/180000 [==============================] - 372s 2ms/sample - loss: 0.0853 - accuracy: 0.9711 - AUC: 0.9944
10
Train on 180000 samples
Epoch 14/14
180000/180000 [==============================] - 373s 2ms/sample - loss: 0.0853 - accuracy: 0.9711 - AUC: 0.9944
11
Train on 180000 samples
Epoch 15/15
180000/180000 [==============================] - 368s 2ms/sample - loss: 0.0860 - accuracy: 0.9705 - AUC: 0.9942
12
Train on 180000 samples
Epoch 16/16
180000/180000 [==============================] - 365s 2ms/sample - loss: 0.0845 - accuracy: 0.9711 - AUC: 0.9944
13
Train on 180000 samples
Epoch 17/17
180000/180000 [==============================] - 366s 2ms/sample - loss: 0.0858 - accuracy: 0.9708 - AUC: 0.9943
14
Train on 180000 samples
Epoch 18/18
180000/180000 [==============================] - 371s 2ms/sample - loss: 0.0826 - accuracy: 0.9717 - AUC: 0.9947
15
Train on 180000 samples
Epoch 19/19
180000/180000 [==============================] - 366s 2ms/sample - loss: 0.0818 - accuracy: 0.9722 - AUC: 0.9947
16
Train on 180000 samples
Epoch 20/20
180000/180000 [==============================] - 366s 2ms/sample - loss: 0.0824 - accuracy: 0.9724 - AUC: 0.9946
17
Train on 180000 samples
Epoch 21/21
180000/180000 [==============================] - 372s 2ms/sample - loss: 0.0815 - accuracy: 0.9720 - AUC: 0.9949
18
Train on 180000 samples
Epoch 22/22
180000/180000 [==============================] - 371s 2ms/sample - loss: 0.0816 - accuracy: 0.9727 - AUC: 0.9946
19
Train on 180000 samples
Epoch 23/23
180000/180000 [==============================] - 379s 2ms/sample - loss: 0.0809 - accuracy: 0.9728 - AUC: 0.9949
In [0]:
result = model.predict(X_test, batch_size=batch_size*16, verbose=0)
df = pd.DataFrame()
df['Id'] = range(1, len(X_test) + 1)
df['Probability'] = result
df.to_csv('night_sgd.csv', index=None)
In [0]:
model.fit(X_train, y, batch_size=batch_size, epochs=3, validation_split=0.1,verbose=1,
          initial_epoch=0,
        callbacks = [
            ModelSaveCallback(model_filename),
            ModelPredictCallback(predict_filename),
        ],
        )
Train on 3240000 samples, validate on 360000 samples
Epoch 1/3
1728000/3240000 [===============>..............] - ETA: 26:15 - loss: 0.0762 - accuracy: 0.9743 - AUC: 0.9953
In [0]: