深度学习之猫狗识别

闲散的猫狗识别,使用新的版本软件会报各种奇奇怪警告提示,发现是需要构建成dataset,在对应官网上的实例写的很分散,这里只是做下汇合,给一个整体视野。

import matplotlib.pyplot as plt
import tensorflow as tf

BATCH_SIZE = 32
IMG_SIZE = (160, 160)
# 数据集地址:https://storage.googleapis.com/mledu-datasets/cats_and_dogs_filtered.zip
train_dataset = tf.keras.utils.image_dataset_from_directory("tmp/cats_and_dogs/train", batch_size=BATCH_SIZE,
                                                            image_size=IMG_SIZE, shuffle=True)
validation_dataset = tf.keras.utils.image_dataset_from_directory("tmp/cats_and_dogs/validation", batch_size=BATCH_SIZE,
                                                                 image_size=IMG_SIZE, shuffle=True)

class_names = train_dataset.class_names
print("类型:", class_names)

# plt.figure(figsize=(10, 10))
# for images, labels in train_dataset.take(1):
#     for i in range(9):
#         ax = plt.subplot(3, 3, i + 1)
#         plt.imshow(images[i].numpy().astype("uint8"))
#         plt.title(class_names[labels[i]])
#         plt.axis("off")
#
# plt.show()

val_batches = tf.data.experimental.cardinality(validation_dataset)
test_dataset = validation_dataset.take(val_batches // 5)
validation_dataset = validation_dataset.skip(val_batches // 5)

print('Number of validation batches: %d' % tf.data.experimental.cardinality(validation_dataset))
print('Number of test batches: %d' % tf.data.experimental.cardinality(test_dataset))

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)

IMG_SHAPE = IMG_SIZE + (3,)
base_model = tf.keras.applications.MobileNetV2(input_shape=IMG_SHAPE,
                                               include_top=False,
                                               weights='imagenet')
base_model.trainable = False
model = tf.keras.Sequential([
    tf.keras.Input(shape=(160, 160, 3)),
    tf.keras.layers.RandomFlip('horizontal'),
    tf.keras.layers.RandomRotation(0.2),
    tf.keras.layers.Rescaling(1./127.5, offset=-1),
    base_model,
    tf.keras.layers.GlobalAveragePooling2D(),
    tf.keras.layers.Dropout(0.2),
    tf.keras.layers.Dense(1)
])

# for image, _ in train_dataset.take(1):
#     plt.figure(figsize=(10, 10))
#     first_image = image[0]
#     for i in range(9):
#         ax = plt.subplot(3, 3, i + 1)
#         augmented_image = data_augmentation(tf.expand_dims(first_image, 0))
#         plt.imshow(augmented_image[0] / 255)
#         plt.axis('off')

# Create the base model from the pre-trained model MobileNet V2

# image_batch, label_batch = next(iter(train_dataset))
# feature_batch = base_model(image_batch)
# print(feature_batch.shape)


base_learning_rate = 0.0001
model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=base_learning_rate, beta_1=0.9, beta_2=0.999, epsilon=1e-08),
              loss=tf.keras.losses.BinaryCrossentropy(from_logits=True),
              metrics=['accuracy'])
initial_epochs = 10
history = model.fit(train_dataset,
                    epochs=initial_epochs,
                    validation_data=validation_dataset)


# 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")

