在这个任务是对坐标进行回归,使用均方误差(Mean Square error )损失函数 paddle.nn.MSELoss()
来做计算,飞桨 2.0 中,在 nn 下将损失函数封装成可调用类。这里使用 paddle.Model 相关的 API 直接进行训练,只需要定义好数据集、网络模型和损失函数即可。
使用模型代码进行 Model 实例生成,使用 prepare 接口定义优化器、损失函数和评价指标等信息,用于后续训练使用。在所有初步配置完成后,调用 fit 接口开启训练执行过程,调用 fit 时只需要将前面定义好的训练数据集、测试数据集、训练轮次(Epoch)和批次大小(batch_size)配置好即可。
本案例将会使用飞桨提供的 API 完成数据集的下载并为后续的训练任务准备好数据迭代器。cifar10 数据集由 60000 张大小为 32 * 32 的彩色图片组成,其中有 50000 张图片组成了训练集,另外 10000 张图片组成了测试集。这些图片分为 10 个类别,将训练一个模型能够把图片进行正确的分类。
# 如何合并两个字典在python3.5 +
>>> x = {'a': 1, 'b': 2}
>>> y = {'b': 3, 'c': 4}
>>> z = {**x, **y}
>>> z
{'c': 4, 'a': 1, 'b': 3}
# 在Python中2.x你可以用这个:
>>> z = dict(x, **y)
>>> z
{'a': 1, 'c': 4, 'b': 3}
# 在这些示例中,Python按照表达式中列出的顺序合并字典键,从左到右覆盖重复项。
# 在Python中同时测试多个标志的不同方法
x, y, z = 0, 1, 0
if x == 1 or y == 1 or z == 1:
print('passed')
if 1 in (x, y, z):
print('passed')
# These only test for truthiness:
if x or y or z:
print('passed')
if any((x, y, z)):
print('passed')
# 如何按值对Python dict进行排序(==获得按值排序的表示)
>>> xs = {'a': 4, 'b': 3, 'c': 2, 'd': 1}
>>> sorted(xs.items(), key=lambda x: x[1])
[('d', 1), ('c', 2), ('b', 3), ('a', 4)]
# Or:
>>> import operator
>>> sorted(xs.items(), key=operator.itemgetter(1))
[('d', 1), ('c', 2), ('b', 3), ('a', 4)]
# dicts上的get()方法及其“默认”参数
name_for_userid = {
382: "Alice",
590: "Bob",
951: "Dilbert",
}
def greeting(userid):
return "Hi %s!" % name_for_userid.get(userid, "there")
>>> greeting(382)
"Hi Alice!"
>>> greeting(333333)
"Hi there!"
# 使用namedtuple比手动定义类要短得多:
>>> from collections import namedtuple
>>> Car = namedtuple('Car', 'color mileage')
# 我们新的“Car”类按预期工作:
>>> my_car = Car('red', 3812.4)
>>> my_car.color
'red'
>>> my_car.mileage
3812.4
# 我们得到一个不错的字符串repr:
>>> my_car
Car(color='red' , mileage=3812.4)
# 和元组一样,namedtuple也是不可变的:
>>> my_car.color = 'blue'
AttributeError: "can't set attribute"
# 对于dicts的标准字符串repr很难阅读:
>>> my_mapping = {'a': 23, 'b': 42, 'c': 0xc0ffee}
>>> my_mapping
{'b': 42, 'c': 12648430. 'a': 23} # �0�6
# “json”模块可以做得更好:
>>> import json
>>> print(json.dumps(my_mapping, indent=4, sort_keys=True))
{
"a": 23,
"b": 42,
"c": 12648430
}
# 注意,这只适用于包含基本类型的字典(检查“pprint”模块):
>>> json.dumps({all: 'yup'})
TypeError: keys must be a string
# Python为什么很棒:函数参数解包
def myfunc(x, y, z):
print(x, y, z)
tuple_vec = (1, 0, 1)
dict_vec = {'x': 1, 'y': 0, 'z': 1}
>>> myfunc(*tuple_vec)
1, 0, 1
>>> myfunc(**dict_vec)
1, 0, 1
# “timeit”模块允许您度量一小段Python代码的执行时间
>>> import timeit
>>> timeit.timeit('"-".join(str(n) for n in range(100))',
number=10000)
0.3412662749997253
>>> timeit.timeit('"-".join([str(n) for n in range(100)])',
number=10000)
0.2996307989997149
>>> timeit.timeit('"-".join(map(str, range(100)))',
number=10000)
0.24581470699922647
# Python为什么这么棒:就地值交换
# 假设我们想交换a和b的值。
a = 23
b = 42
# 使用临时变量的“经典”方法:
tmp = a
a = b
b = tmp
# Python也让我们使用这个简短的方法:
a, b = b, a
# 函数是Python中的特殊地位
# 它们可以作为参数传递给其他函数,也可以作为其他函数的值返回,也可以分配给变量并存储在数据结构中
>>> def myfunc(a, b):
... return a + b
...
>>> funcs = [myfunc]
>>> funcs[0]
<function myfunc at 0x107012230>
>>> funcs[0](2, 3)
5
# 因为Python拥有一流的函数,所以它们可以用来模拟switch/case语句
def dispatch_if(operator, x, y):
if operator == 'add':
return x + y
elif operator == 'sub':
return x - y
elif operator == 'mul':
return x * y
elif operator == 'div':
return x / y
else:
return None
def dispatch_dict(operator, x, y):
return {
'add': lambda: x + y,
'sub': lambda: x - y,
'mul': lambda: x * y,
'div': lambda: x / y,
}.get(operator, lambda: None)()
>>> dispatch_if('mul', 2, 8)
16
>>> dispatch_dict('mul', 2, 8)
16
>>> dispatch_if('unknown', 2, 8)
None
>>> dispatch_dict('unknown', 2, 8)
None
# Python在标准库中内置了一个HTTP服务器。这是超级方便的网站预览。
# Python 3.x
$ python -m http.server
# Python 2.x
$ python -m SimpleHTTPServer 8000
# Python的列表理解非常棒。
vals = [expression
for value in collection
if condition]
# 这相当于:
vals = []
for value in collection:
if condition:
vals.append(expression)
# Example:
>>> even_squares = [x * x for x in range(10) if not x % 2]
>>> even_squares
[0, 4, 16, 36, 64]
# Python 3.5+支持“类型注释”,可以与Mypy等工具一起使用来编写静态类型的Python:
def my_add(a: int, b: int) -> int:
return a + b
# Python的列表片语法可以在没有索引的情况下用于一些有趣而有用的事情
# 你可以清除列表中的所有元素:
>>> lst = [1, 2, 3, 4, 5]
>>> del lst[:]
>>> lst
[]
# 您可以替换列表的所有元素,而不需要创建一个新的列表对象:
>>> a = lst
>>> lst[:] = [7, 8, 9]
>>> lst
[7, 8, 9]
>>> a
[7, 8, 9]
>>> a is lst
True
# 您还可以创建列表的(浅)副本:
>>> b = lst[:]
>>> b
[7, 8, 9]
>>> b is lst
False
# collections.Counter 允许您在一个迭代中查找最常见的元素:
>>> import collections
>>> c = collections.Counter('helloworld')
>>> c
Counter({'l': 3, 'o': 2, 'e': 1, 'd': 1, 'h': 1, 'r': 1, 'w': 1})
>>> c.most_common(3)
[('l', 3), ('o', 2), ('e', 1)]
# 什么时候用__repr__ 和 __str__模拟std库的功能:
>>> import datetime
>>> today = datetime.date.today()
# __str__ 摔交的结果应是可读的:
>>> str(today)
'2017-02-02'
# __repr__的结果应明确如下:
>>> repr(today)
'datetime.date(2017, 2, 2)'
# Python解释器会话使用__repr__检查对象:
>>> today
datetime.date(2017, 2, 2)