首页 > 解决方案 > 在 Keras 模型中使用 fit_generator

问题描述

我正在尝试使用 Keras 和 Tensorflow 后端训练神经网络。我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%,这根本没有意义。难道我做错了什么?

标签: pythonkerasneural-networksparse-matrixmultilabel-classification

解决方案


您需要将损失切换为“categorical_crossentropy”或将指标更改为“crossentropy”以进行多类分类。

在 Keras 的幕后,“准确度”指标实际上是模棱两可的——它根据使用的损失函数选择二元或多类准确度。

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


推荐阅读