【问题标题】:Using fit_generator in Keras Model在 Keras 模型中使用 fit_generator
【发布时间】:2019-05-18 10:11:35
【问题描述】:

我正在尝试使用 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%,这完全没有意义。我做错了吗?

【问题讨论】:

  • 为什么你认为这毫无意义?您没有验证数据,因此没有任何信息是否过拟合。
  • @MatiasValdenegro 分两步过拟合?它看到了 64 个示例并且已经过拟合了?
  • 我没有看到任何过度拟合的证据,正如我之前所说,您没有提供有关验证指标的信息。
  • 是的,抱歉,我没有注意到,但我有 10 个完美的训练数据用于验证,我使用相同的 batch_generator 生成它,但在不同的集合上。无论如何,问题是Keras在选择binary_crossentropy时使用的准确性,即binary_accuracy,应该是categorical_accuracy

标签: python keras neural-network sparse-matrix multilabel-classification


【解决方案1】:

如果你有两个类,你可以在最后一层使用 sigmoid 激活和二元交叉熵损失函数。但是,如果你有多个类,那么你必须用 softmax 替换 sigmoid,用分类交叉熵替换 binary。

根据您的数据分布、模型配置等,准确性突然变化可能有多种其他原因。

【讨论】:

  • 不完全是,我试图预测多个输出类,我希望它们都被视为独立的。参考here
  • 明白你的意思。您可以通过多种方式解决此问题:(1) 使用 MSE 损失函数,其中 batch_generator 应将 'y_batch' 中每个类的概率返回为 [0, 1, 0, 1]。在这种情况下,每个输出将被推向零或一个,这将模拟该类的概率。 (2) 您可以使用自定义损失函数,您必须独立计算每个类的二元交叉熵,然后将所有损失添加为梯度的总函数。
【解决方案2】:

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

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

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

【讨论】:

  • 因为我希望所有类都被视为独立类,所以我使用 binary_crossentropy。请参阅this 了解更多说明
猜你喜欢
  • 2019-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-06
  • 2020-04-25
  • 2019-10-27
  • 2021-11-20
  • 1970-01-01
相关资源
最近更新 更多