我正在使用带有 VGGnet 的 Keras 模型作为图像分类的基础模型。代码如下:
from keras import applications
from keras.callbacks import TensorBoard
from keras.preprocessing.image import ImageDataGenerator
from keras import optimizers
from keras.models import Sequential, Model
from keras.layers import Dropout, Flatten, Dense
from keras import optimizers
from keras import backend as keras_backend
from keras.callbacks import TensorBoard
from tensorflow.python import debug as tf_debug
inputshape=(224,224,3)
base_model=applications.vgg16.VGG16(weights = "imagenet", include_top=True,input_shape=inputshape)
print (base_model.summary())
new_sequential=Sequential()
print(type(base_model))
for mylayer in base_model.layers:
mylayer.trainable=False#this is done to set the weight as predefined
new_sequential.add(mylayer)
new_sequential.layers.pop()#remove my last layer
new_sequential.add(Dense(output_dim=1,activation='sigmoid'))
new_sequential.compile(optimizer="adam",loss='binary_crossentropy',metrics=['accuracy'])
from keras.preprocessing.image import ImageDataGenerator
train_datagen = ImageDataGenerator(rescale=1./255,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True)
test_datagen = ImageDataGenerator(rescale=1./255)
training_data = train_datagen.flow_from_directory(directory="/home/Basic_1/dataset/training_set/",
target_size=(224, 224),
batch_size=8,
class_mode='binary')
test_validation = test_datagen.flow_from_directory("/home/Basic_1/dataset/test_set/",
target_size=(224, 224),
batch_size=8,
class_mode='binary')
cb=TensorBoard(log_dir=("/home/Basic_1"))
new_sequential.fit_generator(generator=training_data,
steps_per_epoch=200,
epochs=1000,
validation_data=test_validation,
validation_steps=5,callbacks=[cb])
from keras.models import load_model
new_sequential.save('saved_vgg.h5')
new_sequential.save_weights('saved_vgg_weights.h5')
import numpy as np
from keras.preprocessing import image
predict_image_path = "/home/Basic_1/dataset/predict/"
import glob
import os
from keras.preprocessing import image
os.getcwd()
os.chdir(predict_image_path)
images = []
images = glob.glob('*')
for imagepath in images:
test_image=image.load_img(path=predict_image_path+'/'+imagepath,target_size=(224,224))
test_image=image.img_to_array(test_image)
test_image=np.expand_dims(test_image,axis=0)
result=new_sequential.predict(test_image)
print(result)
if (result > 0.5):
print("Image path {}, Obstacle : {}".format(imagepath, result))
else:
print("Image path {}, Lane Follow : {}".format(imagepath, result))
请帮助我澄清以下疑问。
我已经阅读了用于训练模型的
VGGnet用途。ImageNet但在我的情况下,我使用的是来自自定义类的图像,该类不包含在Imagenet. 网络是否能够基于这些自定义类进行训练?我从 ```tensorboard` 看到训练似乎很正常。然而,模型在使用新图像进行推理时失败。
我用来训练的数据集中的图像具有
1000x540维度。但是在这个VGGnet输入形状中(224, 224, 3),图像会在训练期间调整大小吗?
根据给出的答案更新问题:
是的,我正在接受预训练,该预训练
VGGnet是ImageNet针对我的自定义类图像进行训练和训练模型的。(我已经将预训练模型的权重用于卷积层,并从预训练模型中删除了 FC 层并使用了我自己的 FC 层。这对我在这里做的吗?是的,训练损失在减少,准确率在增加。与测试集相同的情况。运行 500 个 epoch 后,我得到了以下准确度和损失。
Training - Accuracy : 0.81 Loss : 0.40
Testing - Accuracy : 0.78 Loss : 0.55
这些图像与ImageNet.
在推理过程中,如果我从训练集中给出图像,模型将无法正确分类。
谢谢你,KK