我正在尝试使用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%,这完全没有意义。我在做错什么吗?
答案 0 :(得分:1)
对于多类分类,您需要将损失切换为“ categorical_crossentropy”或将指标更改为“ crossentropy”。
在Keras中,“准确度”度量标准实际上是模棱两可的-它根据所使用的损失函数来选择二进制或多类准确性。
https://github.com/keras-team/keras/blob/master/keras/engine/training.py#L375
答案 1 :(得分:0)
如果有两个类,则可以在最后一层使用S型激活和二进制交叉熵损失函数。但是,如果您有多个类,则必须用softmax替换Sigmoid,用绝对交叉熵替换二进制。
根据您的数据分布,模型配置等,可能会导致准确性突然变化的其他原因有很多。