pdu*_*ois 4 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)
Run Code Online (Sandbox Code Playgroud)
在predict(x)
给出一个概率,它可以让我们推断它是一个猫或狗.
我只有训练数据两个类:猫/狗.有没有办法可以修改代码compile()
或超参数构造,以便为它吐出3个概率
第三类是不属于第1类和第2类的所有类(cat/dog)用于设计超参数或编译用于预测2(+1其他)类数据和2类训练的策略
我觉得你的问题可能在于构建网络:
# Hyperparameter construction
model <- keras_model_sequential() %>%
conv_base %>%
layer_flatten() %>%
layer_dense(units = 256, activation = "relu") %>%
layer_dense(units = 1, activation = "sigmoid")
Run Code Online (Sandbox Code Playgroud)
最后一层使用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")
Run Code Online (Sandbox Code Playgroud)
如评论中所标记的那样 - 网络丢失功能也需要更改.二元熵方程仅假设预测和观察的单个向量,而在该架构中不是这种情况.
model %>% compile(
loss = "categorical_crossentropy",
optimizer = optimizer_rmsprop(lr = 2e-5),
metrics = c("accuracy")
)
Run Code Online (Sandbox Code Playgroud)
更新
您正试图捕获3个可能的输出.属于A,B级或两者都不属于的可能性.您的标签矢量应如下所示:
Class A = [1, 0, 0]
Class B = [0, 1, 0]
Class C (! A || B) = [0, 0, 1]
Run Code Online (Sandbox Code Playgroud)
分配C类似乎是合乎逻辑的,[0, 0]
但这有问题,给出了'softmax'的工作原理.每个训练案例都有可能属于每个类别.因此,A类的训练示例可以被赋予30%的属于B类的概率.类预测基本上是投票.
即我预测此示例属于A类,因为它与其他类概率相比具有最高概率.