Использование fit_generator в модели Keras - PullRequest
0 голосов
/ 18 декабря 2018

Я пытаюсь обучить нейронную сеть, используя Keras и Tensorflow backend.Мои X - это текстовые описания, которые я обработал и преобразовал в последовательности.Теперь моя y является разреженной матрицей, поскольку она классифицируется по нескольким меткам, и у меня много выходных классов.

>>> y
<30405x3387 sparse matrix of type '<type 'numpy.int64'>'
    with 54971 stored elements in Compressed Sparse Row format>

Чтобы обучить модель, я попытался определить генератор партии:

def batch_generator(x, y, batch_size=32):
    n_batches_per_epoch = x.shape[0]//batch_size
    for i in range(n_batches_per_epoch):
        index_batch = range(x.shape[0])[batch_size*i:batch_size*(i+1)]       
        x_batch = x[index_batch,:]
        y_batch = y[index_batch,:].todense()
        yield x_batch, np.array(y_batch)

Я разделил свои данные на:

x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=42)

Я определяю свою модель как:

model = Sequential()
# Create architecture, add some layers.
model.add(Dense(num_classes))
model.add(Activation('sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

И я тренирую свою модель как:

model.fit_generator(generator=batch_generator(x_train, y_train), steps_per_epoch=(x_train[0]/32), epochs=200, callbacks=the_callbacks)

Но моя модель начинается с точности около 55%, и она быстро (за 2 или 3 шага) становится 99,95%, что не имеет никакого смысла.Я что-то не так делаю?

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

Если у вас есть два класса, вы можете использовать сигмоидальную активацию в последнем слое и двоичную функцию кросс-энтропийной потери.Но если у вас более одного класса, то вы должны заменить сигмоид на softmax и бинарный с категориальной кросс-энтропией.

Для резкого изменения точности может быть несколько других причин в зависимости от вашего распределения данных, конфигурации модели и т. Д. И т. Д.

0 голосов
/ 18 декабря 2018

Для мультиклассовой классификации вам нужно будет переключить ваш убыток на "categoryorical_crossentropy" или изменить метрику на "кроссцентропию".

Метрика "точности" на самом деле неоднозначна за кулисами в Керасе - она ​​выбирает двоичный кодили мультиклассовая точность на основе используемой функции потерь.

https://github.com/keras-team/keras/blob/master/keras/engine/training.py#L375

...