我有一个用于二进制图像分类的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类和第2类的所有类别(猫/狗) 设计超参数或编译以用2类训练预测2(+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类,因为它与其他类概率相比具有最高的概率。