云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

阿里云_浚县网站建设_哪家好

小七 141 0

如何(不)在6个简单步骤中扩展深度学习

在数据库里试试这个笔记本导言:问题深造有时看起来像是魔法。它最先进的应用有时令人愉快,有时令人不安。令人惊讶的是,实现这些结果的工具大多是开源的,并且可以在强大的硬件上发挥他们的魔力,这些硬件可以在云中按小时出租。难怪公司急于将深度学习应用于更平淡无奇的商业问题,比如更好的客户流失预测、图像管理、聊天机器人、时间序列分析等等。仅仅因为这些工具是现成的并不意味着它们很容易被很好地使用。即使选择正确的架构、层和激活,也比科学更艺术。本博客将不探讨如何调整深度学习体系结构的准确性。然而,这个过程确实需要在反复试验的过程中训练大量的模型。这导致了一个更直接的问题:提高深度学习培训的绩效。调优深度学习培训与调优ETL作业的工作方式不同。它需要从专门的硬件上进行大量的计算,最终每个人都会发现深度学习训练"太慢"。当用户试图扩大规模时,往往会忽略一些影响性能的基本错误,而寻求的解决方案可能会过于苛刻、昂贵且速度不快。本博客将介绍一些基本步骤,以避免培训中常见的性能陷阱,然后是正确的步骤,以便通过应用更复杂的工具和更多的硬件来扩大规模。希望您会发现,您的建模工作可以更快地进行,而无需立即获取额外的gpu集群。简单的分类任务因为这里的重点不是学习问题本身,下面的例子将开发一个简单的数据集和要解决的问题:将加州理工学院256数据集(约30000幅图像)分成257个类别(是的,257个)。数据由JPEG文件组成。这些需要调整到通用尺寸299×299,以匹配下面描述的预先训练的基层。然后将图像写入带有标签的拼花板文件,以便于更大规模的培训,稍后将介绍。这可以通过apachespark中的"二进制"文件数据源来实现。请参阅随附的笔记本以获取完整的源代码,但以下是亮点:图像大小=299def scale_图像(图像字节):图像=图像.打开(拜特西奥(图像字节)).convert('RGB')  图像.缩略图((图像大小,图像大小),图像.反别名)x,y=图像大小带_bg=图像.new('RGB',(图像大小,图像大小),(255,255,255))与_背景粘贴(图像,框=((img_size-x)//2,(img_size-y)//2))返回_bg.T字节()...原始图像_df=spark.read.format("二进制文件")\option("pathGlobFilter","*.jpg").option("recursiveFileLookup","true")\加载(加州理工大学256路径)。重新分区(64)image_df=原始图像_数据框选择(文件\u to_label_udf("path").alias("label"),scale_image_udf("content").alias("image")).cache()(列车图像_df,测试图像_df)=图像_随机分割([0.9,0.1],种子=42)...列车图像_df.write.option.选项("拼花砖尺寸",1024*1024)\拼花地板(桌子路径底座+"火车")测试图像_df.write.option.选项("拼花砖尺寸",1024*1024)\拼花地板(table_path_base+"测试")也可以使用Spark内置的"image"数据源类型来读取这些数据。Keras是Tensorflow的高级前端,它可以描述一个直接的深度学习模型来对图像进行分类。不需要从头开始构建图像分类器。相反,本例重用了Keras中内置的预训练异常模型,并在顶部添加了一个密集层来进行分类。如Kertensor1.13所述(注1.1)tensorflow.keras公司,而不是独立的Keras 2.2.4)。经过预训练的图层本身将不再接受进一步的训练。第0步:在处理图像时使用转移学习和预训练模型!步骤1:使用GPU在CPU上训练深度学习模型几乎唯一有意义的情况是当没有可用的gpu时。在云中工作时,在Databricks这样的平台上,为一台机器提供一个GPU并准备好所有驱动程序和库是很简单的。这个例子将直接在一个K80 GPU上训练这个模型。第一个过程将从Parquet加载10%的数据样本作为pandas数据帧,重塑图像数据,并在内存中训练90%的样本。在这里,训练只进行60个时期的小批量训练。小提示:使用预训练网络时,必须将图像值规格化为网络期望的范围。这里是[-1,1],Keras提供了一个预处理输入函数来实现这一点。(注意:要在Databricks上运行这个示例,请选择支持GPU的5.5ml或更高版本的运行时,并选择带有单个GPU的驱动程序实例类型。因为该示例也使用Spark,因此还必须提供1个worker。)df_pd=spark.read.拼花地板("…)。样本(0.1,种子=42).toPandas()X_raw=df_pdimage"]。值X=np.数组([预处理_输入(    np.frombuffer(X_raw[i],数据类型=np.uint8公司).整形((img_size,img_size,3)))对于范围内的i(len(X_raw))])y=df_pdlabel"]。值为-1#-1,因为标签是基于1的X_序列,X_测试,y_测试,y_测试=序列测试_分割(X,y,测试_大小=0.1,随机状态=42)...def构建模型(dropout=None):模型=顺序()异常=异常(include_top=False,输入形状=(img_size,img_size,3),pooling='avg')用于分层异常层:    可训练层=错误  模型.add(例外)如果辍学:    模型.add(辍学)  模型.add(稠密(257,activation='softmax'))收益模型模型=构建模型()模型.编译(优化器=Nadam(lr=0.001),loss='sparse_categorical_crossentry',metrics=['精度'])模型.拟合(X列,y列,批处理大小=2,时间段=60,详细信息=2)模型.评估(X检验,y检验)...纪元58/60-65s-损耗:0.2787-加速度:0.9280纪元59/60-65s-损耗:0.3425-加速度:0.9106纪元60/60-65s-损耗:0.3525-acc:0.9173...[1.913768016828665,0.7597173]结果看起来不错-91.7%的准确率!然而,有一个重要的缺陷。最后对10%的验证数据进行了评价,其真实准确率更接近76%。实际上,这个模型已经过拟合了。这不好,但更糟的是,这意味着大部分的训练时间都花在让情况变得更糟。当验证数据的准确性停止下降时,它应该已经结束。这不仅会留下一个更好的模型,而且会更快地完成。第二步:提前停车Keras(和其他框架)有内置的支持,可以在进一步的培训使模型变得更糟时停止。在Keras,这是最早的回调。使用它意味着将验证数据传递到训练过程中,以便对每个历元进行评估。训练将在几个时期都没有改善之后停止。restore_best_weights=True确保最终模型的权重来自其最佳纪元,而不仅仅是最后一个。这应该是您的默认设置。...早停=早停(耐心=3,监视器='val_acc',最小增量=0.001,还原最佳权重=真,详细=1)模型.拟合(X列,y列,批处理大小=2,周期=60,冗余=2验证数据=(X_测试,y_测试),回调=[早期停止])模型.评估(X检验,y检验)...纪元12/60-74s-损耗:0.9468-加速度:0.7689-损耗:1.2728-损耗:0.7597纪元13/60-75s-损耗:0.8886-加速度:0.7795-真空损耗:1.4035-真空加速:0.7456纪元14/60从最佳纪元的末尾恢复模型权重。-80s-损耗:0.8391-加速度:0.7870-损耗:1.4467-损耗:0.7420纪元00014:早停...[1.3035458562230895,0.7597173]现在,训练停止在14个时代,而不是60和18分钟。由于验证数据的评估,每个纪元花费的时间都稍长(75秒对65秒)。准确率也更好,为76.7%。对于早期停止,请注意传递给fit()的epoch的数量只作为将要运行的最大epoch数的限制。它可以设置为一个大值。这是第一次有一些观察表明了同样的事情:作为一个训练单元,时代并不重要。它们只是构成培训全部输入的大量数据。但是训练意味着批量重复传递数据,直到模型得到足够的训练。代表多少个时代并不直接重要。尽管如此,纪元仍然是有用的,可以作为训练每一数据量所需时间的比较点。步骤3:最大输出GPU和更大的批量大小在Databricks中,集群度量通过基于Ganglia的UI公开。这显示了训练期间GPU的利用率。监视利用率对于调优非常重要,因为它可能会提示瓶颈。在这里,GPU在90%左右得到了很好的使用:100%比90%冷。2的批处理大小很小,在处理过程中GPU不够忙。增加批处理大小将提高利用率。目标不仅是使GPU更忙,而且从额外的工作中获益。较大的批处理可以提高每个批处理使用更精确的渐变更新模型(直到某个点)的效果。这反过来可以让培训使用更高的学习率,更快地达到模型停止改进的程度。或者,有了额外的容量,就有可能增加网络体系结构本身的复杂性来利用这一点。本例不打算探讨如何调整体系结构,但将尝试添加一些中断,以减少网络过度适应的趋势。模型=构建模型(退出=0.5)模型.编译(优化器=Nadam(lr=0.004),loss='sparse_categorical_crossentry',metrics=['精度'])模型.拟合(X列,y列,批处理大小=16,周期=30,冗余=2验证数据=(X_测试,y_测试),回调=[早期停止])…纪元6/30-56s-损耗:0.1487-加速度:0.9583-真空损耗:1.1105-真空加速:0.7633纪元7/30-56s-损耗:0.1022-加速度:0.9717-损耗:1.2128-损耗:0.7456纪元8/30-56s-损耗:0.085