如何设计keras神经网络用2类训练预测2(+1而非A不是B)类数据

时间:2018-02-03 13:03:31

标签: r deep-learning keras

我有一个用于二进制图像分类的convnet模型:cat / dog。

library(keras)
conv_base <- application_vgg16(
  weights = "imagenet",
  include_top = FALSE,
  input_shape = c(150, 150, 3)
)

# Hyperparameter construction
model <- keras_model_sequential() %>% 
  conv_base %>%
  layer_flatten() %>% 
  layer_dense(units = 256, activation = "relu") %>% 
  layer_dense(units = 1, activation = "sigmoid")

model %>% compile(
  loss = "binary_crossentropy",
  optimizer = optimizer_rmsprop(lr = 2e-5),
  metrics = c("accuracy")
)


img <- image_load('test_image.jpg', target_size = c(150, 150))
x <- image_to_array(img)
x <- array_reshape(x, c(1, dim(x)))
preds_class <- model %>% predict_classes(x)
model %>% predict(x)

predict(x)给出一个让我们推断出它的概率 猫或狗。

我只有训练数据两类:猫/狗。 有没有办法可以修改compile()或超参数构造的代码 所以它吐出3个概率

  1. cat
  2. non_catdog
  3. 第三类是不属于第1类和第2类的所有类别(猫/狗) 设计超参数或编译以用2类训练预测2(+1其他)类数据的策略

1 个答案:

答案 0 :(得分:6)

我觉得你的问题可能在于构建网络:

# Hyperparameter construction
model <- keras_model_sequential() %>% 
  conv_base %>%
  layer_flatten() %>% 
  layer_dense(units = 256, activation = "relu") %>% 
  layer_dense(units = 1, activation = "sigmoid")

您的最后一层使用sigmoid激活,将输出压缩为[0,1]。我认为你所追求的是softmax激活,因为你有2个以上的课程。

不完全确定keras语法,但可能有以下几点:

model <- keras_model_sequential() %>% 
      conv_base %>%
      layer_flatten() %>% 
      layer_dense(units = 256, activation = "relu") %>% 
      layer_dense(units = 3, activation = "softmax")

在评论中标记 - 网络丢失功能也需要更改。二元熵方程仅假设预测和观察的单个向量,而在该架构中不是这种情况。

model %>% compile(
  loss = "categorical_crossentropy",
  optimizer = optimizer_rmsprop(lr = 2e-5),
  metrics = c("accuracy")
)

<强>更新

您正尝试捕获3个可能的输出。属于A,B级或两者都不属于的可能性。您的标签矢量应如下所示:

Class A = [1, 0, 0] 
Class B = [0, 1, 0] 
Class C (! A || B) = [0, 0, 1] 

将C类指定为[0, 0]似乎是合乎逻辑的,但这有助于给出'softmax'的工作方式。每个训练案例都有一个属于每个类的概率。因此,A类的训练示例可以被赋予30%的属于B类的概率。类预测基本上是投票。

  

即。我预测这个例子属于A类,因为它与其他类概率相比具有最高的概率。