该系列文章系个人读书笔记及总结性内容,任何组织和个人不得转载进行商业活动!
相关链接:
零基础解锁深度学习神器高层 API ,七天时间助你掌握CV、NLP领域最火模型及应用。
Day 1(2月3日)
Day 2(2月4日)
Day 3(2月5日)
Day 4(2月6日)
Day 5(2月7日)
Day 6(2月8日)
Day 7(2月10日)
课程目录:
1.图灵测试:
把一个人和一台计算机分别放在两个隔离的房间中,房间外的一个人同时询问人和计算机相同的问题,如果房间外的人无法分别哪个是人,哪个是计算机,就能够说明计算机具有人工智能。
2.医学上发现,人的视觉系统处理信息是分级的;
从视网膜(Retina)出发,经过低级的V1区提取边缘特征,到V2区的基本形状或目标的局部,再到高层的整个目标(如判定为一张人脸),以及到更高层的PFC(前额叶皮层)进行分类判断等。也就是说高层的特征是低层特征的组合,从低层到高层的特征表达越来越抽象和概念化,也即越来越能表现语义或者意图。
边缘特征 —–> 基本形状和目标的局部特征——>整个目标 这个过程其实和我们的常识是相吻合的,因为复杂的图形,往往就是由一些基本结构组合而成的。同时我们还可以看出:大脑是一个深度架构,认知过程也是深度的。
3.Deep Learning的出现
低层次特征 - - - - (组合) - - ->抽象的高层特征;
机器学习:
是实现人工智能的一种手段,也是目前被认为比较有效的实现人工智能的手段,目前在业界使用机器学习比较突出的领域很多,例如:计算机视觉、自然语言处理、推荐系统等等。(如高速上的ETC的车牌识别,今日头条的新闻推荐)
简单来说,机器学习就是通过算法,使得机器能从大量历史数据中学习规律,从而对新的样本做智能识别或对未来做预测。
人工智能是计算机科学的一个分支,研究计算机中智能行为的仿真。
我们有四个不同层次的AI,让我们来解释前两个:
机器学习是指计算机使用大数据集而不是硬编码规则来学习的能力。
机器学习允许计算机自己学习。这种学习方式利用了现代计算机的处理能力,可以轻松地处理大型数据集。
基本上,机器学习是人工智能的一个子集;更为具体地说,它只是一种实现AI的技术,一种训练算法的模型,这种算法使得计算机能够学习如何做出决策。
从某种意义上来说,机器学习程序根据计算机所接触的数据来进行自我调整。
监督式学习vs非监督式学习:
监督式学习需要使用有输入和预期输出标记的数据集。
如果人工智能产生的输出结果是错误的,它将重新调整自己的计算。这个过程将在数据集上不断迭代地完成,直到AI不再出错。
非监督式学习是利用既不分类也不标记的信息进行机器学习,并允许算法在没有指导的情况下对这些信息进行操作。
当你使用非监督式学习训练人工智能时,你可以让人工智能对数据进行逻辑分类。这里机器的任务是根据相似性、模式和差异性对未排序的信息进行分组,而不需要事先对数据进行处理。
非监督式学习的一个例子是亚马逊等电子商务网站的行为预测AI。
它将创建自己输入数据的分类,帮助亚马逊识别哪种用户最有可能购买不同的产品(交叉销售策略)。 另一个例子是,程序可以任意地使用以下两种算法中的一种来完成男孩女孩的图像分类任务。一种算法被称为“聚类”,它根据诸如头发长度、下巴大小、眼睛位置等特征将相似的对象分到同一个组。另一种算法被称为“相关”,它根据自己发现的相似性创建if/then规则。换句话说,它确定了图像之间的公共模式,并相应地对它们进行分类。【?】
深度学习是一种机器学习方法 , 它允许我们训练人工智能来预测输出,给定一组输入(指传入或传出计算机的信息)。监督学习和非监督学习都可以用来训练人工智能。
神经网络:
神经网络是一组粗略模仿人类大脑,用于模式识别的算法。神经网络这个术语来源于这些系统架构设计背后的灵感,这些系统是用于模拟生物大脑自身神经网络的基本结构,以便计算机能够执行特定的任务。
“预测公交票价”:
神经元之间的每个连接都有一个权重。这个权重表示输入值的重要性。模型所做的就是学习每个元素对价格的贡献有多少。这些“贡献”是模型中的权重。一个特征的权重越高,说明该特征比其他特征更为重要。
每个神经元都有一个激活函数。最后一层神经元的激活函数主要是一个传递输出结果的函数。(
激活函数的作用远不止于此
)
对于我们的公交票价模型,我们必须找到过去票价的历史数据;一旦我们遍历了整个数据集,就有可能创建一个函数来衡量AI输出与实际输出(历史数据)之间的差异。这个函数叫做成本函数。即成本函数是一个衡量模型准确率的指标,衡量依据为此模型估计X与Y间关系的能力。
模型训练的目标是使成本函数等于零,即当AI的输出结果与数据集的输出结果一致时(成本函数等于0)。
梯度下降算法:
梯度下降法是一种求函数最小值的方法。在这种情况下,目标是取得成本函数的最小值。 它通过每次数据集迭代之后优化模型的权重来训练模型。通过计算某一权重集下代价函数的梯度,可以看出最小值的梯度方向。
为了降低成本函数值,多次遍历数据集非常重要。这就是为什么需要大量计算能力的原因。
PaddlePaddle学习:
Step1:MNIST数据集准备
import numpy as np
import paddle as paddle
import paddle.fluid as fluid
from PIL import Image
import matplotlib.pyplot as plt
import os
# 训练集
train_reader = paddle.batch(paddle.reader.shuffle(paddle.dataset.mnist.train(), buf_size=512), batch_size=128)
# 测试集
test_reader = paddle.batch(paddle.dataset.mnist.test(), batch_size=128)
# 测试
temp_reader = paddle.batch(paddle.dataset.mnist.train(), batch_size=1)
temp_data = next(temp_reader())
print(temp_data)
Step2:配置网络
[1,28,28]
;# 定义多层感知器
def multilayer_perception(input):
hidden1 = fluid.layers.fc(input=input, size=100, act='relu')
hidden2 = fluid.layers.fc(input=hidden1, size=100, act='relu')
prediction = fluid.layers.fc(input=hidden2, size=10, act='softmax')
return prediction
# 定义输入层
image = fluid.layers.data(name='image', shape=[1,28,28], dtype='float32')
label = fluid.layers.data(name='label', shape=[1], dtype='int64')
# 使用网络来获取分类器
model = multilayer_perception(image)
# 定义损失函数:使用交叉熵损失函数(多用于分类问题)描述真实样本标签和预测概率之间的差值
cost = fluid.layers.cross_entropy(input=model, label=label)
# 均值
avg_cost = fluid.layers.mean(cost)
# 准确度函数
acc = fluid.layers.accuracy(input=model, label=label)
# 优化方法:使用Adam优化方法,指定学习率为0.001
optimizer = fluid.optimizer.AdamOptimizer(learning_rate=0.001)
opts = optimizer.minimize(avg_cost)
Step3+4:训练模型 和 评估模型
# 定义一个使用CPU的解析器
place = fluid.CPUPlace()
exe = fluid.Executor(place)
# 进行参数初始化
exe.run(fluid.default_startup_program())
# 定义输入数据维度
feeder = fluid.DataFeeder(place=place, feed_list = [image, label])
# 训练模型和测试
# 训练5个Pass,之前定义的求准确率的函数,可以在训练的时候让它输出当前的准确率
# 计算准确率的原理很简单,就是把训练是预测的结果和真实的值比较,求出准确率。
# 每一个Pass训练结束之后,再进行一次测试,使用测试集进行测试,并求出当前的Cost和准确率的平均值。
# 遍历train_reader
for pass_id in range(5):
# 开始训练
for batch_id, data in enumerate(train_reader()):
train_cost, train_acc = exe.run(program=fluid.default_main_program(),# 运行主程序
feed=feeder.feed(data),# 给模型喂入数据
fetch_list=[acg_cost,acc] # 反馈 误差 准确率
)
# 每100个batch打印一次信息 误差 准确率
if batch_id % 100 == 0:
print('Pass:%d, Batch:%d, Cost:%0.5f, Accuracy:%0.5f' % (pass_id, batch_id, train_cost[0], train_acc[0]))
# 进行测试
test_accs = []
test_costs = []
# 每训练一轮 进行一次测试
for batch_id, data in enumerate(test_reader()):
test_cost, test_acc = exe.run(program=fluid.default_main_program(),
feed=feeder.feed(data),
fetch_list = [acg_cost, acc])
# 保存每个batch的准确率和误差
test_accs.append(test_acc[0])
test_costs.append(test_cost[0])
# 求测试结果的平均值
test_cost = (sum(test_costs) / len(test_costs)) # 每轮的平均误差
test_acc = (sum(test_accs) / len(test_accs))
print('Test:%d, Cost:%0.5f, Accuracy:%0.5f' % (pass_id, test_cost, test_acc))
# 保存模型
model_save_dir = "./model/hand.inference.model"
if not os.path.exists(model_save_dir):
os.makedirs(model_save_dir)
print('save models to %s' % (model_save_dir))
fluid.io.save_inference_mode(model_save_dir,
['image'],# 推理(inference)需要 feed 的数据
[model],# 保存推理(inference)结果的 Variables
exe) # executor 保存 inference model
# log(part)
Pass:0, Batch:0, Cost:2.70130, Accuracy:0.05469
Pass:0, Batch:100, Cost:0.44905, Accuracy:0.84375
Pass:0, Batch:200, Cost:0.20944, Accuracy:0.93750
Pass:0, Batch:300, Cost:0.37832, Accuracy:0.85938
Pass:0, Batch:400, Cost:0.21634, Accuracy:0.93750
Test:0, Cost:0.22907, Accuracy:0.92880
save models to /home/aistudio/data/hand.inference.model
Pass:1, Batch:0, Cost:0.30485, Accuracy:0.91406
Pass:1, Batch:100, Cost:0.20843, Accuracy:0.95312
Pass:1, Batch:200, Cost:0.12292, Accuracy:0.96875
Pass:1, Batch:300, Cost:0.12543, Accuracy:0.95312
Pass:1, Batch:400, Cost:0.08486, Accuracy:0.97656
Test:1, Cost:0.15316, Accuracy:0.95095
save models to /home/aistudio/data/hand.inference.model
Step5:模型预测
# 对图片进行预处理
def load_image(file):
im = Image.open(file).convert('L')
im = im.resize((28,28), Image.ANTIALIAS)
im = np.array(im).reshape(1,1,28,28).astype(np.float32)
im = im/255.0 * 2.0 - 1.0
return im
def show_image(file):
img = Image.open(file) # 例: ./test/6.png
plt.imshow(img) # 绘制
plt.show() # 显示
# 确定环境
place = fluid.CPUPlace()
infer_exe = fluid.Executor(place)
inference_scope = fluid.core.Scope()
with fluid.scope_guard(inference_scope):
# 加载模型
。。。。。。
# 进行预测
好吧,课程更新了,Step1——Step5,forgetted,重来!!!
Step1:准备数据
import paddle
from paddle.vision.transforms import Normalize
transform = Normalize(mean=[127.5],std=[127.5], data_format='CHW')
# 加载数据集 使用transform对数据集做归一化
train_dataset = paddle.vision.datasets.MNIST(mode='train', transform=transform)
test_dataset = paddle.vision.datasets.MNIST(mode='test', transform=transform)
取一条数据,观察一下数据集
import numpy as np
import matplotlib.pyplot as plt
train_data0, train_label_0 = train_dataset[0][0], train_dataset[0][1]
train_data0 = train_data0.reshape([28, 28]) # 1,28,28 => 28,28
plt.figure(figsize=(2,2))
plt.imshow(train_data0, cmap=plt.cm.binary)
print(str(train_label_0))
Step2:配置网络
class MultilayerPerceptron(paddle.nn.Layer):
# in_features表示有多少输入
def __init__(self, in_features):
super(MultilayerPerceptron, self).__init__()
# 打平
self.flatten = paddle.nn.Flatten()
# 全连接层
self.linear1 = paddle.nn.Linear(in_features=in_features, out_features = 100)
self.linear2 = paddle.nn.Linear(in_features=100, out_features = 100)
self.linear3 = paddle.nn.Linear(in_features=100, out_features = 10)
# ReLU激活函数
self.act1 = paddle.nn.ReLU()
self.act2 = paddle.nn.ReLU()
def forward(self, x):
x = self.flatten(x)
x = self.linear1(x)
x = self.act1(x)
x = self.linear2(x)
x = self.act2(x)
x = self.linear3(x)
return x
# 使用paddle.Model 封装 MultilayerPerceptron网络
model = paddle.Model(MultilayerPerceptron(in_features=784))
# 使用model.summary 打印模型结构
model.summary((-1,1,28,28))
# 配置模型
model.prepare(paddle.optimizer.Adam(parameters=model.parameters()), # 使用Adam算法进行优化
paddle.nn.CrossEntropyLoss(), # 使用CrossEntroyLoss计算损失
paddle.metric.Accuracy()) # 使用Accuracy计算精度
Step3:模型训练
model.fit(train_dataset,
epochs=5, # 设置训练轮数
batch_size=64,
verbose=1) # 设置日志打印格式
Step4:模型评估
model.evaluate(test_dataset, verbose=1)
Step5:模型预测
results = model.predict(test_dataset)
# 获取概率最大的label
lab = np.argsort(results[0])
讨论时间:为什么教程中的手写数据及分类问题 的输出层,没有设置softmax激活函数,CrossEntropyLoss中也没有?
目前在继续增强CrossEntropyLoss这个API,增加with_softmax参数,会把增加softmax由默认行为变成可控行为
如果是回归问题,不会用CrossEntropyLoss
所以用了CrossEntropyLoss对应的就是分类问题;
下一节,准备必要的数学知识;
数学基础知识:
高等数学:
线性代数
概率论和梳理统计
Python使用灵活,第三方支持也多;而且所有的深度学习框架一般都有一个Python版的接口;
IPython Notebook号称 “编码器的实验室笔记本” - 允许用户在单个基于浏览器的页面中交叉显示/执行数据,代码和说明文本,而不是在单独的文件中;
min(z), max(z), len(z), sum(z)
);random_list = [4, 1, 5, 4, 10, 4]
random_list.count(4)
# 3
list.index(value)
list.sort()
/sorted()
append(value)
/pop(index)
list.extend([4,5])
或 直接使用 “+”;list.insert(index,value)
字典:
dic['key']
dic.update({key,val,key1:val1})
、del dic['key']
dic.get('key')
、dic.get('key',defaultVal)
dic.pop('key')
:删除的同时并返回;dic.keys()
、dic.values()
、for key in dic
、for key, value in dic.items()
元组:
tuple.index(val)
返回索引tuple.count(val)
返回计数for item in tuple
for index, item in enumerate(tuple)
stringSequence.split('')
range(1,51)
candidates = list(range(0, 5))
candidates
while len(candidates) > 0:
first = candidates[0]
candidates.remove(first)
print(candidates)
文档字符串:
def greet(name):
"""This function greets to
the person passed in as
parameter"""
print("Hello, " + name + ". Good morning!")
print(greet.__doc__)
一旦我们从函数返回它们就会被销毁。因此,函数不记得先前调用的变量值:
def my_func():
x = 10
print("Value inside function:",x)
x = 20
my_func()
print("Value outside function:",x)
# ('Value inside function:', 10)
# ('Value outside function:', 20)
我们可以从函数内部读取这些值,但不能更改(写入)它们。为了修改函数外部变量的值,必须使用关键字global将它们声明为全局变量。
# 函数参数 带默认值
# 在此函数中,参数名称没有默认值,在调用期间是必需的(必需)
# 一旦我们有一个默认参数,它右边的所有参数也必须有默认值。
def greet(name, msg = "Good morning!"):
# Python任意参数
# 我们事先并不知道将传递给函数的参数数量
# Python允许我们通过具有任意数量参数的函数调用来处理这种情况。
# 在函数定义中,我们在参数名称前使用星号(*)来表示这种参数
def greet(*names):
"""This function greets all
the person in the names tuple."""
# names is a tuple with arguments
for name in names:
print("Hello",name)
# Python函数: 在列表中移除重复对象
def remove_duplicates(duplicate):
uniques = []
for num in duplicate:
if num not in uniques:
uniques.append(num)
return(uniques)
duplicate = [2, 4, 10, 20, 5, 2, 20, 4]
print(remove_duplicates(duplicate))
面向对象编程(OOP):
注意:由于Python是一种多范式编程语言(也就是说面向对象或者函数式编程都是可以的),您可以选择最适合手头问题的范例,在一个程序中混合使用不同的范例,和/或随着程序的发展从一种范例切换到另一种范例。
Python中的类:
Python对象(实例):
class Dog(object):
# 类属性(类方法也可以通过实例进行调用)
species = 'mammal'
# 初始化方法
def __init__(self, name, age):
super(Dog,self).__init__()
# 属性
self.name = name
self.age = age
# 实例方法
def speak(self, sound):
return sound
a = Dog('Mikey', 6)
父类与子类:
Is jim an instance of Dog()
print(isinstance(jim, Dog))
常规测验
高难度联系
本次课程基于AI Studio平台进行,请各位同学先熟悉下Notebook基本操作:
!cat < newfile.py
在项目空间内直接创建文件, 之后双击进行编辑. 如下图所示:Notebook中使用Shell命令:
# 查看当前挂载的数据集目录
!ls /home/aistudio/data/
#显示当前路径
!pwd
# 使用pip来安装自己需要的package (但不支持apt-get)
!pip install jupyterthemes
# 查看当前环境中安装的package
!pip list --format=columns
# 如果需要进行持久化安装, 需要使用持久化路径
!mkdir /home/aistudio/external-libraries
!pip install beautifulsoup4 -t /home/aistudio/external-libraries
# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可:
import sys
sys.path.append('/home/aistudio/external-libraries')
# 使用git命令来同步代码 (暂时需要Paddle 1.4.1以上)
%cd work/
## 可以用gitee,速度会快一些
!git clone https://github.com/PaddlePaddle/Paddle.git #Paddle官方模型
Notebook执行Python代码的原理和传统IDE略有不同.
本平台自带"变量监控"和"运行历史". 方便用户了解当前代码运行状态.
Magic命令是Notebook的高级用法了. 可以运行一些特殊的指令. Magic 命令的前面带有一个或两个百分号(% 或 %%),分别代表行 Magic 命令和单元格 Magic 命令。行 Magic 命令仅应用于编写 Magic 命令时所在的行,而单元格 Magic 命令应用于整个单元格。
#显示全部可用的Magic命令
%lsmagic
#使用Magic命令来统计运行时长
import random
%%timeit
prize = 0
for i in range(100):
roll = random.randint(1, 6)
if roll%2 == 0:
prize += roll
else:
prize -= 1
# 直接嵌入可视化内容, 例如%matplotlib inline:
%matplotlib inline
%config InlineBackend.figure_format = 'retina'
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(0,1,300)
for w in range(2,6,2):
plt.plot(x, np.sin(np.pi*x)*np.sin(2*w*np.pi*x))
# 这里需要注意的是, 当前技术架构局限, 一个Cell里面只能输出一张图片. 如果输出多张图片, 可能会有显示异常的问题
# %env:设置环境变量
# 使用该命令, 可以在不必重启Kernel的情况下管理notebook的环境变量
%env OMP_NUM_THREADS=4
# %run: 运行python代码
%run /home/aistudio/work/SampleOfRun.py
# or
!python /home/aistudio/work/SampleOfRun.py
# %%writefile and %pycat: 导出cell内容/显示外部脚本的内容
# %%writefile magic可以把cell的内容保存到外部文件里。
# 而%pycat则可把外部文件展示在Cell中
%%writefile SaveToPythonCode.py
from math import sqrt
for i in range(2,10):
flag=1
k=int(sqrt(i))
for j in range(2,k+1):
if i%j==0:
flag=0
break
if(flag):
print(i)
# 因为没有指定路径, 所以文件被保存到了根目录下. 但至少it works.
%pycat /home/aistudio/work/SaveToPythonCode.py
在要查询的对象前输入?或??并执行即可. 单问号是普通信息, 双问号是详细信息.
前提: 该对象方法已经被正确导入(import)
import paddle
?paddle.nn.Conv3D
你可以通过修改内核选项ast_note_interactivity,使得Jupyter对独占一行的所有变量或者语句都自动显示,这样你就可以马上看到多个语句的运行结果了。
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"
源于产业实践的开源深度学习平台
PaddlePaddle是百度开源的深度学习框架,类似的深度学习框架还有谷歌的Tensorflow、Facebook的Pytorch等,在入门深度学习时,学会并使用一门常见的框架,可以让学习效率大大提升。在PaddlePaddle中,计算的对象是张量;
import paddle
paddle.__version__ # 优选2.0+
# 定义两个张量
x1 = paddle.ones([2,2], dtype='int64')
x2 = paddle.ones([2,2], dtype='int64')
# 将两个张量求和
y1 = paddle.add(x1, x2)
# 查看结果
print(y1)
import paddle
import numpy as np
paddle.__version__
# 定义训练和测试数据
x_data = np.array([[1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
[2.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
[3.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
[4.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
[5.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]]).astype('float32')
y_data = np.array([[3.0], [5.0], [7.0], [9.0], [11.0]]).astype('float32')
test_data = np.array([[6.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]]).astype('float32')
# 定义一个简单的线性网络,这个网络非常简单,结构是:[输入层] --> [隐层] --> [激活函数] --> [输出层]
# 定义一个简单的线性网络
net = paddle.nn.Sequential(
paddle.nn.Linear(13, 100),
paddle.nn.ReLU(),
paddle.nn.Linear(100, 1)
)
# 接着是定义训练使用的优化方法,这里使用的是随机梯度下降优化方法。PaddlePaddle提供了大量的优化函数接口,除了本项目使用的随机梯度下降法(SGD),还有Momentum、Adagrad、Adagrad等等,读者可以更加自己项目的需求使用不同的优化方法。
# 定义优化方法
optimizer = paddle.optimizer.SGD(learning_rate=0.01, parameters=net.parameters())
# 因为本项目是一个线性回归任务,所以我们在训练的时候使用的是平方差损失函数。
# 因为paddle.nn.functional.square_error_cost求的是一个Batch的损失值,所以我们还要对他求一个平均值。
# PaddlePaddle提供了很多的损失函数的接口,比如交叉熵损失函数paddle.nn.CrossEntropyLoss。
# 在训练过程中,我们可以看到输出的损失值在不断减小,证明我们的模型在不断收敛。
# 将numpy类型数据转换成tensor之后才能用于模型训练
inputs = paddle.to_tensor(x_data)
labels = paddle.to_tensor(y_data)
# 开始训练100个pass
for pass_id in range(10):
out = net(inputs)
loss = paddle.mean(paddle.nn.functional.square_error_cost(out, labels))
loss.backward()
optimizer.step()
optimizer.clear_grad()
print("Pass:%d, Cost:%0.5f" % (pass_id, loss))
# 开始预测
predict_inputs = paddle.to_tensor(test_data)
result = net(predict_inputs)
print("当x为6.0时,y为:%0.5f" % result)
uci-housing数据集介绍:
paddle.text.datasets.UCIHousing
数据集加载:
# 导入基本的库
import os
import paddle
import numpy as np
BATCH_SIZE=20
train_dataset = paddle.text.datasets.UCIHousing(mode='train')
valid_dataset = paddle.text.datasets.UCIHousing(mode='test')
#用于训练的数据加载器,每次随机读取批次大小的数据,剩余不满足批大小的数据丢弃
train_loader = paddle.io.DataLoader(train_dataset, batch_size=BATCH_SIZE, shuffle=True, drop_last=True)
#用于测试的数据加载器,每次随机读取批次大小的数据
valid_loader = paddle.io.DataLoader(valid_dataset, batch_size=BATCH_SIZE, shuffle=True)
#用于打印,查看uci_housing数据
print(train_dataset[0])
# 定义网络
net = paddle.nn.Linear(13, 1)
# 定义损失函数
# 此处使用均方差损失函数。
# square_error_cost(input,lable):接受输入预测值和目标值,并返回方差估计,即为(y-y_predict)的平方
# 定义优化函数
# 此处使用的是随机梯度下降。
optimizer = paddle.optimizer.SGD(learning_rate=0.001, parameters=net.parameters())
import matplotlib.pyplot as plt
# 定义绘制训练过程的损失值变化趋势的方法draw_train_process
iter = 0
iters = []
train_costs = []
def draw_train_process(iters, train_costs):
title="training cost"
plt.title(title, fontsize=24)
plt.xlabel("iter", fontsize=14)
plt.ylabel("cost", fontsize=14)
plt.plot(iters, train_costs, color='red', label='training cost')
plt.grid()
plt.show()
# 模型训练
EPOCH_NUM=50
#训练EPOCH_NUM轮
for pass_id in range(EPOCH_NUM):
# 开始训练并输出最后一个batch的损失值
train_cost = 0
#遍历train_reader迭代器
for batch_id, data in enumerate(train_loader()):
inputs = paddle.to_tensor(data[0])
labels = paddle.to_tensor(data[1])
out = net(inputs)
train_loss = paddle.mean(paddle.nn.functional.square_error_cost(out, labels))
train_loss.backward()
optimizer.step()
optimizer.clear_grad()
#打印最后一个batch的损失值
if batch_id % 40 == 0:
print("Pass:%d, Cost:%0.5f" % (pass_id, train_loss))
iter = iter + BATCH_SIZE
iters.append(iter)
train_costs.append(train_loss.numpy()[0])
# 开始测试并输出最后一个batch的损失值
test_loss = 0
#遍历test_reader迭代器
for batch_id, data in enumerate(valid_loader()):
inputs = paddle.to_tensor(data[0])
labels = paddle.to_tensor(data[1])
out = net(inputs)
test_loss = paddle.mean(paddle.nn.functional.square_error_cost(out, labels))
#打印最后一个batch的损失值
print('Test:%d, Cost:%0.5f' % (pass_id, test_loss))
#保存模型
paddle.save(net.state_dict(), 'fit_a_line.pdparams')
draw_train_process(iters,train_costs)
#绘制真实值和预测值对比图
infer_results = []
groud_truths = []
def draw_infer_result(groud_truths, infer_results):
title='Boston'
plt.title(title, fontsize=24)
x = np.arange(1,20)
y = x
plt.plot(x, y)
plt.xlabel('ground truth', fontsize=14)
plt.ylabel('infer result', fontsize=14)
plt.scatter(groud_truths, infer_results, color='green',label='training cost')
plt.grid()
plt.show()
# 模型预测
import paddle
import numpy as np
import matplotlib.pyplot as plt
valid_dataset = paddle.text.UCIHousing(mode='test')
infer_loader = paddle.io.DataLoader(valid_dataset, batch_size=200)
infer_net = paddle.nn.Linear(13, 1)
param = paddle.load('fit_a_line.pdparams')
infer_net.set_dict(param)
data = next(infer_loader())
inputs = paddle.to_tensor(data[0])
results = infer_net(inputs)
for idx, item in enumerate(zip(results, data[1])):
print("Index:%d, Infer Result: %.2f, Ground Truth: %.2f" % (idx, item[0], item[1]))
infer_results.append(item[0].numpy()[0])
groud_truths.append(item[1].numpy()[0])
draw_infer_result(groud_truths, infer_results)
高层API助你快速上手深度学习七日打卡营即将开始,你准备好了吗!
Python自带一个调试器, 在Python 3.7之后甚至成为内置调试器. 这就是PDB.
Python附带了一个名为pdb的有用模块,它基本上是一个交互式源代码调试器:
import pdb
pdb.set_trace() # 这个表示添加断点
一旦开始运行, 会出现交互框:
具体命令:
n
p
,如p num1
b
:
var_b = 'something'
q
,正在执行的程序被中止;还有一种更好的方式, 叫ipdb. 用法和PDB很相似. 不过返回的输出是彩色的:
!
安装:
#如发现环境中未安装, 可以运行下方代码来安装ipdb
!pip install ipdb -i https://pypi.tuna.tsinghua.edu.cn/simple
# conda创建本地虚拟环境:
conda create -n piddle python=3.7
source activate piddle
# 安装piddle:https://www.paddlepaddle.org.cn/install/quick?docurl=/documentation/docs/zh/2.0/install/pip/macos-pip.html
python -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
# 测试
import paddle.fluid
paddle.fluid.install_check.run_check()