猫狗数据集分类(97%的准确率,tensorflow)

发布于:2023-01-16 ⋅ 阅读:(429) ⋅ 点赞:(0)
import matplotlib.pyplot as plt
import numpy as np
import os
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.preprocessing import image_dataset_from_directory

#您将使用包含数千个猫和狗图像的数据集
_URL = 'https://storage.googleapis.com/mledu-datasets/cats_and_dogs_filtered.zip'
path_to_zip = tf.keras.utils.get_file('cats_and_dogs.zip', origin=_URL, extract=True)
PATH = os.path.join(os.path.dirname(path_to_zip), 'cats_and_dogs_filtered')

train_dir = os.path.join(PATH, 'train')
validation_dir = os.path.join(PATH, 'validation')

BATCH_SIZE = 32
IMG_SIZE = (150, 150)

train_dataset = image_dataset_from_directory(train_dir,
                                             shuffle=True,
                                             batch_size=BATCH_SIZE,
                                             image_size=IMG_SIZE)

validation_dataset = image_dataset_from_directory(validation_dir,
                                                  shuffle=True,
                                                  batch_size=BATCH_SIZE,
                                                  image_size=IMG_SIZE)


"""
由于原始数据集不包含测试集,因此您需要创建一个。
为此,请使用 tf.data.experimental.cardinality 确定验证集中有多少批次的数据,
然后将其中的 20% 移至测试集。
"""
val_batches = tf.data.experimental.cardinality(validation_dataset)
test_dataset = validation_dataset.take(val_batches // 5)
validation_dataset = validation_dataset.skip(val_batches // 5)


#使用缓冲预提取从磁盘加载图像,以免造成 I/O 阻塞
AUTOTUNE = tf.data.AUTOTUNE

train_dataset = train_dataset.prefetch(buffer_size=AUTOTUNE)
validation_dataset = validation_dataset.prefetch(buffer_size=AUTOTUNE)
test_dataset = test_dataset.prefetch(buffer_size=AUTOTUNE)

"""
当您没有较大的图像数据集时,最好将随机但现实的转换应用于训练图像
(例如旋转或水平翻转)来人为引入样本多样性。
这有助于使模型暴露于训练数据的不同方面并减少过拟合
"""
data_augmentation = tf.keras.Sequential([
  tf.keras.layers.experimental.preprocessing.RandomFlip('horizontal'),
  tf.keras.layers.experimental.preprocessing.RandomRotation(0.2),
])


rescale = tf.keras.layers.experimental.preprocessing.Rescaling(1./127.5, offset= -1)


# Create the base model from the pre-trained model MobileNet V2
base_model = tf.keras.applications.Xception(input_shape=(150,150,3),
                                            include_top=False,
                                            weights='imagenet')
inputs = tf.keras.Input(shape=(160, 160, 3))
x = data_augmentation(inputs)
x = rescale(x)
x = base_model(x, training=False)
x = keras.layers.GlobalAveragePooling2D()(x)
x = keras.layers.Dropout(0.2)(x)  # Regularize with dropout
outputs = keras.layers.Dense(1)(x)
model = keras.Model(inputs, outputs)

model.summary()


base_learning_rate = 0.0001
model.compile(optimizer=tf.keras.optimizers.Adam(lr=base_learning_rate),
              loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),
              metrics=['accuracy'])


history = model.fit(train_dataset,
                    epochs=initial_epochs,
                    validation_data=validation_dataset)


acc = history.history['accuracy']
val_acc = history.history['val_accuracy']

%config InlineBackend.figure_format = 'retina'
loss = history.history['loss']
val_loss = history.history['val_loss']

plt.figure(figsize=(8, 8))
plt.subplot(2, 1, 1)
plt.plot(acc, label='Training Accuracy')
plt.plot(val_acc, label='Validation Accuracy')
plt.legend(loc='lower right')
plt.ylabel('Accuracy')
plt.ylim([min(plt.ylim()),1])
plt.title('Training and Validation Accuracy')

plt.subplot(2, 1, 2)
plt.plot(loss, label='Training Loss')
plt.plot(val_loss, label='Validation Loss')
plt.legend(loc='upper right')
plt.ylabel('Cross Entropy')
plt.ylim([0,1.0])
plt.title('Training and Validation Loss')
plt.xlabel('epoch')
plt.show()


base_model.trainable = True

fine_tune_epochs = 10
total_epochs =  initial_epochs + fine_tune_epochs

history_fine = model.fit(train_dataset,
                         epochs=total_epochs,
                         initial_epoch=history.epoch[-1],
                         validation_data=validation_dataset)

acc += history_fine.history['accuracy']
val_acc += history_fine.history['val_accuracy']

loss += history_fine.history['loss']
val_loss += history_fine.history['val_loss']

plt.figure(figsize=(8, 8))
plt.subplot(2, 1, 1)
plt.plot(acc, label='Training Accuracy')
plt.plot(val_acc, label='Validation Accuracy')
plt.ylim([0.8, 1])
plt.plot([initial_epochs-1,initial_epochs-1],
          plt.ylim(), label='Start Fine Tuning')
plt.legend(loc='lower right')
plt.title('Training and Validation Accuracy')

plt.subplot(2, 1, 2)
plt.plot(loss, label='Training Loss')
plt.plot(val_loss, label='Validation Loss')
plt.ylim([0, 1.0])
plt.plot([initial_epochs-1,initial_epochs-1],
         plt.ylim(), label='Start Fine Tuning')
plt.legend(loc='upper right')
plt.title('Training and Validation Loss')
plt.xlabel('epoch')
plt.show()

loss, accuracy = model.evaluate(test_dataset)
print('Test accuracy :', accuracy)

#Retrieve a batch of images from the test set
image_batch, label_batch = test_dataset.as_numpy_iterator().next()
predictions = model.predict_on_batch(image_batch).flatten()

# Apply a sigmoid since our model returns logits
predictions = tf.nn.sigmoid(predictions)
predictions = tf.where(predictions < 0.5, 0, 1)

print('Predictions:\n', predictions.numpy())
print('Labels:\n', label_batch)

plt.figure(figsize=(10, 10))
for i in range(9):
  ax = plt.subplot(3, 3, i + 1)
  plt.imshow(image_batch[i].astype("uint8"))
  plt.title(class_names[predictions[i]])
  plt.axis("off")
Epoch 1/10
63/63 [==============================] - 85s 1s/step - loss: 0.6776 - accuracy: 0.5960 - val_loss: 0.5125 - val_accuracy: 0.7129
Epoch 2/10
63/63 [==============================] - 87s 1s/step - loss: 0.4962 - accuracy: 0.7325 - val_loss: 0.3605 - val_accuracy: 0.8119
Epoch 3/10
63/63 [==============================] - 87s 1s/step - loss: 0.3960 - accuracy: 0.8040 - val_loss: 0.2763 - val_accuracy: 0.8911
Epoch 4/10
63/63 [==============================] - 87s 1s/step - loss: 0.3465 - accuracy: 0.8465 - val_loss: 0.2305 - val_accuracy: 0.9047
Epoch 5/10
63/63 [==============================] - 89s 1s/step - loss: 0.3005 - accuracy: 0.8680 - val_loss: 0.1978 - val_accuracy: 0.9295
Epoch 6/10
63/63 [==============================] - 90s 1s/step - loss: 0.2756 - accuracy: 0.8720 - val_loss: 0.1798 - val_accuracy: 0.9381
Epoch 7/10
63/63 [==============================] - 89s 1s/step - loss: 0.2651 - accuracy: 0.8855 - val_loss: 0.1607 - val_accuracy: 0.9455
Epoch 8/10
63/63 [==============================] - 88s 1s/step - loss: 0.2473 - accuracy: 0.8955 - val_loss: 0.1514 - val_accuracy: 0.9505
Epoch 9/10
63/63 [==============================] - 89s 1s/step - loss: 0.2415 - accuracy: 0.8980 - val_loss: 0.1448 - val_accuracy: 0.9567
Epoch 10/10
63/63 [==============================] - 89s 1s/step - loss: 0.2337 - accuracy: 0.8985 - val_loss: 0.1319 - val_accuracy: 0.9616

 

 


网站公告

今日签到

点亮在社区的每一天
去签到