我使用了一个预先训练权重的Inception模型,并添加了几个密集层,使用由TENSORFLOW IN PRACTICE导师Laurence Moroney提供的数据集来区分马和人。我认为模型已经训练得很完美,但它的预测结果总是马。
上图清楚地显示准确率相当不错。
我用来实时上传图像到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, )
回答:
-
主要问题:原因是缺少重新缩放。当使用图像数据生成器时,会给出重新缩放因子。然而,当手动上传图像时,缺少重新缩放的代码。你需要添加
x = x/255.0
。 -
你需要使用
classes<0.5
。所以如果概率大于0.5,我们将其分类为人,而不是你指定的马。你可以通过training_generator.class_indices
来检查,这会给你: