将Keras模型从二进制分类更改为多重分类

时间:2020-07-14 20:42:57

标签: tensorflow machine-learning keras neural-network data-science

我有以下型号

model = models.Sequential()
model.add(layers.Conv1D(filters=unitsNumber, kernel_size=3, activation='relu', input_shape=(61,1)))
model.add(layers.ZeroPadding1D(padding=1))
model.add(layers.Conv1D(filters=unitsNumber, kernel_size=3, activation='relu'))
model.add(layers.MaxPooling1D(pool_size=2))
model.add(layers.Flatten())  # now output shape == (None, 1160)
model.add(layers.Dense(unitsNumber, activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))  #sortie binaire
model.summary()

这给了我这个总结

Model: "sequential_8"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv1d_15 (Conv1D)           (None, 59, 40)            160       
_________________________________________________________________
zero_padding1d_8 (ZeroPaddin (None, 61, 40)            0         
_________________________________________________________________
conv1d_16 (Conv1D)           (None, 59, 40)            4840      
_________________________________________________________________
max_pooling1d_8 (MaxPooling1 (None, 29, 40)            0         
_________________________________________________________________
flatten_8 (Flatten)          (None, 1160)              0         
_________________________________________________________________
dense_15 (Dense)             (None, 40)                46440     
_________________________________________________________________
dense_16 (Dense)             (None, 1)                 41        
=================================================================
Total params: 51,481
Trainable params: 51,481
Non-trainable params: 0

我用这个分类器

model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['accuracy'])

我给我的准确度是87%,目标变量是两组之一。

但是,我想更改数据集并创建更多具有相同数据的组,而不仅仅是两个。

因此,与其尝试预测1或0的输出,还不如说输出的值可以是0到8之间的任意一个数值(共9组)。

我确实计划更改组的数量,以便在准确性与组大小之间进行权衡,因为组的数量越多,分类就越困难。

我尝试了以下分类器

model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['acc']) model.compile(optimizer='sgd',loss='binary_crossentropy',metrics=['acc']) model.compile(optimizer='Nadam',loss='binary_crossentropy',metrics=['acc'])

但是出现以下错误:

UnknownError: Failed to get convolution algorithm. This is probably because cuDNN failed to initialize, so try looking to see if a warning log message was printed above.
 [[{{node conv1d_7/convolution/Conv2D}}]]
 [[{{node metrics_3/acc/Mean_1}}]]

我不确定问题出在哪里,但是我相信我可能在多分类问题上使用了错误类型的模型。如果有人能指出我正确的方向,将不胜感激。 谢谢

更新:显示如何处理数据:

# Initial Format
X_train.shape


# Shape data for CNN
X_train_values = X_train.values
y_train_values = y_train.values
X_train_values = 
X_train_values.reshape 
((X_train_values.shape[0],X_train_values.shape[1],1))
X_train_values.shape

X_test_values = X_test.values
y_test_values = y_test.values
X_test_values = 
X_test_values.reshape((X_test_values.shape[0],X_test_values.shape[1],1))

unitsNumber = 40

3 个答案:

答案 0 :(得分:2)

您应将最终层激活功能更改为“ softmax”。 最后一层中的节点数应等于您要预测的类数。 (您的情况为9)。

model.add(layers.Dense(9, activation='softmax'))

损失函数应为'categorical_crossentroy'

model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['acc']) 

答案 1 :(得分:1)

最后一个致密层激活

  1. 如果您有两个类别(二进制分类),则应使用onUpload(event) { for (let file of event.files) { console.log(file); this.uploadedFiles.push(file); console.log(this.uploadedFiles); } } 激活
  2. 如果是多类,则应使用sigmoid激活

丢失功能

  1. 如果标签是一种热编码的标签,则应使用softmax
  2. 如果标签被编码为数字(n类分类为0到n-1),则应使用categorical_crossentropy

样品

sparse_categorical_crossentropy

答案 2 :(得分:0)

  1. 二进制分类或逻辑回归问题用于输出0或1(正或负,猫或狗等)。这取决于数据集标签。对于此类问题,您可以在只有1个神经元的输出层中使用交叉熵损失和S形激活。
  2. 另一方面,对于多类分类问题,在输出层中使用softmax,其中密集层数=数据集中的类数。根据标签使用分类或稀疏的交叉熵。
相关问题