相关疑难解决方法(0)

Keras binary_crossentropy vs categorical_crossentropy性能?

我正在尝试培训CNN按主题对文本进行分类.当我使用binary_crossentropy时,我得到~80%acc,而categorical_crossentrop我得到~50%acc.

我不明白为什么会这样.这是一个多类问题,这是否意味着我必须使用分类,二进制结果是没有意义的?

model.add(embedding_layer)
model.add(Dropout(0.25))
# convolution layers
model.add(Conv1D(nb_filter=32,
                    filter_length=4,
                    border_mode='valid',
                    activation='relu'))
model.add(MaxPooling1D(pool_length=2))
# dense layers
model.add(Flatten())
model.add(Dense(256))
model.add(Dropout(0.25))
model.add(Activation('relu'))
# output layer
model.add(Dense(len(class_id_index)))
model.add(Activation('softmax'))
Run Code Online (Sandbox Code Playgroud)

然后

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
Run Code Online (Sandbox Code Playgroud)

要么

model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
Run Code Online (Sandbox Code Playgroud)

machine-learning neural-network deep-learning conv-neural-network keras

130
推荐指数
7
解决办法
14万
查看次数

Keras:model.evaluate vs model.predict多级NLP任务的准确度差异

我正在使用以下代码在keras中训练一个简单的模型用于NLP任务.变量名称对于训练,测试和验证集是不言自明的.该数据集有19个类,因此网络的最后一层有19个输出.标签也是单热编码的.

nb_classes = 19
model1 = Sequential()
model1.add(Embedding(nb_words,
                     EMBEDDING_DIM,
                     weights=[embedding_matrix],
                     input_length=MAX_SEQUENCE_LENGTH,
                     trainable=False))
model1.add(LSTM(num_lstm, dropout=rate_drop_lstm, recurrent_dropout=rate_drop_lstm))
model1.add(Dropout(rate_drop_dense))
model1.add(BatchNormalization())
model1.add(Dense(num_dense, activation=act))
model1.add(Dropout(rate_drop_dense))
model1.add(BatchNormalization())

model1.add(Dense(nb_classes, activation = 'sigmoid'))


model1.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
#One hot encode all labels
ytrain_enc = np_utils.to_categorical(train_labels)
yval_enc = np_utils.to_categorical(val_labels)
ytestenc = np_utils.to_categorical(test_labels)

model1.fit(train_data, ytrain_enc,
             validation_data=(val_data, yval_enc),
             epochs=200,
             batch_size=384,
             shuffle=True,
             verbose=1)
Run Code Online (Sandbox Code Playgroud)

在第一个时代之后,这给了我这些输出.

Epoch 1/200
216632/216632 [==============================] - 2442s - loss: 0.1427 - acc: 0.9443 - val_loss: 0.0526 - val_acc: 0.9826
Run Code Online (Sandbox Code Playgroud)

然后我在测试数据集上评估我的模型,这也显示我在0.98附近的准确度.

model1.evaluate(test_data, y = ytestenc, batch_size=384, verbose=1)
Run Code Online (Sandbox Code Playgroud)

但是,标签是单热编码的,所以我需要类的预测向量,以便我可以生成混淆矩阵等.所以我使用,

PREDICTED_CLASSES = model1.predict_classes(test_data, …
Run Code Online (Sandbox Code Playgroud)

machine-learning deep-learning keras

15
推荐指数
1
解决办法
2万
查看次数

当损耗是均方误差(MSE)时,什么函数定义了Keras的准确度?

当损失函数是均方误差时,如何定义准确度?是绝对百分比误差吗?

我使用的模型具有输出激活线性和编译 loss= mean_squared_error

model.add(Dense(1))
model.add(Activation('linear'))  # number

model.compile(loss='mean_squared_error', optimizer='adam', metrics=['accuracy'])
Run Code Online (Sandbox Code Playgroud)

输出看起来像这样:

Epoch 99/100
1000/1000 [==============================] - 687s 687ms/step - loss: 0.0463 - acc: 0.9689 - val_loss: 3.7303 - val_acc: 0.3250
Epoch 100/100
1000/1000 [==============================] - 688s 688ms/step - loss: 0.0424 - acc: 0.9740 - val_loss: 3.4221 - val_acc: 0.3701
Run Code Online (Sandbox Code Playgroud)

那么例如val_acc:0.3250是什么意思?Mean_squared_error应该是标量而不是百分比 - 不应该吗?那么val_acc - 均方误差,或平均百分比误差或其他函数?

根据维基百科上的MSE定义:https://en.wikipedia.org/wiki/Mean_squared_error

MSE是估计量质量的度量 - 它总是非负的,接近零的值更好.

这是否意味着价值val_acc: 0.0优于val_acc: 0.325

编辑:我训练时精确度量输出的更多示例 - 随着我训练更多,精度会增加.虽然损失函数 - mse应该减少.是否为mse定义了准确度 - 它是如何在Keras中定义的?

lAllocator: After …
Run Code Online (Sandbox Code Playgroud)

regression machine-learning mean-square-error keras loss-function

15
推荐指数
2
解决办法
8738
查看次数