1. set_figsize():设置图片大小格式
from IPython import display
from matplotlib import pyplot as plt
def use_svg_display():
display.set_matplotlib_formats('svg')
# 设置图片格式为svg,SVG(Scalable Vector Graphics)是一种基于XML的矢量图形格式,用于描述二维矢量图形。它通常被用来替代传统的位图格式(如JPEG、PNG),特别是在需要图形缩放和高质量渲染的应用场景中。
def set_figsize(figsize=(3.5,2.5)):
# 默认figsize=(3.5,2.5),可以输入其他数值
use_svg_display()
plt.rcParams['figure.figsize']=figsize
# plt.rcParams 是一个用于设置绘图参数的字典,这些参数控制着matplotlib库中的绘图样式和默认行为。plt.rcParams['figure.figsize'] 是其中的一个参数,用于设置绘图窗口的尺寸,即图形对象的大小。
2. data_iter(batch_size,features,labels): 遍历数据集并不断读取batch_size个小批量数据样本,一般在小批量梯度下降前的数据集处理中使用。
from mxnet import nd
import random
def data_iter(batch_size,features,labels):
num_examples=len(features)
# features的行数
indices=list(range(num_examples))
random.shuffle(indices)
# 随机打乱indices,random.shuffle只能接受列表类型
for i in range(0,num_examples,batch_size):
# 0到num_examples,步长为batch_size
j=nd.array(indices[i:min(i+batch_size,num_examples)])
# 使用min函数防止最后一组出现超过num_examples的情况
# indices是随机打乱的,这里是对随机打乱后的indices进行索引的小批量选择
yield features.take(j),labels.take(j)
# yield只能出现在函数中,不能单独使用
# for...yield是通过生成器实现的,它允许在迭代过程中返回一个值,然后在下次迭代时从上次返回的位置继续执行。这种方式可以用于创建惰性计算的迭代器,从而提高内存效率,因为它不会一次性生成所有元素,而是在需要时才计算下一个元素。
# take()根据索引返回对应元素
3. ArrayDataset(*args):生成一个包含多个类似数据集对象(比如数据集,列表,数组)的数据集
DataLoader(dataset,batch_size=None,shuffle=False,sampler=None,last_batch=None,batch_sampler=None,batchify_fn=None,num_workers=0):加载数据集中的数据并返回小批量数据,和前面data_iter效果相似。mxnet包需要根据书中链接安装。
from mxnet.gluon import data as gdata
dataset=gdata.ArrayDataset(features,labels)
# dataset合并后features和labels仍然是分开的,在下一步生成的data_iter中可以分别选取
data_iter=gdata.DataLoader(dataset,batch_size,shuffle=True)
# shuffle 是否打乱数据顺序
4. Sequential():串联各个层的容器
add():向容器中添加层
initialize():初始化层中参数
from mxnet.gluon import nn
from mxnet import init
net=nn.Sequential()
net.add(nn.Dense(1))
# 一个全连接层
net.initialize(init.Normal(sigma=0.01))
# 指定初始化采样于均值为0,标准差为0.01的正态分布
5. L2Loss(): 计算预测值和真实值之间的MSE
from mxnet.gluon import loss as gloss
loss=gloss.L2Loss()
l=loss(net(X),y)
6.Trainer(params,optimizer,optimizer_params=None,kvstore='device',compression_params=None):对一组参数实施优化算法,需要和autograd一起使用
from mxnet import gluon
trainer=gluon.Trainer(net.collect_params(),'sgd',{'learning_rate':0.03})
# net.collect_params()获取net中所有通过add函数嵌套的层所包含的全部参数
with autograd.record():
l=loss(net(X),y)
l.backward()
trainer.step(batch_size)
7.vision.tranforms.ToTensor():应用在图像数据上,实现图像到张量的转换
from mxnet.gluon import data as gdata
transformer=gdata.vision.transforms.ToTensor()
8. evaluate_accuracy(data_iter,net):判断模型的准确率,用到前面提到的data_iter
def evaluate_accuracy(data_iter,net):
acc_sum,n=0.0,0
for X,y in data_iter:
y=y.astype('float32')
acc_sum+=(net(X).argmax(axis=1)==y).sum().asscalar()
# net(X).argmax(axis=1)返回矩阵中每行最大元素的索引
n+=y.size
return acc_sum/n
9.train_ch3(net,train_iter,test_iter,loss,num_epochs,batch_size,params=None,lr=None,trainer=None):训练模型
def train_ch3(net,train_iter,test_iter,loss,num_epochs,batch_size,params=None,lr=None,trainer=None):
for epoch in range(num_epochs):
train_l_sum,train_acc_sum,n=0.0,0.0,0
for X,y in train_iter:
with autograd.record():
y_hat=net(X)
l=loss(y_hat,y).sum()
l.backward()
if trainer is None:
d2l.sgd(params,lr,batch_size)
else:
trainer.step(batch_size)
y=y.astype('float32')
train_l_sum+=l.asscalar()
train_acc_sum+=(y_hat.argmax(axis=1)==y).sum().asscalar()
n+=y.size
test_acc=evaluate_accuracy(test_iter,net)
print(f'epoch {epoch+1},loss {train_l_sum/n:.4f},train acc{train_acc_sum/n:.3f}, test acc{test_acc:.3f}')
参考资料:
《动手学深度学习》