百度深度学习集训营已经正式开营,每个阶段的作业都将有各自的奖励,欢迎大家学习~
PS:如遇帖子过期、审核不通过的情况,请先复制内容保存在word文档,然后根据提示,完成个人实名验证,刷新后重新粘贴复制的内容,即可提交~
欢迎大家报名参加~
1月9日作业:
作业9-1:在第二章中学习过如何设置学习率衰减,这里建议使用分段衰减的方式,衰减系数为0.1, 根据ResNet目前的训练情况,应该在训练到多少步的时候设置衰减合适?请设置好学习率衰减方式,在眼疾识别数据集iChallenge-PM上重新训练ResNet模型。
作业9-1奖励:在作业中随机各抽取5名同学送出飞桨本+数据线+飞桨贴纸
回复帖子形式: 作业9-1:XXX
抽奖作业截止时间:2020年1月13日中午12点之前
作业9-2奖励:在作业中随机各抽取5名同学送出飞桨本+数据线+飞桨贴纸
回复帖子形式: 作业9-2:XXX
抽奖作业截止时间:2020年1月13日中午12点之前
1月7日作业:
作业8:如果将LeNet模型中的中间层的激活函数Sigmoid换成ReLU,在眼底筛查数据集上将会得到什么样的结果?Loss是否能收敛,ReLU和Sigmoid之间的区别是引起结果不同的原因吗?请发表你的观点
作业8奖励:在作业中随机各抽取5名同学送出飞桨本+数据线+飞桨贴纸
回复帖子形式: 作业8:XXX
获奖同学:#820 thunder95、#819 你还说不想我吗、 #818 百度用户#0762194095、#817 呵赫 he、#816 星光1dl
1月2日作业
作业7-1 计算卷积中一共有多少次乘法和加法操作
输入数据形状是[10, 3, 224, 224],卷积核kh = kw = 3,输出通道数为64,步幅stride=1,填充ph = pw =1
完成这样一个卷积,一共需要做多少次乘法和加法操作?
提示:先看输出一个像素点需要做多少次乘法和加法操作,然后再计算总共需要的操作次数
提交方式:请回复乘法和加法操作的次数,例如:乘法1000,加法1000
作业7-1奖励:抽取5人赢得飞桨定制本+数据线,截止时间2020年1月6日中午12点之前
回复帖子形式: 作业7-1:XXX
作业7-2奖励:从正确答案中抽取5人获得飞桨定制本+50元京东卡,截止时间2020年1月6日中午12点之前
12月31日作业
作业6-1:
1.将普通神经网络模型的每层输出打印,观察内容
2.将分类准确率的指标 用PLT库画图表示
3.通过分类准确率,判断以采用不同损失函数训练模型的效果优劣
4.作图比较:随着训练进行,模型在训练集和测试集上的Loss曲线
5.调节正则化权重,观察4的作图曲线的变化,并分析原因
作业6-1奖励:抽取5人赢得飞桨定制本+数据线 ,回复帖子形式: 作业6-1:XXX
作业6-2:
正确运行AI Studio《百度架构师手把手教深度学习》课程里面的作业3 的极简版代码,分析训练过程中可能出现的问题或值得优化的地方,通过以下几点优化:
(1)样本:数据增强的方法
(2)假设:改进网络模型
(2)损失:尝试各种Loss
(2)优化:尝试各种优化器和学习率
目标:尽可能使模型在mnist测试集上的分类准确率最高
提交实现最高分类准确率的代码和模型,我们筛选最优结果前10名进行评奖
作业6-2奖励:飞桨定制本+50元京东卡
12月25日作业
12月23日作业
作业4-1:在AI studio上运行作业2,用深度学习完成房价预测模型
作业4-1奖励:飞桨定制本+ 《深度学习导论与应用实践》教材,选取第2、3、23、123、223、323…名同学送出奖品
作业4-2:回复下面问题,将答案回复帖子下方:
通过Python、深度学习框架,不同方法写房价预测,Python编写的模型 和 基于飞桨编写的模型在哪些方面存在异同?例如程序结构,编写难易度,模型的预测效果,训练的耗时等等?
回复帖子形式: 作业4-2:XXX
作业4-2奖励:在12月27日(本周五)中午12点前提交的作业中,我们选出最优前五名,送出百度定制数据线+《深度学习导论与应用实践》教材
12月17日作业
完成下面两个问题,并将答案回复在帖子下面,回帖形式:作业3-1(1)XX(2)XX
作业奖励:在2019年12月20日中午12点之前提交,随机抽取5名同学进行点评,礼品是本+数据线
12月12日作业
获奖者:第12名:飞天雄者
12月10日作业
作业1-1:在AI Studio平台上https://aistudio.baidu.com/aistudio/education/group/info/888 跑通房价预测案例
作业1-1奖励:最先完成作业的前3名,以及第6名、66名、166名、266名、366名、466名、566名、666名的同学均可获得飞桨定制大礼包:飞桨帽子、飞桨数据线 、飞桨定制logo笔
作业1-1的获奖者如图:
作业1-2:完成下面两个问题,并将答案发布在帖子下面
①类比牛顿第二定律的案例,在你的工作和生活中还有哪些问题可以用监督学习的框架来解决?假设和参数是什么?优化目标是什么?
②为什么说AI工程师有发展前景?怎样从经济学(市场供需)的角度做出解读?
作业1-2奖励:回复帖子且点赞top5,获得《深度学习导论与应用实践》教材+飞桨定制本
点赞Top5获奖者:1.飞天雄者 2.God_s_apple 3.177*******62 4.学痞龙 5.故乡237、qq526557820
作业截止时间2020年1月10日,再此之前完成,才有资格参加最终Mac大奖评选
报名流程:
1.加入QQ群:726887660,班主任会在QQ群里进行学习资料、答疑、奖品等活动
2.点此链接,加入课程报名并实践:https://aistudio.baidu.com/aistudio/course/introduce/888
温馨提示:课程的录播会在3个工作日内上传到AI studio《百度架构师手把手教深度学习》课程上
作业4-2: 通过Python、深度学习框架,不同方法写房价预测,Python编写的模型 和 基于飞桨编写的模型在哪些方面存在异同?例如程序结构,编写难易度,模型的预测效果,训练的耗时等等?
程序结构:
代码执行的效率上飞桨会比较高
编写难易度:
使用框架编写很简单,调包侠嘛,效率高。自己编写模型要有强硬的数学功底支撑,代码量看个人情况,有的是非常巨大(算法差异),而且容易出错,不适合小白。
模型的预测效果:
框架当然效果更好
训练的耗时:
深度学习框架的运算速度远远快于python编写的模型的,
使用性上:
框架使用起来很方便,支持许多的模型,直接导入数据训练就可以了。
作业4-2: 通过Python、深度学习框架,不同方法写房价预测,Python编写的模型 和 基于飞桨编写的模型在哪些方面存在异同?例如程序结构,编写难易度,模型的预测效果,训练的耗时等等?
1. 程序结构:飞桨结构清晰统一,Python仁者见仁,智者见智
2. 编写难易度:飞桨可照猫画虎,Python得弄清原理
3. 训练耗时:飞桨速度快, Python取决于编写者的技术水平
4. 预测效果:飞桨预测效果稳定,Python效果取决于编写者的技术水平
作业4-2:
通过Python、深度学习框架,不同方法写房价预测,Python编写的模型 和 基于飞桨编写的模型在哪些方面存在异同?例如程序结构,编写难易度,模型的预测效果,训练的耗时等等?
大大提升了工作效率,缩短了项目实现时间,可以将更多精力放在算法的实现与改进上;
程序结构上:使得程序看上去更加简洁,易于修改维护,统一的结构上下去实现任务,很方便移植到新的任务上;逻辑上清晰易懂,便于修改。
编写难易度上:直接可以调用相关接口,便于理解,编写修改。
模型的预测效果上:以为是调试好的框架,所以可以很稳定的进行模型预测部署,效果很好。
训练耗时:飞桨框架API可以方便的选择使用cpu或者gpu,目前使用的Tesla V100很快,效果也很好。
作业4-2:
通过Python、深度学习框架,不同方法写房价预测,Python编写的模型 和 基于飞桨编写的模型在哪些方面存在异同?例如程序结构,编写难易度,模型的预测效果,训练的耗时等等?
Paddle与其他框架都大同小异,常用的模型和网络都有实现,只是为了避免反复发明轮子。对于初学者来说,就是看哪个框架的入门文档写的更好更完善,远没到构建实现新结构和损失函数的阶段。预测效果和训练的资源与耗时那更是后话。AI Studio提供了《深度学习导论与应用实践》这书的全部代码实现和免费算力资源倒是很好的开始。
作业4-2: 通过Python、深度学习框架,不同方法写房价预测,Python编写的模型 和 基于飞桨编写的模型在哪些方面存在异同?例如程序结构,编写难易度,模型的预测效果,训练的耗时等等?
1.程序结构上,飞浆更加简洁,清晰,逻辑一目了然,易于更新维护;而Python则显得略微臃肿,不适合快速上手入门,需要极高的数学功底。
2.编写难易度:飞浆可以直接调用大量现成库,更加容易实现算法并测试效果;python会消耗大量时间在模型搭建 上,不利于算法创新与优化
3.飞浆有现成模型,有大量预训练模型,可以实现模型快速收敛,训练速度很快;python几乎很少有预训练模型,很多算法需要从零训练,模型收敛慢,且模型收敛速度受制于编写者本身水平。
4.预测效果:飞浆经过大量验证预测效果趋于稳定,python预测效果取决编写者代码编写水平,模型优化参差不齐,无法带来稳定的预测结果。
作业5-1:
作业5-2:
常见的卷积网络结构
1.Lenet首次让卷积神经网络登上研究界,证明机器学习到的特征也能媲美我们人类手动设计的特征
2.AlexNet,通过多个不同大小卷积核构成的卷积层,池化层得到一个不错的模型
3.VGGNet,提出以一个Block来构建网络的基本架构,后续引入BatchNormalization
4.InceptionNet 一个Block通过1x1卷积 池化 3x3 卷积 5x5卷积,最后在通道维上连结,实现较好的准确率
5.NiN,通过在卷积层中加入多层1x1卷积核,来达到全连接层的效果,实现更好的非线性变换
6.ResNet,通过跳跃连结实现残差结构,能加深网络结构,防止梯度消失
7.DenseNet,受ResNet启发,每次卷积都只卷积很少的通道数,最后连结到通道维数,并通过transition layer来减小模型参数,从而让通道信息很丰富,参数少,但是显存占用较大
8.MobileNet,提出Depthwise和Separable卷积,在达到普通卷积效果的同时,减少参数量
9.ShuffleNet,引入通道混洗的概念,进一步减少计算量
10.Mixnet, 通过多个卷积核卷积连结,减小参数量的同时提高精度
11.SEnet,创新性的引入SEBlock,计算每个通道的重要性并与对应特征图相乘,并且不需要改动原有的网络结构就可以将SEBlock应用在其他结构当中
5.3:
Adam优化算法下降Loss值更快,更容易让模型收敛
作业5.1
(代码)
#读取dataNum条随机抽取的测试集数据
def readData(dataNum):
testset = paddle.dataset.mnist.test()
test_reader = paddle.batch(testset, batch_size=10000)#一次读取全部10000条测试集数据
for batch_id, data in enumerate(test_reader()):
data = np.array(data)
np.random.shuffle(data)#打乱顺序以获得随机抽取效果
data = data[:dataNum]
img_data = np.array([x[0] for x in data])#.astype("float32")
label_data = np.array([x[1] for x in data]).astype("int32")
#print("图像数据形状为:", img_data.shape)
#print("图像标签形状和数据为:", label_data.shape, label_data)
return img_data, label_data
# 定义预测过程
def predict(img_data, label_data):
with fluid.dygraph.guard():
model = MNIST("mnist")
model_dict, _ = fluid.load_dygraph("mnist")
model.load_dict(model_dict)
model.eval()
tensor_img = np.array([img_data])
result = model.forward(fluid.dygraph.to_variable(tensor_img)).numpy().astype('int32')[0][0]#预测输出取整,即为预测的数字
#print("本次预测的数字是", result)
if(result == label_data):
return True
else:
return False
N = 100
img_data, label_data = readData(N)#随机抽取100条测试集数据
#plt.imshow(img_data[0].reshape(28, 28))
result = []
for id, ld in zip(img_data, label_data):
result.append(predict(id, ld))
print("线性回归模型测试{}张图片的正确率是:{:%}".format(N, np.sum(result) / N))
(结论)
线性回归模型在0.001学习率下训练10轮后预测100张图片的准确率大概是20%多一点。
作业5.2
常用的卷积神经网络有:LeNet、AlexNet、VGGNet、inception、ResNet、DenseNet等,这些经典模型在分类准确率上表现越来越好,而MobileNet和ShulfleNet更适合于部署在边缘端等轻量级硬件设备上。
作业5.3
(代码)
#分别用'SGD', 'Momentum', 'Adagrad', 'Adam'四种优化算法,在0.001~0.01(递增步长0.001)学习率下训练模型时loss的变化,并边训练边记录在文件里。
fileName = ['SGD', 'Momentum', 'Adagrad', 'Adam']
def train(opti, learningRate, epoch_num):
#仅优化算法的设置有所差别
with fluid.dygraph.guard():
model = MNIST("mnist")
model.train()
#调用加载数据的函数
train_loader = load_data('train')
#四种优化算法的设置方案,可以逐一尝试效果
if opti == fileName[0]:
optimizer = fluid.optimizer.SGDOptimizer(learning_rate=learningRate)
elif opti == fileName[1]:
optimizer = fluid.optimizer.MomentumOptimizer(learning_rate=learningRate, momentum=0.9)
elif opti == fileName[2]:
optimizer = fluid.optimizer.AdagradOptimizer(learning_rate=learningRate)
elif opti == fileName[3]:
optimizer = fluid.optimizer.AdamOptimizer(learning_rate=learningRate)
avgLostArr = []
EPOCH_NUM = epoch_num
for epoch_id in range(EPOCH_NUM):
for batch_id, data in enumerate(train_loader()):
#准备数据,变得更加简洁
image_data, label_data = data
image = fluid.dygraph.to_variable(image_data)
label = fluid.dygraph.to_variable(label_data)
#前向计算的过程
predict = model(image)
#计算损失,取一个批次样本损失的平均值
loss = fluid.layers.cross_entropy(predict, label)
avg_loss = fluid.layers.mean(loss)
avgLostArr.append(avg_loss.numpy()[0])
#每训练了100批次的数据,打印下当前Loss的情况
if batch_id % 200 == 0:
print("epoch: {}, batch: {}, loss is: {}".format(epoch_id, batch_id, avg_loss.numpy()))
#后向传播,更新参数的过程
avg_loss.backward()
optimizer.minimize(avg_loss)
model.clear_gradients()
#保存模型参数
fluid.save_dygraph(model.state_dict(), 'mnist')
#print(len(avgLostArr))
#print(avgLostArr)
optimizerName = opti+'_lr_'+str(learningRate)
np.save("./"+optimizerName, np.array(avgLostArr))
arr = np.load(optimizerName+'.npy')
print(optimizerName+'.npy', len(arr), opti, learningRate, epoch_num)
#print(arr)
return(avgLostArr)
for j in range(10):
for i in range(len(fileName)):
train(fileName[i], 0.001 * (j + 1), 1)
#用2d和3d图表显示各种优化算法的效果
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
color = ['blue', 'orange', 'green', 'red']
fileName = ['SGD', 'Momentum', 'Adagrad', 'Adam']
length = 200
def showPic(lr = 0.01, length = 200):
learningRate = str(lr)
plt.figure(figsize=(12,8),dpi=80)
for i in range(len(fileName)):
loss = np.load(fileName[i]+'_lr_'+learningRate+'.npy')
loss = loss[:length]
#print(loss.shape)
plt.plot(range(len(loss)), loss, label=fileName[i]+'_lr_'+learningRate, color=color[i])
plt.legend(loc="upper right")
plt.xlabel('Iteration(learning rate = {})'.format(learningRate))
plt.ylabel('Loss')
plt.show()
for i in range(10):
showPic(0.001 * (i + 1))
def loadLoss(lr = 0.01, length = 200):
learningRate = str(lr)
lossArr = []
for i in range(len(fileName)):
loss = np.load(fileName[i]+'_lr_'+learningRate+'.npy')
loss = loss[:length]
#print(loss.shape)
lossArr.append(loss)
return np.array(lossArr)
lossFrame = []
for i in range(10):
lossFrame.append(loadLoss(0.001 * (i + 1)))
lossFrame = np.array(lossFrame)
#print(lossFrame.shape)
#print(lossFrame.shape[2])
fig = plt.figure(figsize=(12, 8))
ax = Axes3D(fig)
X = np.arange(0, lossFrame.shape[2], 1)
Y = np.arange(0, lossFrame.shape[0] / 1000, 1 / 1000)
X, Y = np.meshgrid(X, Y) #必须加上这段代码
def getZ(i = 0):
Z = []
for y in range(lossFrame.shape[0]):
xArr = []
for x in range(lossFrame.shape[2]):
xArr.append(lossFrame[y][i][x])
xArr = np.array(xArr)
Z.append(xArr)
Z = np.array(Z)
return Z
for i in range(lossFrame.shape[1]):
Z = getZ(i)
ax.plot_surface(X, Y, Z, rstride=1, cstride=1, label='fileName[i]')
ax.set_xlabel('Iteration', color='r')
ax.set_ylabel('Learning Rate', color='r')
ax.set_zlabel('Loss', color='r')
# ax.legend()
plt.show()
(结论)
1.'Momentum', 'Adagrad', 'Adam'三种优化算法再各个学习率下的优化效果都好于'SGD'。优化算法性能比较结果为:'Adam'>'Adagrad'>'Momentum'>'SGD'。
2.学习率越低,这几种优化算法的效率差别越明显。在实际应用中过大的学习率可能会导致模型无法收敛,所以'Adam'等更为优化的算法在较小的学习率下能帮助模型快速收敛是很有帮助的。
(优化算法比较的图表)
12月10日课间作业
①类比牛顿第二定律的案例,在你的工作和生活中还有哪些问题可以用监督学习的框架来解决?假设和参数是什么?优化目标是什么?
预测某热点区域基站的流量,假设框架模型是线性的,模型参数和要预测的时间,地点基站的配置,前一阶段的流量参数有关联,优化目标是预测的流量和实际的流量。
②为什么说AI工程师有发展前景?怎样从经济学(市场供需)的角度做出解读?
以深度学习为基础的AI技术在各行各业的应用价值在于,可以不完全依赖于传统的相关领域知识,在具备基本的高数知识,基本的编程知识的前提的前提下,可以快速解决相关行业问题,节约了学习的时间,而且AI在不同行业中的应用其理论机构都是相同的,可以做到举一反三,加快了发展的进程。
从权值的变化曲线的对比可以看出Paddle网络的各个权值变化的总是领先于手写网络,loss也下降得更快。
作业2-1:
class Network(object):
def __init__(self, num_of_weights):
# 随机产生w的初始值
# 为了保持程序每次运行结果的一致性,此处设置固定的随机数种子
#np.random.seed(0)
self.w1 = np.random.randn(num_of_weights, 13)
self.b1 = 0.
self.w2 = np.random.randn(13, 1)
self.b2 = 0.
def forward(self, x):
z1 = np.dot(x, self.w1) + self.b1
z2 = np.dot(z1, self.w2) + self.b2
self.z1 = z1
return z2
def loss(self, z, y):
error = z - y
num_samples = error.shape[0]
cost = error * error
cost = np.sum(cost) / num_samples
return cost
def gradient(self, x, y):
z = self.forward(x)
N = x.shape[0]
gradient_x2 = 1. / N * np.dot(z-y, self.w2.T)
self.gradient_w2 = 1. / N * np.dot(self.z1.T, (z-y))
self.gradient_b2 = 1. / N * np.sum(z-y)
self.gradient_w1 = 1. / N * np.dot(x.T, gradient_x2)
self.gradient_b1 = 1. / N * np.sum(gradient_x2, axis=0)
self.gradient_b1 = self.gradient_b1[np.newaxis,:]
def update(self, eta = 0.01):
self.w2 = self.w2 - eta * self.gradient_w2
self.b2 = self.b2 - eta * self.gradient_b2
self.w1 = self.w1 - eta * self.gradient_w1
self.b1 = self.b1 - eta * self.gradient_b1
def train(self, training_data, num_epoches, batch_size=10, eta=0.01):
n = len(training_data)
losses = []
for epoch_id in range(num_epoches):
# 在每轮迭代开始之前,将训练数据的顺序随机的打乱,
# 然后再按每次取batch_size条数据的方式取出
np.random.shuffle(training_data)
# 将训练数据进行拆分,每个mini_batch包含batch_size条的数据
mini_batches = [training_data[k:k+batch_size] for k in range(0, n, batch_size)]
for iter_id, mini_batch in enumerate(mini_batches):
#print(self.w.shape)
#print(self.b)
x = mini_batch[:, :-1]
y = mini_batch[:, -1:]
a = self.forward(x)
loss = self.loss(a, y)
self.gradient(x, y)
self.update(eta)
losses.append(loss)
print('Epoch {:3d} / iter {:3d}, loss = {:.4f}'.
format(epoch_id, iter_id, loss))
return losses
作业5-1:
此处基于2-8的code作为base,在第一个cell后运行。
1) 单张图(数字0)测试
代码如下:
结果如下:
2) 随机抽取100张,测试准确率
代码如下:
结果如下:
作业5-2 计算机视觉常见卷积网络:
LeNet(开山鼻祖吧?)
Alexnet(ImageNet上从传统算法转向深度学习的转折点)
GoogleNet
Inception模块,堆叠Inception,瓶颈层
VGG
更深的网络以及更小的卷积核
ResNet
ResBlock,恒等映射,把浅层信息拷贝到深层中,更容易学习,不容易梯度消失
ResNext
增加ResNet的宽度,不是通过增加卷积核来增加残差模块的宽度,而是在每个残差模块内建立多分支
轻量级网络
ShuffleNet
将密集的1x1卷积替换成1x1的group convolution,不过在第一个1x1卷积之后增加了一个channel shuffle操作。对原输入采用stride=2的3x3 avg pool,在depthwise convolution卷积处取stride=2保证两个通路shape相同,然后将得到特征图与输出进行连接,而不是相加,降低计算量与参数大小。
MobileNet
深度可分离卷积,Inverted Residuals和Linear Bottlenecks
作业5-3 手写数字上,哪种算法最好?最优学习率是?
总体上Momentum(0.0625)效果最好
代码部分
训练部分:
可视化部分:
结果如下:
修正#572,第二段代码有缺失补充如下
作业4-2:
问题:通过Python、深度学习框架,不同方法写房价预测,Python编写的模型 和 基于飞桨编写的模型在哪些方面存在异同?例如程序结构,编写难易度,模型的预测效果,训练的耗时等等
对比于非框架方式飞桨编写的模型结构更清晰,更方便于程序员调用细节修改
【源码的缩进没了,再发一次】
作业4-2:对于Python、深度学习框架编写房价预测模型而言,两者相同的地方:程序整体结构是一样的,都包括:数据处理、网络/模型设计、网络训练等过程;不同的地方在于:对于网络设计、训练等过程的实现是自己用numpy编写还是直接调用框架的函数进行完成。正是由于这种差别导致两种方法的结果产生很大的区别:
1)手动编写模型,需要计算繁琐的矩阵运算、梯度反馈等等过程,劳动程度大、设计繁琐而且极其容易出错;而采用深度学习框架进行编写模型时,用户只需要关注模型的逻辑过程,根本不需要具体实现每个细节,因此能够减小重复劳动过程,简单而且不容易出错,因此效率、质量会大大提高;
2)由于框架对优化算法等实现进行了优化提升,因此模型的预测效果明显优于手动编写的模型预测结果,而且训练过程简洁、快速,明显要优于手动编写。
作业5-1:
结果:预测准确率为: 0.28
作业5-2:
(1)LeNet
网络特点
· 每个卷积层包括三部分:卷积、池化和非线性激活函数(sigmoid激活函数)
· 使用卷积提取空间特征
· 降采样层采用平均池化
(2)AlexNet
网络特点
· 使用两块GPU并行加速训练,大大降低了训练时间
· 成功使用ReLu作为激活函数,解决了网络较深时的梯度弥散问题
· 使用数据增强、dropout和LRN层来防止网络过拟合,增强模型的泛化能力
(3)VGGNet
4)ResNet
(5)Inception
(6)DenseNet
(7)MobileNet
(8)ShuffleNet
作业5-3:
学习率设置为0.01的情况下:
(1)使用SGD:
(2)使用Adagrad
(3)使用Adam
(4) 使用Momentum
由上图可知,使用Momentum优化器明显优于其他优化器。
接下来,使用Momentum优化器,分析学习率的影响:
学习率为0.02时:
学习率为0.05时:
学习率为0.08时:
学习率为0.1时:
可以看出,学习率为0.08时效果比较好。
作业 4-2:
程序结构:基于飞桨编写程序结构会简单一些,内部模块已经封装好了,只需要调用,适合已经掌握模型的学习者,而Python编写的模型要自己设计模型内部程序结构,则是更适合初学者,能够更好的去掌握模型。
编写难易度:python编写模型需要对模型内在原理掌握非常透彻,编程基础扎实,基于飞桨编写的模型比较简单,不用自己写内部结构。
模型的预测效果:差别很小
训练的耗时:飞桨使用起来很方便,支持许多的模型,可以按需调用
作业3-1 (1)
(2)
5.3 SGD:loading mnist dataset from ./work/mnist.json.gz ......
epoch: 0, batch: 0, loss is: [2.9618337]
epoch: 0, batch: 200, loss is: [0.4345165]
epoch: 0, batch: 400, loss is: [0.29857]
epoch: 1, batch: 0, loss is: [0.29973477]
epoch: 1, batch: 200, loss is: [0.3055033]
epoch: 1, batch: 400, loss is: [0.31092504]
epoch: 2, batch: 0, loss is: [0.12711337]
epoch: 2, batch: 200, loss is: [0.14189658]
epoch: 2, batch: 400, loss is: [0.15307161]
epoch: 3, batch: 0, loss is: [0.14300567]
epoch: 3, batch: 200, loss is: [0.12479535]
epoch: 3, batch: 400, loss is: [0.15392835]
epoch: 4, batch: 0, loss is: [0.14617053]
epoch: 4, batch: 200, loss is: [0.05970785]
epoch: 4, batch: 400, loss is: [0.05193378]
Adagrad:epoch: 0, batch: 0, loss is: [23.737549]
epoch: 0, batch: 200, loss is: [4.6651053]
epoch: 0, batch: 400, loss is: [4.042445]
epoch: 1, batch: 0, loss is: [4.210341]
epoch: 1, batch: 200, loss is: [2.9507055]
epoch: 1, batch: 400, loss is: [3.4136646]
epoch: 2, batch: 0, loss is: [3.1289194]
epoch: 2, batch: 200, loss is: [3.2356896]
epoch: 2, batch: 400, loss is: [2.4643185]
epoch: 3, batch: 0, loss is: [2.3309803]
epoch: 3, batch: 200, loss is: [2.6524985]
epoch: 3, batch: 400, loss is: [2.4528985]
epoch: 4, batch: 0, loss is: [2.2842317]
epoch: 4, batch: 200, loss is: [3.308255]
epoch: 4, batch: 400, loss is: [2.6887434]
momentum: =0.9时:loading mnist dataset from ./work/mnist.json.gz ......
epoch: 0, batch: 0, loss is: [2.591081]
epoch: 0, batch: 200, loss is: [0.16422454]
epoch: 0, batch: 400, loss is: [0.10947473]
epoch: 1, batch: 0, loss is: [0.08388128]
epoch: 1, batch: 200, loss is: [0.08706795]
epoch: 1, batch: 400, loss is: [0.08236799]
epoch: 2, batch: 0, loss is: [0.0452076]
epoch: 2, batch: 200, loss is: [0.06045965]
epoch: 2, batch: 400, loss is: [0.10962741]
epoch: 3, batch: 0, loss is: [0.14246346]
epoch: 3, batch: 200, loss is: [0.01536376]
epoch: 3, batch: 400, loss is: [0.04603417]
epoch: 4, batch: 0, loss is: [0.05770358]
epoch: 4, batch: 200, loss is: [0.03400549]
epoch: 4, batch: 400, loss is: [0.02229908]
Adam:loading mnist dataset from ./work/mnist.json.gz ......
epoch: 0, batch: 0, loss is: [2.3773913]
epoch: 0, batch: 200, loss is: [0.0413083]
epoch: 0, batch: 400, loss is: [0.01793065]
epoch: 1, batch: 0, loss is: [0.14884354]
epoch: 1, batch: 200, loss is: [0.018266]
epoch: 1, batch: 400, loss is: [0.05751669]
epoch: 2, batch: 0, loss is: [0.02920404]
epoch: 2, batch: 200, loss is: [0.02762874]
epoch: 2, batch: 400, loss is: [0.02966366]
epoch: 3, batch: 0, loss is: [0.0087466]
epoch: 3, batch: 200, loss is: [0.04129151]
epoch: 3, batch: 400, loss is: [0.12814976]
epoch: 4, batch: 0, loss is: [0.06855652]
epoch: 4, batch: 200, loss is: [0.03979217]
epoch: 4, batch: 400, loss is: [0.05869739]
可知在学习率都是0.01的情况下,Momentum效果最好,接下来应该在该算法的 两个参数 学习率和动量因子之中进行调试
[==================================================]t/t10k-images-idx3-ubyte.gz not found, downloading https://dataset.bj.bcebos.com/mnist/t10k-images-idx3-ubyte.gz
[==================================================]t/t10k-labels-idx1-ubyte.gz not found, downloading https://dataset.bj.bcebos.com/mnist/t10k-labels-idx1-ubyte.gz
线性回归模型测试100张图片的正确率是:23.000000%