# 把训练数据转换为动态图所需的Variable类型 img = fluid.dygraph.base.to_variable(dy_x_data) label = fluid.dygraph.base.to_variable(y_data) # 不需要训练label label.stop_gradient = True # 获取网络输出 predict = cnn(img) # 获取准确率函数和损失函数 accuracy = fluid.layers.accuracy(input=predict, label=label) loss = fluid.layers.cross_entropy(predict, label) avg_loss = fluid.layers.mean(loss) # 计算梯度 avg_loss.backward() momentum.minimize(avg_loss) # 将参数梯度清零以保证下一轮训练的正确性 cnn.clear_gradients() # 打印一次信息 if batch_id % 100 == 0: print( "Epoch:%d, Batch:%d, Loss:%f, Accuracy:%f" % (epoch, batch_id, avg_loss.numpy(), accuracy.numpy())) # 开始执行测试 cnn.eval() test_cost, test_acc = test_train(test_reader, cnn, BATCH_SIZE) # 准备重新恢复训练 cnn.train() print("Test:%d, Loss:%f, Accuracy:%f" % (epoch, test_cost, test_acc)) if not os.path.exists('models'): os.makedirs('models') # 保存模型 fluid.dygraph.save_dygraph(state_dict=cnn.state_dict(), model_path="models/cnn")