我想使用预训练模型(如InceptionV1/V3)进行图像分类。
因此,我在ML.NET中设置了一个管道来加载这个TensorFlow模型。但是在我找到的每个教程中都提到,你需要在加载后训练这个模型才能得到一个模型。
例如,这里:https://learn.microsoft.com/en-US/dotnet/machine-learning/tutorials/image-classification
=> 使用上面加载的数据训练模型:=> ITransformer model = pipeline.Fit(trainingData);
为什么不能在没有训练数据的情况下直接调用Fit()呢?因为我只想使用原始加载的模型而不做任何修改。它已经被谷歌用数百万张图片训练过,应该足以满足我所有的需求了。
谢谢你的建议!
回答:
你不需要再次训练模型。只要加载它,然后使用它进行预测。需要注意的是,模型是在ImageNet数据集上训练的。这个数据集有1000个类别。你的图像类型可能包含在这些类别中,也可能不包含。为了使模型适应你的应用,你应该使用你的自定义数据集进行训练。例如,如果你有一个包含250种鸟类的训练集,每个类别有一个单独的目录,并且你想对鸟类进行分类,那么你应该按以下方式使用Inception模型。
img_size= (224,224) # 将此设置为你想要使用的图像大小
img_shape=(224,224,3) # 将此设置为输入图像的形状
no_of_classes =250 # 将此设置为类别的整数值
train_dir=r'c:\birds\train' # 指向你的训练目录
t_gen=ImageDataGenerator(preprocessing_function=tf.keras.applications.inception_v3.preprocess_input, validation_split=0.3)
train_gen=t_gen.flow_from_directory( directory= train_dir, target_size=img_size, class_mode="categorical", batch_size=32, shuffle=True, seed=123, subset='training')
valid_gen=t_gen.flow_from_directory(directory= train_dir, target_size=img_size, class_mode="categorical", batch_size=32, shuffle=False, seed=123, subset='validation')
base_model=tf.keras.applications.InceptionV3( include_top=False, weights="imagenet", input_shape=img_shape, pooling='max')
x=base_model.output
x= Dense(512, activation='relu')(x)
x= Dropout(.3)(x)
output=Dense(no_of_classes, activation='softmax')(x)
model=Model(inputs=base_model.input, outputs=output)
model.compile(Adam(lr=.001), loss='categorical_crossentropy', metrics=['accuracy'])
history=model.fit(x=train_gen, epochs=20, verbose=2, validation_data=valid_gen, shuffle=False, initial_epoch=0)