猫狗大战——pytorch+resnet18

cats vs dogs——resnet18

数据

这是一个在kaggle上的竞赛,原数据提供了25000张图片,本文所使用的数据集来自其中train的8000张,包括4000张猫和4000张狗
在这里插入图片描述

#将数据导入
data_dir = 'E:\\code\\Python\\catanddog\\train'
test_dir = 'E:\\code\\Python\\catanddog\\test'
class Data(data.Dataset):
    def __init__(self, path, transform = None, train = True, test = False):
        self.test = test
        self.train = train
        self.transform = transform
        #imgs = [os.path.join(path, img) for img in os.listdir(path)]
        imgs = [os.path.join(data_dir, img) for img in path]#imgs存的是每张图片的总路径
            
        if self.test:#test模式
            self.imgs = imgs
        else:#train模式
            random.shuffle(imgs)#数据打乱
            self.imgs = imgs
            
    def __getitem__(self, index):
        img = self.imgs[index]
        if self.test:
            label = 2
        else:
            label = 0 if 'cat' in img.split('\\')[-1] else 1#cat = 0, dog = 1
        image = Image.open(img)
        image = self.transform(image)
        return image, label
    
    def __len__(self):
        return len(self.imgs)
#train和val的transform处理
#对train进行了随机裁剪翻转的操作
transform_train = transforms.Compose([
    transforms.Resize((256, 256)), 
    transforms.RandomCrop((224, 224)), 
    transforms.RandomHorizontalFlip(), 
    transforms.ToTensor(),
    transforms.Normalize((0.485, 0.456, 0.406), (0.229, 0.224, 0.2225)) 
])


transform_val = transforms.Compose([
    transforms.Resize((224, 224)),
    transforms.ToTensor(),
    transforms.Normalize((0.485, 0.456, 0.406), (0.229, 0.224, 0.225)),
])
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') 
train_dirs, valid_dirs = train_test_split(os.listdir(data_dir), test_size = 0.2, random_state = 2021)
trainset = Data(train_dirs, transform = transform_train)
valset = Data(valid_dirs, transform = transform_val)
trainloader = torch.utils.data.DataLoader(trainset, batch_size = 20, shuffle = True, num_workers = 0)
valloader = torch.utils.data.DataLoader(valset, batch_size = 20, shuffle = False, num_workers = 0)

Net

model = resnet18(pretrained=True)
model.fc = nn.Linear(512, 2,bias=True)
model = model.to(device)
optimizer = torch.optim.SGD(model.parameters(), lr=0.001, momentum=0.9, weight_decay=5e-4)  # 设置训练细节
scheduler = StepLR(optimizer, step_size=3)
criterion = nn.CrossEntropyLoss()

train+test

#训练并保存模型
for epoch in range(1):
    train(epoch)
    val(epoch)
torch.save(model, 'catvsdog_model.pth')  # 保存模型
#一次epoch在验证集上准确度有0.988

在这里插入图片描述

#对图片进行预测
classes = ['cat', 'dog']
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
model = torch.load('catvsdog_model.pth')  # 加载模型
model = model.to(device)
model.eval()  # 把模型转为test模式

img = cv2.imread("E:\\code\\Python\\catanddog\\test\\dog.3886.jpg")  # 读取要预测的图片
cv2.imshow("img", img)
img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
trans = transforms.Compose([
        transforms.Resize((224, 224)),
        transforms.ToTensor(),
        transforms.Normalize((0.485, 0.456, 0.406), (0.229, 0.224, 0.225)),
    ])

img = trans(img)
img = img.to(device)
img = img.unsqueeze(0)  # 图片扩展多一维,因为输入到保存的模型中是4维的[batch_size,通道,长,宽],而普通图片只有三维,[通道,长,宽]
output = model(img)
prob = F.softmax(output, dim=1)  # prob是2个分类的概率
value, predicted = torch.max(output.data, 1)
pred_class = classes[predicted.item()]
print(pred_class)
  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

G-Jarvey

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值