以狗和狼的图像分类为例,用MindSpore区分狗与狼
训练集:
测试集:
通过matplotlib可视化部分增强后的训练数据
data = next(train_ds.create_dict_iterator())
images = data["image"]
labels = data["label"]
print("Tensor of image", images.shape)
print("Labels:",labels)
class_name = {0:"dogs",1:"wolves"}
count = 1
# 输出测试图
plt.figure(figsize=(12,5))
for i in images:
plt.subplot(3,8,count)
plt.imshow(i.asnumpy().transpose(1,2,0))
plt.title(class_name[int(labels[count-1].asnumpy())])
plt.xticks([])
count += 1
plt.axis("off")
plt.show()
定义visualize_mode函数,可视化模型预测
def visualize_model(best_ckpt_path,val_ds):
# 定义网络并加载参数,对验证集进行预测
net = resnet50(2)
param_dict = load_checkpoint(best_ckpt_path)
load_param_into_net(net,param_dict)
loss = nn.SoftmaxCrossEntropyWithLogits(sparse=True,reduction='mean')
model = Model(net, loss,metrics={"Accuracy":nn.Accuracy()})
data = next(val_ds.create_dict_iterator())
images = data["image"].asnumpy()
labels = data["label"].asnumpy()
class_name = {0:"dogs",1:"wolves"}
output = model.predict(Tensor(data['image']))
pred = np.argmax(output.asnumpy(),axis=1)
# 可视化模型预测
for i in range(len(labels)):
plt.subplot(2,2,i+1)
color = 'blue' if pred[i] == labels[i] else 'red'
plt.title('pre:{}'.format(class_name[pred[i]]), color=color)
plt.imshow(images[i].transpose(1,2,0))
plt.axis('off')
加载预训练的模型并重置最终的全连接层
net = resnet50(2)
num_epochs=20
# 加载预训练模型
param_dict = load_checkpoint('resnet50.ckpt')
# 获取全连接层的名字
filter_list = [x.name for x in net.end_point.get_parameters()]
# 删除预训练模型的全连接层
filter_checkpoint_parameter_by_list(param_dict, filter_list)
# 给网络加载参数
load_param_into_net(net,param_dict)
# 定义优化器和损失函数
opt = nn.Momentum(params=net.trainable_params(), learning_rate=0.001, momentum=0.9)
loss = nn.SoftmaxCrossEntropyWithLogits(sparse=True,reduction='mean')
# 实例化模型
model = Model(net, loss,opt,metrics={"Accuracy":nn.Accuracy()})
训练和评估
# 加载训练和验证数据集
train_ds = create_dataset(train_data_path)
val_ds = create_dataset(val_data_path)
# 实例化回调类
eval_param_dict = {"model":model,"dataset":val_ds,"metrics_name":"Accuracy"}
eval_cb = EvalCallBack(apply_eval, eval_param_dict,)
# 模型训练
model.train(num_epochs,train_ds, callbacks=[eval_cb, TimeMonitor()], dataset_sink_mode=True)