我使用的是基于ubuntu 20.04 的优麒麟系统(所以deepin linuxmint …都可参考)
最近参加了AI Studio上的课程,写写本地运行飞桨PaddlePaddle + Pycharm 安装运行的初体验,并附带了mnist手写识别案例。
目录
- 安装 python
- 安装 pip
- 安装 Pycharm
- PyCharm 创建 Paddle 项目
- 下载 paddlepaddle包
- 案例:MNIST手写数字识别
- 完整代码+保存模型
- 结果说明
- 再次优化
安装 python
系统自带python,可以终端中用下面命令查看版本:
$ python --version
优麒麟自带python2.7 和 python3.8 两个版本,
如果找不到python命令,直接建立一个链接即可:
ln -s /usr/bin/python3 /user/bin/python
输入这个命令可以查看安装了哪些python
$ ls /usr/bin/python*
最后测试一下
$ python --version
安装 pip
测试是否安了 pip
$ pip --version
如果没有安装,用一下命令,下载安装脚本并安装pip
$ curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
$ sudo python get-pip.py
安装 Pycharm
官方下载地址:https://www.jetbrains.com/pycharm/download/#section=linux
我下载的是社区版本:pycharm-community-2020.3.3.tar.gz
在下载好的文件夹中,打开终端:
$ tar -zxvf pycharm-community-2020.3.3.tar.gz
解压出来的文件pycharm文件夹相当于绿色便携版本,直接可以运行的。
但是一般移动到 /usr/ 中,例如我直接把解压好的pycharm文件夹放到/usr/中
$ sudo mv pycharm/ /usr/
然后创建应用快捷方式:
$ sudo touch /usr/share/applications/pycharm.desktop
利用gedit 、vim编辑快捷方式
$ sudo gedit /usr/share/applications/pycharm.desktop
复制下面的内容,然后保存退出
[Desktop Entry]
Version= 2020.3.3
Type=Application
Name=PyCharm
Icon=/usr/pycharm-community-2020.3.3/bin/pycharm.png
Exec="/usr/pycharm-community-2020.3.3/bin/pycharm.sh" %f
Comment=The Drive to Develop
Categories=Development;IDE;
Terminal=false
StartupWMClass=jetbrains-pycharm
其中Icon是应用图标的位置,可以在网上下一个
然后就安装成功了。
PyCharm 创建 Paddle 项目
打开pycharm,New Project
- Location:中输入项目地址
- New environment using Virtualenv:建议创建虚拟的Python运行环境,这样不会对系统中python有任何修改
- Base interpreter:python解释器来源于/usr/bin/python3.8
点 Create
下载 paddlepaddle包
File - Settings - Project: paddle - 点击Python Interpreter
点击左下角的 “+” 号
点击Mange Repositories - 点击+
添加国内源
清华:https://pypi.tuna.tsinghua.edu.cn/simple
阿里云:http://mirrors.aliyun.com/pypi/simple/
OK - 搜索 paddlepaddle - 安装即可
案例:MNIST手写数字识别
创建一个python脚本
File - New - Python File - 取名
完整代码+保存模型
复制粘贴以下代码,然后点击 Run - Run 'mnist’
import paddle
import numpy as np
import matplotlib.pyplot as plt
import paddle.vision.transforms as T
# 数据的加载和预处理
transform = T.Normalize(mean=[127.5], std=[127.5])
# 训练数据集
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)))
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()
plt.imshow(train_dataset[0][0].reshape([28,28]), cmap=plt.cm.binary)
plt.show()
# 模型网络结构搭建
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, # 训练的总轮次
batch_size=64, # 训练使用的批大小
verbose=1) # 日志展示形式
# 模型评估,根据prepare接口配置的loss和metric进行返回
result = model.evaluate(eval_dataset, verbose=1)
print(result)
# 进行预测操作
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 = [2, 15, 38, 211]
for idx in indexs:
show_img(eval_dataset[idx][0], np.argmax(result[0][idx]))
# 保存用于后续继续调优训练的模型
model.save('finetuning/mnist')
结果说明
下载数据集后,显示一张标签为5的图片model.summary() 显示网络结构
训练5次epoch
验证数据集:
效果相当不错
然后会弹出几个预测的结果
最后模型保存在了finetuning中
再次优化
from paddle.static import InputSpec
# 模型封装,为了后面保存预测模型,这里传入了inputs参数
model_2 = paddle.Model(network, inputs=[InputSpec(shape=[-1, 28, 28], dtype='float32', name='image')])
# 加载之前保存的阶段训练模型
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)
你学会了吗?