我正在尝试培训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
我正在学习如何使用Keras创建卷积神经网络.我正试图获得MNIST数据集的高精度.
显然categorical_crossentropy是2个以上的课程,binary_crossentropy2个课程.由于有10个数字,我应该使用categorical_crossentropy.然而,经过数十种模型的培训和测试,binary_crossentropy始终表现出色categorical_crossentropy.
在Kaggle,我使用了99 +%的精确度binary_crossentropy和10个时代.同时,categorical_crossentropy即使使用30个时代,我也无法使用97%以上(这不是很多,但我没有GPU,所以训练需要永远).
这就是我的模型现在的样子:
model = Sequential()
model.add(Convolution2D(100, 5, 5, border_mode='valid', input_shape=(28, 28, 1), init='glorot_uniform', activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Convolution2D(100, 3, 3, init='glorot_uniform', activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.3))
model.add(Flatten())
model.add(Dense(100, init='glorot_uniform', activation='relu'))
model.add(Dropout(0.3))
model.add(Dense(100, init='glorot_uniform', activation='relu'))
model.add(Dropout(0.3))
model.add(Dense(10, init='glorot_uniform', activation='softmax'))
model.compile(loss='binary_crossentropy', optimizer='adamax', metrics=['accuracy'])
Run Code Online (Sandbox Code Playgroud) machine-learning neural-network deep-learning conv-neural-network keras
我使用Keras建立了一个模型,然后在3条记录的数据集上对其进行了训练,最后我对两个函数使用了相同的测试集(分别具有100条记录和考虑到两个数据集的大小,它没有关于训练集的任何记录,尽管它可能是相关的。数据集由5个文件组成,其中4个文件分别代表一个不同的温度传感器,每分钟收集60个测量值(每行包含60个测量值),最后一个文件包含我要预测的类标签(特别是, 3类:3、20或100)。
这是我正在使用的模型:
n_sensors, t_periods = 4, 60
model = Sequential()
model.add(Conv1D(100, 6, activation='relu', input_shape=(t_periods, n_sensors)))
model.add(Conv1D(100, 6, activation='relu'))
model.add(MaxPooling1D(3))
model.add(Conv1D(160, 6, activation='relu'))
model.add(Conv1D(160, 6, activation='relu'))
model.add(GlobalAveragePooling1D())
model.add(Dropout(0.5))
model.add(Dense(3, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
Run Code Online (Sandbox Code Playgroud)
我训练的:
self.model.fit(X_train, y_train, batch_size=3, epochs=5, verbose=1)
然后我使用评估:
self.model.evaluate(x_test, y_test, verbose=1)
并预测:
predictions = self.model.predict(data)
result = np.where(predictions[0] == np.amax(predictions[0]))
if result[0][0] == 0:
return '3'
elif result[0][0] == 1:
return '20'
else:
return '100'
Run Code Online (Sandbox Code Playgroud)
对于每个预测的类,我将使用实际的标签来对付它,然后计算正确的猜测/总计示例,这些示例应等效于评估()函数的准确性。这是代码:
correct = 0
for profile in self.profile_file: #profile_file is an opened file …Run Code Online (Sandbox Code Playgroud)