深度学习入门实践-手写数字识别
代码如下,是在aistudio上运行的,但是不知道怎么回事运行不了
部分错误如下:
模型训练部分出现的错误
AttributeError: module 'paddle.fluid.dygraph' has no attribute 'to_varlable'
模型验证部分出现的错误
NameError: name 'best_test_acc' is not defined
预测的问题
ValueError: Model saved directory './work/24' is not exists.
#导入需要的包
import numpy as np
import paddle as paddle
from PIL import Image
import matplotlib.pyplot as plt
import os
from paddle.fluid.dygraph import Linear
#训练数据集准备
BUF_SIZE=512
BATCH_SIZE=128
train_reader = paddle.batch(
paddle.reader.shuffle(paddle.dataset.mnist.train(),buf_size=BUF_SIZE),batch_size=BATCH_SIZE
)
#测试数据集准备
#用于训练的数据提供器,每次从缓存中随机读取批次大小的数据
test_reader = paddle.batch(
paddle.reader.shuffle(paddle.dataset.mnist.test(),buf_size=BUF_SIZE),batch_size=BATCH_SIZE
)
#定义多层感知器
#动态图定义多层感知器
import paddle.fluid as fluid #防止出现name fluid is not defined
class multilayer_perceptron(fluid.dygraph.Layer):
def __init__(self):
super(multilayer_perceptron,self).__init__()
self.fc1 = Linear(input_dim=28*28,output_dim=100,act='relu')
self.fc2 = Linear(input_dim=100,output_dim=100,act='relu')
self.fc3 = Linear(input_dim=100,output_dim=10,act='softmax')
def forward(self,input_):
x = fluid.layers.reshape(input_,[input_.shape[0],-1])
x = self.fc1(x)
x = self.fc2(x)
y = self.fc3(x)
return y
#模型训练
with fluid.dygraph.guard():
model=multilayer_perceptron() #模型实例化
model.train() #训练模式
opt=fluid.optimizer.Adam(learning_rate=fluid.dygraph.ExponentialDecay(
learning_rate=0.01,
decay_steps=4000,
decay_rate=0.1,
staircase=True
),parameter_list=model.parameters())
epochs_num=30 #选代次数
for pass_num in range(epochs_num):
lr = opt.current_step_lr()
print("learning-rate:",lr)
for batch_id,date in enumerate(train_reader()):
images=np.array([x[0].reshape(1,28,28) for x in data],np.float32)
labels = np.array([x[1] for x in data]).astype('int64')
labels = labels[:,np.newaxis]
image=fluid.dygraph.to_variable(images)
label=fluid.dygraph.to_varlable(labels)
predict=model(image) #预测
#print(predict)
loss=fluid.layers.cross_entropy(predict,label)
avg_loss=fluid.layers.mean(loss)#获取loss
acc=fluid.layers.eccuracy(predict,label)#计算精度
avg_loss.backvard()
opt.minimize(avg_loss)
model.clear_gredients()
all_train_iter=all_train_iter+256
all_train_iters.append(all_train_iter)
all_train_costs.append(loss.numpy()[0])
a1l_train_accs.append(acc,numpy()[0])
if batch_idlse and batch_id%50==0:
prinf("train_pass:{},batch_id:{},train_loss:{},train_acc:{}",format(pass_num,batch_id,avg_loss.numpy(),acc.numpy()))
#模型验证
with fluid.dygraph.guard():
accs = []
model.eval()#评估模式
for batch_id,data in enumerate(test_reader()):#测试集
images=np.array([x[0].reshape(1,28,28) for x in data],np.float32)
labels = np.array([x[1] for x in data]).astype('int64')
labels = labels[:,np.newaxis]
image=fluid.dygraph.to_variable(images)
label=fluid.dygraph.to_variable(labels)
predict=model(image)#预测
acc=fluid.layers.accuracy(predict,label)
accs.append(acc.numpy()[0])
avg_acc = np.mean(accs)
if avg_acc >= best_test_acc:
best_test_acc = avg_acc
if pass_num > 10:
fluid.save_dygraph(model.state_dict(),'./work/{}'.format(pass_num))#保存模型
print('Test:%d,Accuracy:%0.5f, Best: %0.5f'% (pass_num,avg_acc,best_test_acc))
#图片预处理
def load_image(flie):
im = Image.open(flie).convert('L')
im = im.resize((28,28),Image.ANTIALIAS)
im = np.array(im).reshape(1,1,28,28).astype(np.float32)
#print(im)
im = im/255.0 * 2.0 - 1.0
return im
#开始预测
#构建预测动态图过程
model_path = './work/24'
with fluid.dygraph.guard():
model=multilayer_perceptron()#模型实例化
model_dict,_=fluid.load_dygraph(model_path)
model.load_dict(model_dict)
model.eval()
infer_img = load_image(infer_path)
infer_img=np.array(infer_img).astype('float32')
infer_img=infer_img[np.newaxis,:,:,:]
infer_img = fluid.dygraph.to_variable(infer_img)
result=model(infer_img)
print("infer results: %s"% label_list[np.argmax(result.numpy())])