使用预训练模型时如何在R中应用keras图像预处理

时间:2018-07-03 08:00:12

标签: r keras

我正在尝试训练一个模型,以识别图片中存在哪种水果。它们可以被多重标记(例如同一图像中的香蕉和苹果)。 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),这是我想要的,但是当我稍后在模型中运行它时,它看起来精度较低,我不确定是什么错误。请帮忙谢谢。

1 个答案:

答案 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
}