【问题标题】:How can i predict images(outside dataset) using VGG16 with keras after training?训练后如何使用带有 keras 的 VGG16 预测图像(外部数据集)?
【发布时间】:2019-12-14 00:32:53
【问题描述】:

我已经使用 keras 和我自己的数据集训练了 VGG16 网络,该数据集有 10 个类。所以我用 10 个类修改了激活层。

这里是代码

TRAIN_DIR = "D:\\Dataset\\training"   
VALIDATION_DIR = "D:\\Dataset\\validation"

第 2 部分

   from keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_img
IMAGE_WIDTH = 300
IMAGE_HEIGHT = 300
BATCH_SIZE = 16

第三部分

train_datagen = ImageDataGenerator(rescale=1./255,      
                                    rotation_range=40,      
                                    width_shift_range=0.2,
                                    height_shift_range=0.2,
                                    shear_range=0.2,
                                    zoom_range=0.2,
                                    horizontal_flip=True, 
                                    fill_mode='nearest'
                                  )

validation_datagen = ImageDataGenerator(rescale=1./255, 
                                  )

train_generator = train_datagen.flow_from_directory(TRAIN_DIR, 
                                                    target_size=(IMAGE_WIDTH, IMAGE_HEIGHT), 
                                                    batch_size = BATCH_SIZE, 
                                                    shuffle=True, # By shuffling the images we add some randomness and prevent overfitting
                                                    class_mode="categorical")

validation_generator = validation_datagen.flow_from_directory(VALIDATION_DIR, 
                                                    target_size=(IMAGE_WIDTH, IMAGE_HEIGHT), 
                                                    batch_size = BATCH_SIZE, 
                                                    shuffle=True,
                                                    class_mode="categorical")

第四部分

training_samples = 1097
validation_samples = 272
total_steps = training_samples // BATCH_SIZE

加载 VGG16

#VGG16 network with pretrained weights is used

from keras.applications import vgg16
model = vgg16.VGG16(weights='imagenet', include_top=False, input_shape=(IMAGE_WIDTH, IMAGE_HEIGHT, 3), pooling="max")

for layer in model.layers[:-5]:
        layer.trainable = False

for layer in model.layers:
    print(layer, layer.trainable)

第五部分

from keras.layers import Dense, GlobalAveragePooling2D, Dropout
from keras.models import Model, Sequential

# Although this part can be done also with the functional API, I found that for this simple models, this becomes more intuitive
transfer_model = Sequential()
for layer in model.layers:
    transfer_model.add(layer)
transfer_model.add(Dense(512, activation="relu")) 
transfer_model.add(Dropout(0.5))
transfer_model.add(Dense(10, activation="softmax")) 

第六部分

# Adam optimizer and learning rate 0.0001

from keras import optimizers
adam = optimizers.Adam(lr=0.0001, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.00001)

transfer_model.compile(loss="categorical_crossentropy",
                      optimizer=adam,
                      metrics=["accuracy"])

训练结束

model_history = transfer_model.fit_generator(train_generator, steps_per_epoch=training_samples // BATCH_SIZE,
                                            epochs=25,
                                            validation_data=validation_generator,
                                            validation_steps=validation_samples // BATCH_SIZE)

第 7 部分,使用来自互联网的一些随机图像进行预测

test_path = "D:\\Dataset\\predict\\"
test_datagen = ImageDataGenerator(rescale=1./255,      
                                    rotation_range=40,      
                                    width_shift_range=0.2,
                                    height_shift_range=0.2,
                                    shear_range=0.2,
                                    zoom_range=0.2,
                                    horizontal_flip=True, 
                                    fill_mode='nearest'
                                  )



test_generator = test_datagen.flow_from_directory(test_path, 
                                                    target_size=(IMAGE_WIDTH, IMAGE_HEIGHT), 
                                                    batch_size = 50, 
                                                    class_mode="categorical")
enter code here

在这部分我试图预测,但得到这种数字却没有得到我想要的实际预测结果作为图像

pred = model.predict_generator(test_generator, steps=1)
print(pred)

结果是这样的,但我希望这些是真实的图像,但不知道如何。

【问题讨论】:

  • 你要输出图片吗?
  • @NicolasGervais 是的,我想检查训练后的模型是否可以识别图像类,我尝试了几种方法,有时它说预期激活有 4 个维度,但得到了形状为 (1, 256, 256, 3)

标签: python tensorflow keras vgg-net


【解决方案1】:

您无法从您的网络中输出图像,也不清楚您想象它会如何工作 - 图像是输入,输出是一个数字列表,每个类别有一个值。您可以将这些数字解释为图像包含该类对象的概率。

然后,您可以找到最有可能的课程(例如,使用 argmax 函数)并根据需要显示该课程的图像 - 但这必须单独完成。

注意 - 您正在使用原始模型而不是 transfer_model 运行预测:

pred = model.predict_generator(test_generator, steps=1)

您应该使用经过训练的迁移模型来获得类别预测,这将采用 10 个概率的向量形式,每个类别一个值。

【讨论】:

    猜你喜欢
    • 2019-12-30
    • 2019-06-22
    • 2020-02-11
    • 2021-11-08
    • 1970-01-01
    • 1970-01-01
    • 2021-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多