import hiddenlayer as hl
import time
## 初始化MyConvnet
MyConvnet = ConvNet()
##print(MyConvnet)
# 定义优化器
optimizer = torch.optim.Adam(MyConvnet.parameters(), lr=0.0003)
loss_func = nn.CrossEntropyLoss() # 损失函数
# 记录训练过程的指标
history1 = hl.History()
# 使用Canvas进行可视化
canvas1 = hl.Canvas()
print_step = 100 ## 每经过100次迭代后,输出损失
## 对模型进行迭代训练,对所有的数据训练EPOCH轮
for epoch in range(5):
## 对训练数据的迭代器进行迭代计算
for step, (b_x, b_y) in enumerate(train_loader):
## 计算每个batch的
output = MyConvnet(b_x) # CNN在训练batch上的输出
loss = loss_func(output, b_y) # 交叉熵损失函数
optimizer.zero_grad() # 每个迭代步的梯度初始化为0
loss.backward() # 损失的后向传播,计算梯度
optimizer.step() # 使用梯度进行优化
## 计算迭代次数
## 计算每经过print_step次迭代后的输出
if step % print_step == 0:
## 计算在测试集上的精度
output = MyConvnet(test_data_x)
_, pre_lab = torch.max(output, 1)
acc = accuracy_score(test_data_y, pre_lab)
## 计算每个epoch和step的模型的输出特征
history1.log((epoch, step),
train_loss=loss, # 训练集损失
test_acc=acc, # 测试集精度
## 第二个全连接层权重
hidden_weight=MyConvnet.fc[2].weight)
# 可视网络训练的过程
with canvas1:
canvas1.draw_plot(history1["train_loss"])
canvas1.draw_plot(history1["test_acc"])
canvas1.draw_image(history1["hidden_weight"])
