【问题标题】:Keras model only working with Sigmoid activationKeras 模型仅适用于 Sigmoid 激活
【发布时间】:2019-10-05 22:55:26
【问题描述】:

我正在构建一个 Keras 模型,将数据分类为 9 个类别之一。问题是它只适用于为二进制输出设计的 Sigmoid 激活,其他激活导致 0 精度。我需要更改哪些内容才能将其分类到每个标签中?

#Reshape data to add new dimension
X_train = X_train.reshape((100, 150, 1)) 
Y_train = X_train.reshape((100, 1, 1)) 
model = Sequential() 
model.add(Conv1d(1, kernel_size=3, activation='relu', input_shape=(None, 1))) 
model.add(Dense(1)) 
model.add(Activation('sigmoid')) 

model.compile(loss='categorical_hinge', optimizer='adam', metrics=['accuracy']) 
model.fit(x=X_train,y=Y_train, epochs=200, batch_size=20)

【问题讨论】:

  • 下次请务必花一分钟时间学习如何正确格式化您的代码(这次为您完成);另外,Y_train = X_train.reshape((100, 1, 1)) 是拼写错误还是实际错误(应该是 Y_train.reshape((100, 1, 1)))?你的Y 数据是一次性编码的吗?

标签: python machine-learning keras tf.keras


【解决方案1】:

单单元密集层不是我们在多类分类的情况下使用的;您应该首先确保您的 Y 数据是一次性编码的 - 如果没有,您可以使用 Keras 实用程序函数进行编码:

num_classes=9
Y_train = keras.utils.to_categorical(Y_train, num_classes)

然后将最后一层更改为:

model.add(Dense(num_classes)) 
model.add(Activation('softmax')) 

另外,如果您没有任何具体理由使用分类铰链损失,我建议您在模型编译中从 loss='categorical_crossentropy' 开始。

也就是说,您的模型似乎太简单了,您可能想尝试添加更多层...

【讨论】:

  • 感谢您的建议,对机器学习还是很陌生。我很快就会给它添加层,我只是想让一个初始模型工作。
  • @JohnWills 不客气;如果答案解决了您的问题,请接受 - 请参阅 What should I do when someone answers my question? - 谢谢
  • @desertnaught 谢谢,这行得通,但我现在收到“ValueError:检查目标时出错:预期activation_1 具有形状(无,9)但得到了形状为(9,1)的数组。有关如何解决此问题的任何建议?
  • @JohnWills 请针对与最初问题不同的任何问题打开一个新问题
猜你喜欢
  • 2020-12-05
  • 2018-08-14
  • 2018-10-04
  • 2018-09-20
  • 1970-01-01
  • 2021-03-23
  • 1970-01-01
  • 2018-04-15
  • 1970-01-01
相关资源
最近更新 更多