我正在尝试训练一个模型,以识别图片中存在哪种水果。它们可以被多重标记(例如同一图像中的香蕉和苹果)。 100行数据(水果)存储在一个csv文件中,前几行看起来像这样:
Key Banana Apple Orange img_path
1 0 0 1 data/121.jpg
2 0 1 1 data/228.jpg
3 1 0 1 data/368.jpg
...
我要采取的方法是在使用特征训练我的keras模型之前,使用预先训练的模型(InceptionV3)提取特征。下面的代码工作正常,以后我可以得到想要训练模型的信息。
fruit_model <- application_inception_v3(weights = 'imagenet', include_top = F,
input_shape = c(150, 150, 3))
freeze_weights(fruit_model)
extract_features <- function(img_path) {
img <- image_load(img_path, target_size = c(150,150))
x <- image_to_array(img)
x <- array_reshape(x, c(1, dim(x)))
x <- inception_v3_preprocess_input(x)
output <- predict(fruit_model, x)
output
}
all_fruit_features <- array(data = 0.1, dim = c(nrow(fruit), 3, 3, 2048))
for (i in 1:nrow(fruit)) {
all_fruit_features[i, , , ] <- extract_features(fruit$img_path[i])
}
# The all_fruit_features is an array with dim = (100,3,3,2048) which is the numpy array (x) that i use when fitting my model later on
但是,由于我只有100行数据(这对于训练深度学习模型来说太少了),我希望通过使用keras图像处理来拥有更多数据。我希望通过应用方向更改来生成更多具有相同图像的图像(1张图像变为5张图像)。我在下面尝试了类似的方法,但是当我用新的numpy数组拟合模型时,我的精度较低,因此我认为我的代码在下面做错了什么。我不确定这是什么。
datagen = image_data_generator(
rotation_range=20,
width_shift_range=0.2,
height_shift_range=0.2,
horizontal_flip=T)
extract_features <- function(img_path) {
img <- image_load(img_path, target_size = c(150,150))
x <- image_to_array(img)
x <- array_reshape(x, c(1, dim(x)))
x <- inception_v3_preprocess_input(x)
output <-predict_generator(fruit_model, flow_images_from_data(x , generator=datagen) ,steps = 10)
output
}
all_fruit_features <- array(data = 0.1, dim = c(nrow(fruit)*10, 3, 3, 2048))
for (i in 1:nrow(fruit)) {
for (j in 1:10){
lol <- extract_features(fruit$img_path[i])
all_fruit_features[j+(i-1)*10, , , ] <- array_reshape(lol[j], c(1,
dim(lol[j])))
}
}
这里的all_fruit_features是一个数组,其中包含dim =(1000,3,3,2048),这是我想要的,但是当我稍后在模型中运行它时,它看起来精度较低,我不确定是什么错误。请帮忙谢谢。
答案 0 :(得分:0)
问题已解决。在以上代码中,predict_generator的参数无法正常工作。追加了更新的代码。
extract_features <- function(img_path) {
img <- image_load(img_path, target_size = c(150,150))
x <- image_to_array(img)
x <- array_reshape(x, c(1, dim(x)))
x <- inception_v3_preprocess_input(x)
output <- predict_generator(fruit_model,flow_images_from_data(x,generator =
datagen,save_to_dir = 'image_folder',save_format = 'png'),steps=10)
output
}