Как добавить эпохи в сеть Keras в конвейере scikit-learn - PullRequest
0 голосов
/ 31 марта 2020

Я использую код с этого сайта, чтобы помочь мне анализировать твиты, он использует конвейер: https://www.dataquest.io/blog/tutorial-text-classification-in-python-using-spacy/

# Create our list of punctuation marks
punctuations = string.punctuation

# Create our list of stopwords
nlp = spacy.load('en')
stop_words = spacy.lang.en.stop_words.STOP_WORDS

# Load English tokenizer, tagger, parser, NER and word vectors
parser = English()

# Creating our tokenizer function
def spacy_tokenizer(sentence):
    # Creating our token object, which is used to create documents with linguistic annotations.
    mytokens = parser(sentence)

    # Lemmatizing each token and converting each token into lowercase
    mytokens = [ word.lemma_.lower().strip() if word.lemma_ != "-PRON-" else word.lower_ for word in mytokens ]

    # Removing stop words
    mytokens = [ word for word in mytokens if word not in stop_words and word not in punctuations ]

    # return preprocessed list of tokens
    return mytokens


# Custom transformer using spaCy
class predictors(TransformerMixin):
    def transform(self, X, **transform_params):
        # Cleaning Text
        return [clean_text(text) for text in X]

    def fit(self, X, y=None, **fit_params):
        return self

    def get_params(self, deep=True):
        return {}

# Basic function to clean the text
def clean_text(text):
    # Removing spaces and converting text into lowercase
    return text.strip().lower()


bow_vector = CountVectorizer(tokenizer = spacy_tokenizer, ngram_range=(1,1))

x = tweets['text']
Y = tweets['target']
x_train, x_test, Y_train, Y_test = model_selection.train_test_split(x, Y, test_size = 0.2)

#This part I figured out on my own:

from keras import Sequential
from keras.layers import Dense
classifier = Sequential()
#First Hidden Layer
classifier.add(Dense(500, activation='relu', kernel_initializer='random_normal', input_dim=19080))
#Second  Hidden Layer
classifier.add(Dense(500, activation='relu', kernel_initializer='random_normal'))
#Output Layer
classifier.add(Dense(1, activation='sigmoid', kernel_initializer='random_normal'))

classifier.compile(optimizer ='adam',loss='binary_crossentropy', metrics =['accuracy'])
# Create pipeline using Bag of Words
pipe = Pipeline([("cleaner", predictors()),
                 ('vectorizer', bow_vector),
                 ('classifier', classifier)])

# model generation
pipe.fit(x_train, Y_train)

Моя проблема в том, что я хочу сделать это:

classifier.fit(X_train,y_train, batch_size=5, epochs=200)

Но я не могу заставить его работать с конвейером. Я могу управлять этим без этого, и он прекрасно работает только с одной эпохой. Но я уверен, что получу лучшую точность с большим количеством эпох, чем одна.

1 Ответ

1 голос
/ 31 марта 2020

Вы должны использовать оболочку scikit-learn:

from keras.wrappers.scikit_learn import KerasClassifier

def create_network():
    network = Sequential()
    network.add(Dense(500, activation='relu', kernel_initializer='random_normal', input_dim=19080))
    network.add(Dense(500, activation='relu', kernel_initializer='random_normal'))
    network.add(Dense(1, activation='sigmoid', kernel_initializer='random_normal'))

    network.compile(loss='binary_crossentropy', 
                    optimizer='adam', 
                    metrics=['accuracy']) 

    return network

classifier = KerasClassifier(build_fn=create_network, 
                                 epochs=10, 
                                 batch_size=100, 
                                 verbose=0)

и использовать classifier, показанный выше в своем конвейере, в котором вы можете определить как epochs, так и batch_size.

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