使用Inceptionv3进行错误分类

我使用了一个预先训练权重的Inception模型,并添加了几个密集层,使用由TENSORFLOW IN PRACTICE导师Laurence Moroney提供的数据集来区分马和人。我认为模型已经训练得很完美,但它的预测结果总是马。

enter image description here

上图清楚地显示准确率相当不错。

我用来实时上传图像到colab并进行预测的代码如下:

    import numpy as np    from google.colab import files    from keras.preprocessing import image        uploaded = files.upload()        for fn in uploaded.keys():           # predicting images      path = '/content/' + fn      img = image.load_img(path, target_size=(150, 150))      x = image.img_to_array(img)      x = np.expand_dims(x, axis=0)          images = np.vstack([x])      classes = model.predict(images, batch_size=10)      print(classes[0])      if classes[0]>0.5:        print(fn + " is a horse")      else:        print(fn + " is a human")

用于训练模型的代码如下:

!wget --no-check-certificate \  https://storage.googleapis.com/mledu-datasets/inception_v3_weights_tf_dim_ordering_tf_kernels_notop.h5 \  -O /tmp/inception_v3_weights_tf_dim_ordering_tf_kernels_notop.h5local_weights = '/tmp/inception_v3_weights_tf_dim_ordering_tf_kernels_notop.h5'from tensorflow.keras.applications.inception_v3 import InceptionV3pre_trained_model = InceptionV3(include_top = False,                                weights = None,                                input_shape = (150, 150, 3))pre_trained_model.load_weights(local_weights)for layer in pre_trained_model.layers:  layer.trainable = Falselast_layer = pre_trained_model.get_layer('mixed7')print(last_layer.output_shape)last_output = last_layer.outputimport tensorflow as tffrom tensorflow.keras import layersfrom tensorflow.keras import Modelfrom tensorflow.keras.optimizers import RMSpropx = layers.Flatten()(last_output)x = layers.Dense(1024, activation = 'relu')(x)x = layers.Dropout(0.2)(x)x = layers.Dense(1, activation = 'sigmoid')(x)model = Model(pre_trained_model.input, x)model.compile(optimizer = RMSprop(lr=0.0001),              loss = 'binary_crossentropy',              metrics = ['accuracy'])!wget --no-check-certificate https://storage.googleapis.com/laurencemoroney-blog.appspot.com/horse-or-human.zip -O /tmp/horse-or-human.zip# Get the Horse or Human Validation dataset!wget --no-check-certificate https://storage.googleapis.com/laurencemoroney-blog.appspot.com/validation-horse-or-human.zip -O /tmp/validation-horse-or-human.zip   import zipfileimport oslocal_zip = '/tmp/horse-or-human.zip'ref_zip = zipfile.ZipFile(local_zip, 'r')ref_zip.extractall('/tmp/train')ref_zip.close()local_zip = '/tmp/validation-horse-or-human.zip'ref_zip = zipfile.ZipFile(local_zip, 'r')ref_zip.extractall('/tmp/validate')ref_zip.close()train_dir = '/tmp/train'validate_dir = '/tmp/validate'from tensorflow.keras.preprocessing.image import ImageDataGeneratortrain_datagen = ImageDataGenerator(rescale = 1./255,                                   width_shift_range = 0.2,                                   height_shift_range = 0.2,                                   rotation_range = 0.2,                                   shear_range = 0.2,                                   horizontal_flip = True,                                   zoom_range = 0.2)training_generator = train_datagen.flow_from_directory(train_dir,                                                       target_size = (150, 150),                                                       class_mode = 'binary',                                                       batch_size = 64)test_datagen = ImageDataGenerator(rescale = 1./255)validation_generator = test_datagen.flow_from_directory(validate_dir,                                                        target_size = (150, 150),                                                        class_mode = 'binary',                                                        batch_size = 64)history = model.fit_generator(training_generator,                    validation_data = validation_generator,                    epochs = 20,                    verbose = 2,                    )

回答:

  1. 主要问题:原因是缺少重新缩放。当使用图像数据生成器时,会给出重新缩放因子。然而,当手动上传图像时,缺少重新缩放的代码。你需要添加x = x/255.0

  2. 你需要使用classes<0.5。所以如果概率大于0.5,我们将其分类为人,而不是你指定的马。你可以通过training_generator.class_indices来检查,这会给你:

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注