写在前面:参加paddlepaddle深度学习七日打卡营是在20年的寒假,当时作为大二的我听的一头雾水,后来才发现,深度学习真的是计算机专业的必备技能啊!!!回来恶补一下
附课程链接:深度学习七日打卡营
本课程采用Python语言及paddlepaddle框架,不会python语言的可以试试飞浆的另一门课程:Python小白逆袭大神
学过一点java和C数据结构的我强装上阵
通俗来讲,同人类认识外界事物的原理相类似,机器学习也是通过对大量数据的认知训练来建立模型,从而预测未知属性,而与人类认知外界不同的是,机器学习主要是寻找一个最优的function来进行数学运算
而与机器学习通过人为提取特征,进行数据处理不同的是,深度学习通过神经网络自动提取特征参数,通过python语言+深度学习框架的方式,深度学习无疑大大降低了入门的门槛
神经网络仿照人类的神经而得名,其本质是一个个线性方程,其一般表示形式为y=w*x+b,其中a为系数,b为偏置项
如图,通过一层层神经元的计算,得到数组,与实际值比较,并反向传播,进行神经元的参数更新。
一般包括数据的选取,特征的处理,模型的选择,而后进行参数调优,部署上线
import paddle
import numpy as np//numpy数组朝左
import matplotlib.pyplot as plt//python画图库
paddle.__version__//查看paddle版本
‘当前版本为’2.0.2’ |
---|
通过下载已经有的数据集MNIST进行训练
import paddle.vision.transforms as T//引入transformsAPI
//数据的加载和预处理
transform = T.Normalize(mean=[127.5], std=[127.5])//设置均值为127.5,方差是127.5,把像素点归一到[-1,1]的区间
//训练数据集
train_dataset = paddle.vision.datasets.MNIST(mode='train', transform=transform)
//评估数据集
eval_dataset = paddle.vision.datasets.MNIST(mode='test', transform=transform)
print('训练集样本量: {},验证集样本量: {}'.format(len(train_dataset), len(eval_dataset)))
训练集样本量: 60000,验证集样本量: 10000 | |
---|---|
print('图片:')
print(type(train_dataset[0][0]))//抽取第一张图片
print(train_dataset[0][0])
print('标签:')
print(type(train_dataset[0][1]))
print(train_dataset[0][1])
plt.figure()//matplotlib.pyplot库,形成画布
plt.imshow(train_dataset[0][0].reshape([28,28]), cmap=plt.cm.binary)
plt.show()//展示
如图,图片的像素被归一化到[-1,1]区间,原始像素为[0,255]。
因为是刚接触深度学习,故我们采用最常用的全连接方式,输入层为 28 * 28像素的图像,故大小为784
其与隐层全连接,输出层为10(0到9十个数字),其中隐层大小为自己设置
采用Sequential接口的方式,进行搭积木式的参数设置
network = paddle.nn.Sequential(
paddle.nn.Flatten(), // 拉平,将 (28, 28) => (784)
paddle.nn.Linear(784, 512), //隐层:线性变换层
paddle.nn.ReLU(), // 激活函数,进行非线性变化,方便梯度计算
paddle.nn.Linear(512, 10) // 输出层
)
// 模型封装
model = paddle.Model(network)//封装已经设置好的网络结构
//模型可视化
model.summary((1, 28, 28))
//配置优化器、损失函数、评估指标
model.prepare(paddle.optimizer.Adam(learning_rate=0.001, parameters=network.parameters()),//学习率以及训练参数
paddle.nn.CrossEntropyLoss(),//损失函数
paddle.metric.Accuracy())//评估指标
// 启动模型全流程训练
model.fit(train_dataset, // 训练数据集
eval_dataset, //评估数据集
epochs=5, // 训练的总轮次,共训练5轮
batch_size=64, // 训练使用的批大小 每一批训练量为 总量除以批大小
verbose=1) // 日志展示形式,1为条形展示
//模型评估,根据prepare接口配置的loss和metric进行返回
result = model.evaluate(eval_dataset, verbose=1)
print(result)
// 进行预测操作
import random
result = model.predict(eval_dataset)//验证集
//定义画图方法
def show_img(img, predict):
plt.figure()
plt.title('predict: {}'.format(predict))
plt.imshow(img.reshape([28, 28]), cmap=plt.cm.binary)
plt.show()
// 抽样展示,随机验证十张图片
indexs=[]
i=10
while i>0:
a=random.randint(0,10000)
indexs.append(a)
i=i-1
print(indexs)
for idx in indexs:
show_img(eval_dataset[idx][0], np.argmax(result[0][idx]))
//读取单张图片
image = eval_dataset[501][0]
// 单张图片预测
result = model.predict_batch([image])
//可视化结果
show_img(image, np.argmax(result))
//用于后续继续调优训练的模型
model.save('finetuning/mnist')
from paddle.static import InputSpec
//模型封装,为了后面保存预测模型,这里传入了inputs参数
model_2 = paddle.Model(network, inputs=[InputSpec(shape=[-1, 28, 28], dtype='float32', name='image')])//-1表示任意大小输入
// 加载之前保存的阶段训练模型
model_2.load('finetuning/mnist')
//模型配置
model_2.prepare(paddle.optimizer.Adam(learning_rate=0.001, parameters=network.parameters()),
paddle.nn.CrossEntropyLoss(),
paddle.metric.Accuracy())
// 模型全流程训练
model_2.fit(train_dataset,
eval_dataset,
epochs=2,
batch_size=64,
verbose=1)
保存预测
//保存用于后续推理部署的模型
model_2.save('infer/mnist', training=False)
第一天的恶补到此就结束啦,对深度学习架构以及高层API有了一定了解,再接再厉。