data_transform {
train : transforms.Compose([transforms.RandomResizedCrop(224), # 随机裁剪 224x224像素
transforms.RandomHorizontalFlip(), # 水平方向随机反转
transforms.ToTensor(),
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))]),
val : transforms.Compose([transforms.Resize((224, 224)), # cant 224 must 224 224
transforms.ToTensor(),
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])}
# 获取数据集所在根目录
train_dataset datasets.ImageFolder(root ./train ,
transform data_transform[ train ]) # 数据预处理
train_num len(train_dataset) # 打印数据集有多少张图片
# # { daisy :0, dandelion :1, roses :2, sunflowers :3, tulips:4 }
flower_list train_dataset.class_to_idx #获取分类的名称所对应的索引
cla_dict dict((val, key) for key, val in flower_list.items()) # 将键值和value对调
json_str json.dumps(cla_dict, indent 4) # 通过json包 将cla_dict进行编码成json格式
with open( class_indices.json , w ) as json_file: # 保存到一个json文件当中
json_file.write(json_str)
batch_size 32
train_loader torch.utils.data.DataLoader(train_dataset,
batch_size batch_size, shuffle True,
num_workers 0)
validate_dataset datasets.ImageFolder(root ./val , transform data_transform[ val ])
val_num len(validate_dataset)
validate_loader torch.utils.data.DataLoader(validate_dataset,
batch_size batch_size, shuffle False,
num_workers 0)
# 查看数据集的代码
# test_data_iter iter(validate_loader)
# test_image, test_label test_data_iter.next()
# def imshow(img):
# img img / 2 0.5
# npimg img.numpy()
# plt.imshow(np.transpose(npimg, (1, 2, 0)))
# plt.show()
# print( .join( %5s % cla_dict[test_label[j].item()] for j in range(4)))
# imshow(utils.make_grid(test_image)) 非常有用
net AlexNet(num_classes 5, init_weights True)
net.to(device)
loss_function nn.CrossEntropyLoss()
# pata list(net.parameters()) 查看模型的一个参数
optimizer optim.Adam(net.parameters(), lr 0.0002) #学习率自己调整
save_path ./AlexNet.pth
best_acc 0.0
for epoch in range(10):
net.train() # 我们使用了dropout 我们只希望在训练中随机失活 但是在预测过程中不希望他起作用 net.train()开启dropout net.eval()关闭dropout
running_loss 0.0
t1 time.perf_counter() # 训练一个epoch所需时间
for step, data in enumerate(train_loader, start 0):
images, labels data
optimizer.zero_grad()
outputs net(images.to(device))
loss loss_function(outputs, labels.to(device))
loss.backward()
optimizer.step()
# print statistic
running_loss loss.item()
# print train process
rate (step 1)/ len(train_loader)
a * * int(rate * 50)
b . * int((1 - rate) * 50)
print( r train loss:{:^3.0f}%[{}- {}]{:.3f} .format(int(rate * 100), a, b, loss), end )
print()
print(time.perf_counter()-t1)
net.eval()
acc 0.0
with torch.no_grad(): # 禁止参数跟踪
for data_test in validate_loader:
test_images, test_labels data_test
outputs net(test_images.to(device))
predict_y torch.max(outputs, dim 1)[1] # 输出最大值作为预测
acc (predict_y test_labels.to(device)).sum().item()
accurate_test acc / val_num
if accurate_test best_acc:
best_acc accurate_test
torch.save(net.state_dict(), save_path)
print( [epoch %d] train_loss: %d.3f test_accuracy:%.3f %
(epoch 1, running_loss / step, acc / val_num))