plt.show()

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个基于PyTorch的猫狗识别代码示例: 首先,我们需要导入必要的库和设置随机数种子: ```python import torch import torch.nn as nn import torchvision import torchvision.transforms as transforms import numpy as np import random # 设置随机数种子 random.seed(0) np.random.seed(0) torch.manual_seed(0) torch.cuda.manual_seed(0) ``` 接着,我们需要加载数据集并进行数据增强: ```python # 定义数据增强 transform_train = transforms.Compose([ transforms.RandomResizedCrop(224), transforms.RandomHorizontalFlip(), transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) ]) transform_test = transforms.Compose([ transforms.Resize(256), transforms.CenterCrop(224), transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) ]) # 加载数据集 train_dataset = torchvision.datasets.ImageFolder(root='./data/train', transform=transform_train) test_dataset = torchvision.datasets.ImageFolder(root='./data/test', transform=transform_test) # 定义数据加载器 train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=32, shuffle=True, num_workers=2) test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=32, shuffle=False, num_workers=2) ``` 然后,我们需要定义一个卷积神经网络模型: ```python class CNN(nn.Module): def __init__(self): super(CNN, self).__init__() self.conv1 = nn.Conv2d(3, 32, kernel_size=3, padding=1) self.bn1 = nn.BatchNorm2d(32) self.relu1 = nn.ReLU() self.pool1 = nn.MaxPool2d(kernel_size=2, stride=2) self.conv2 = nn.Conv2d(32, 64, kernel_size=3, padding=1) self.bn2 = nn.BatchNorm2d(64) self.relu2 = nn.ReLU() self.pool2 = nn.MaxPool2d(kernel_size=2, stride=2) self.conv3 = nn.Conv2d(64, 128, kernel_size=3, padding=1) self.bn3 = nn.BatchNorm2d(128) self.relu3 = nn.ReLU() self.pool3 = nn.MaxPool2d(kernel_size=2, stride=2) self.fc1 = nn.Linear(128 * 28 * 28, 512) self.bn4 = nn.BatchNorm1d(512) self.relu4 = nn.ReLU() self.fc2 = nn.Linear(512, 2) def forward(self, x): x = self.conv1(x) x = self.bn1(x) x = self.relu1(x) x = self.pool1(x) x = self.conv2(x) x = self.bn2(x) x = self.relu2(x) x = self.pool2(x) x = self.conv3(x) x = self.bn3(x) x = self.relu3(x) x = self.pool3(x) x = x.view(-1, 128 * 28 * 28) x = self.fc1(x) x = self.bn4(x) x = self.relu4(x) x = self.fc2(x) return x ``` 接着,我们需要定义损失函数和优化器: ```python device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') model = CNN().to(device) criterion = nn.CrossEntropyLoss() optimizer = torch.optim.Adam(model.parameters(), lr=0.001) ``` 接下来,我们可以开始训练模型了: ```python num_epochs = 10 for epoch in range(num_epochs): # 训练模型 model.train() train_loss = 0.0 train_acc = 0.0 for images, labels in train_loader: images = images.to(device) labels = labels.to(device) outputs = model(images) loss = criterion(outputs, labels) optimizer.zero_grad() loss.backward() optimizer.step() train_loss += loss.item() * images.size(0) _, preds = torch.max(outputs, 1) train_acc += torch.sum(preds == labels.data) train_loss = train_loss / len(train_dataset) train_acc = train_acc / len(train_dataset) # 测试模型 model.eval() test_loss = 0.0 test_acc = 0.0 for images, labels in test_loader: images = images.to(device) labels = labels.to(device) outputs = model(images) loss = criterion(outputs, labels) test_loss += loss.item() * images.size(0) _, preds = torch.max(outputs, 1) test_acc += torch.sum(preds == labels.data) test_loss = test_loss / len(test_dataset) test_acc = test_acc / len(test_dataset) print('Epoch [{}/{}], Train Loss: {:.4f}, Train Acc: {:.4f}, Test Loss: {:.4f}, Test Acc: {:.4f}'.format( epoch+1, num_epochs, train_loss, train_acc, test_loss, test_acc)) ``` 最后,我们可以使用训练好的模型进行预测: ```python # 定义类别名称 classes = ['cat', 'dog'] # 读取一张测试图片 image = Image.open('./data/test/cat/cat.1000.jpg') # 对图片进行预处理 image_tensor = transform_test(image).float() image_tensor = image_tensor.unsqueeze_(0) # 使用训练好的模型进行预测 model.eval() with torch.no_grad(): outputs = model(image_tensor) _, preds = torch.max(outputs, 1) # 输出预测结果 print(classes[preds.item()]) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值