手把手带你玩转Spark机器学习-深度学习在Spark上的应用

news2024/12/28 20:39:05

系列文章目录

  1. 手把手带你玩转Spark机器学习-专栏介绍
  2. 手把手带你玩转Spark机器学习-问题汇总
  3. 手把手带你玩转Spark机器学习-Spark的安装及使用
  4. 手把手带你玩转Spark机器学习-使用Spark进行数据处理和数据转换
  5. 手把手带你玩转Spark机器学习-使用Spark构建分类模型
  6. 手把手带你玩转Spark机器学习-使用Spark构建回归模型
  7. 手把手带你玩转Spark机器学习-使用Spark构建聚类模型
  8. 手把手带你玩转Spark机器学习-使用Spark进行数据降维
  9. 手把手带你玩转Spark机器学习-使用Spark进行文本处理
  10. 手把手带你玩转Spark机器学习-深度学习在Spark上的应用

文章目录

  • 系列文章目录
  • 前言
  • 一、Apache Spark Timeline
  • 二、开发步骤
    • 1.在jupyter中启动SparkSession 和 SparkContext
    • 2.下载数据
    • 3.用Spark读取图片
    • 3. Transfer Learning
  • 总结


前言

本文将介绍深度学习在Spark上的应用,我们将聚焦于深度学习Pipelines库,并讲解使用DL Pipelines的方式。 我们将讲解如何通过Pipelines实现Transfer Learning,同时通过预训练模型实现来处理少量数据并实现预测。

在这里插入图片描述


一、Apache Spark Timeline

示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。
如上图所示,Deep Learning Pipelines在2017年开始被Apache支持。Deep Learning Pipelines 是一个由 Databricks 创建的开源库,使用 Apache Spark 的 Python 中的可扩展深度学习提供高级 API。
在这里插入图片描述
Deep Learning Pipelines 基于 Apache Spark 的 ML Pipelines 进行训练,并使用 Spark DataFrames 和 SQL 来部署模型。 它包括用于深度学习常见方面的高级 API,因此可以在几行代码中有效地完成它们:

  • 数据导入
  • 在spark ml pipeline中应用预训练模型作为转换器
  • 迁移学习
  • 大规模应用深度学习模型
  • 分布式超参数调优

二、开发步骤

1.在jupyter中启动SparkSession 和 SparkContext

from pyspark.sql import SparkSession

spark = SparkSession.builder.appName("Deep Learning").getOrCreate()
sc = spark.sparkContext
sc

在这里插入图片描述

2.下载数据

在图像上应用深度学习的第一步是加载图像的能力。 Deep Learning Pipelines 创建了实用函数,可以将数百万张图像加载到 DataFrame 中,并以分布式方式自动解码,从而实现大规模操作。

我们将使用由 TensorFlow 的测试花卉照片(存在共享许可)来测试。我们先运行以下命令(我们还将创建一个示例文件夹), 来获取一组花卉照片:

!curl -O http://download.tensorflow.org/example_images/flower_photos.tgz
!tar xzf flower_photos.tgz
!mkdir flower_photos/sample

我们把部分图片名称改的简单些:

!cp flower_photos/daisy/100080576_f52e8ee070_n.jpg flower_photos/sample/
!cp flower_photos/daisy/10140303196_b88d3d6cec.jpg flower_photos/sample/
!cp flower_photos/tulips/100930342_92e8746431_n.jpg flower_photos/sample/

打印部分图片:

# collect all .png files in working dir
fs = !ls flower_photos/sample/*.jpg

import IPython.display as dp

# create list of image objects
images = []
for ea in fs:
    images.append(dp.Image(filename=ea, format='png'))

# display all images
for ea in images:
    dp.display_png(ea)

在这里插入图片描述

3.用Spark读取图片

现在让我们使用 Spark 将这些图像加载为 DataFrame。 spark.readImage 方法将常见格式(jpg、png 等)的图像从 HDFS 存储读取到 DataFrame。 每个图像都以 imageSchema 格式存储为一行。 recursive选项允许从子文件夹中读取图像,例如正负标记样本。 sampleRatio 参数允许您在使用完整数据训练模型之前尝试使用较小的图像样本。

from pyspark.ml.image import ImageSchema
# Read images using Spark
image_df = ImageSchema.readImages("flower_photos/sample/")

如果我们看一下这个dataframe,我们会看到它创建了一个名为“image”的列。

image_df.show()

在这里插入图片描述
image 列包含一个字符串列包含一个带有 schema == ImageSchema 的图像结构。

3. Transfer Learning

在这里插入图片描述
Deep Learning Pipelines 提供了对图像执行迁移学习的实用程序,这是开始使用深度学习的最快(代码和运行时)方法之一。 使用 Deep Learning Pipelines,只需几行代码即可完成。

Deep Learning Pipelines通过Featurizer的概念实现了快速迁移学习。 以下示例结合了 Spark 中的 InceptionV3 模型和逻辑回归,以使 InceptionV3 适应我们的特定领域。 DeepImageFeaturizer 自动剥离预训练神经网络的最后一层,并使用所有先前层的输出作为逻辑回归算法的特征。 由于逻辑回归是一种简单而快速的算法,因此这种迁移学习训练可以使用比从头开始训练深度学习模型通常所需的图像少得多的图像快速收敛。

首先,我们需要为迁移学习创建训练和测试数据帧。

from pyspark.ml.image import ImageSchema
from pyspark.sql.functions import lit
from sparkdl.image import imageIO

tulips_df = ImageSchema.readImages("flower_photos/tulips").withColumn("label", lit(1))
daisy_df = imageIO.readImagesWithCustomFn("flower_photos/daisy", decode_f=imageIO.PIL_decode).withColumn("label", lit(0))
tulips_train, tulips_test, _ = tulips_df.randomSplit([0.1, 0.05, 0.85])  # use larger training sets (e.g. [0.6, 0.4] for getting more images)
daisy_train, daisy_test, _ = daisy_df.randomSplit([0.1, 0.05, 0.85])     # use larger training sets (e.g. [0.6, 0.4] for getting more images)
train_df = tulips_train.unionAll(daisy_train)
test_df = tulips_test.unionAll(daisy_test)

# Under the hood, each of the partitions is fully loaded in memory, which may be expensive.
# This ensure that each of the paritions has a small size.
train_df = train_df.repartition(100)
test_df = test_df.repartition(100)

开始训练模型

from pyspark.ml.classification import LogisticRegression
from pyspark.ml import Pipeline
from sparkdl import DeepImageFeaturizer 

featurizer = DeepImageFeaturizer(inputCol="image", outputCol="features", modelName="InceptionV3")
lr = LogisticRegression(maxIter=10, regParam=0.05, elasticNetParam=0.3, labelCol="label")
p = Pipeline(stages=[featurizer, lr])

p_model = p.fit(train_df)

接下来评估下模型性能

from pyspark.ml.evaluation import MulticlassClassificationEvaluator

tested_df = p_model.transform(test_df)
evaluator = MulticlassClassificationEvaluator(metricName="accuracy")
print("Test set accuracy = " + str(evaluator.evaluate(tested_df.select("prediction", "label"))))

在这里插入图片描述

大规模应用深度学习模型
Deep Learning Pipelines 支持使用 Spark 以分布式方式运行预训练模型,可用于批处理和流数据处理。
它包含一些最受欢迎的模型,使用户能够开始使用深度学习,而无需昂贵的模型训练步骤。 当然,模型的预测是与 Spark 带来的所有好处同时进行的。
除了使用内置模型外,用户还可以在 Spark 预测管道中插入 Keras 模型和 TensorFlow Graphs。 这将单节点工具上的任何单节点模型转换为可以以分布式方式应用于大量数据的模型。
以下代码使用 InceptionV3 创建 Spark 预测管道,InceptionV3 是用于图像分类的最先进的卷积神经网络 (CNN) 模型,并预测我们刚刚加载的图像中的对象。

from sparkdl import DeepImagePredictor
# Read images using Spark
image_df = ImageSchema.readImages("flower_photos/sample/")

predictor = DeepImagePredictor(inputCol="image", outputCol="predicted_labels", modelName="InceptionV3", decodePredictions=True, topK=10)
predictions_df = predictor.transform(image_df)
predictions_df.select("predicted_labels").show(truncate=False,n=3)

请注意,predicted_labels 列将“daisy”显示为使用此基本模型的所有样本花的高概率类别,由于某种原因,郁金香更接近栅栏而不是花朵(可能是因为照片的背景)。
然而,从概率值的差异可以看出,神经网络具有辨别两种花型的信息。 因此,我们上面的迁移学习示例能够从基本模型开始正确地学习雏菊和郁金香之间的差异。
让我们看看我们的模型如何识别花朵的类型:

df = p_model.transform(image_df)
def _p1(v):
    return float(v.array[1])
take_one = udf(_p1, DoubleType())
df.select("image.origin",(1-take_one(df.probability)).alias("p_daisy")).show(truncate=False)

在这里插入图片描述


总结

本文主要介绍深度学习在Spark上的应用,以花卉图片为例,使用 Deep Learning Pipelines,并讲解使用DL Pipelines的方式。 我们还通过Pipelines实现Transfer Learning,同时通过预训练模型实现来处理少量数据并实现预测。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/917.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python学习笔记(十三)——编译错误和异常处理

异常和异常类 Python常见错误 语法错误 源代码存在拼写语法错 误,这些错误导致Python 编译器无法把Python源代 码转换为字节码,故也称 之为编译错误。>>> print("我爱山大"} SyntaxError: invalid syntax 运行时错误 • 程序中没有…

Python常用库1:collections,容器数据类型

collections:数据容器 点这里跳到原文地址。预计阅读时长:10分钟未完待续,遇到相关力扣题目,会继续补充~ 文章目录前言一、Collections中的内置函数二、各个函数的使用1. deque1.1 deque的介绍1.2 deque支持的方法1.3 使用deque解…

js-键盘事件

onkeydown:按键被按下 onkeyup:按键被松开 事件绑定的对象:键盘事件一般绑定给可以获取焦点的对象或者document对象 焦点:光标在闪的:比如input标签 如果一直按按键不松手,按键会一直被触发 当:onkeydown连续触发时…

THREE.JS实现看房自由(VR看房)

VR看房一、前言二、基础知识三、场景3.1 网络模型3.2 光照3.2.1 环境光3.2.2 平行光3.2.3 点光源3.2.4 聚光灯3.2.5 半球光四、相机4.1 正交相机4.2 透视相机五、渲染器六、贴图纹理6.1 基础介绍6.2 环境贴图6.3 HDR处理七、拓展7.1 坐标系7.2 控制器7.3 自适应7.4 全屏响应7.5…

C#基础·补丁

文章目录一 命名空间二字符串2.1 System.String类2.2 StringBuilder类三 正则表达式3.1 什么是正则表达式?3.2 查找举例3.3 重复描述字符举例3.4 反义字符3.5 基本语法元字符3.6 定位元字符3.7 择一匹配3.8 分组一 命名空间 二字符串 字符串类 System.String(strin…

python数据分析之numpy

数据分析之Numpy 1、Numpy的数组对象及其索引 import numpy as npimport numpy as npanp.array([1,2,3,4]) print(a) bnp.array([2,3,4,5]) print(b)print(ab)产生数组 从列表产生数组: list_array[1,2,3,4] anp.array(list_array) print(a)从列表传入&#xff…

PCB设计很简单?生产问题才是考验工程师能力的标准!

BOM清单有误 SMT产线:物料封装怎么和PCB焊盘不一致呢?停线排查。 仓库:我是按照BOM清单发的物料。 硬件研发:哎,BOM整理时马虎了。 过孔焊盘问题 “ 连锡问题 产线维修:怎么这么多连锡导致不良的产品&…

【安信可NB-IoT模组EC系列应用笔记⑧】用NB-IoT模组EC系列了解LwM2M协议并接入云平台

文章目录前言一、测试准备1、硬件准备2、云平台准备二、云平台连接1.注册入网2.读取IMSI及IMEI3.利用IMSI及IMEI创建设备4.LwM2M连接云平台设备三、 数据互交1.ATMIPLNOTIFY 通知属性变化2.ATMIPLREADRSP 返回读取结果3.ATMIPLWRITERSP 发送写入结果4.ATMIPLEXECUTERSP 发送执行…

1.uniapp全局状态管理

概念:把多个组件之间共享数据抽离出来,通过一个“单例模式”进行管理 工具:具备全局状态管理的库 Vuex:全局状态管理中的库 步骤: 1.建立Store文件夹 2.建立index.js文件 3.在main.js中注册Vue插件 4.测试Vuex是否导入成功 …

面试面麻了,别再为难软件测试人员了···

前言 有不少技术友在测试群里讨论,近期的面试越来越难了,要背的八股文越来越多了,考察得越来越细,越来越底层,明摆着就是想让我们徒手造航母嘛!实在是太为难我们这些测试工程师了。 这不,为了帮大家节约时…

基于单片机的双足仿生运动机器人的设计

目录 1 概述 1 1.1 研究背景及意义 1 1.2 机器人的应用领域及发展现状 1 1.2.1 应用领域 1 1.2.2 发展现状 1 1.3 双足机器人设计要求 2 1.3.1 硬件部分 2 1.3.2 软件部分 2 2 系统方案设计 3 2.1 主控芯片选择 3 2.2 机器人自由度选择 3 2.3 驱动方案选择 3 2.4 双足机器人的步…

00后表示真干不过,部门新来的00后测试员已把我卷崩溃,想离职了...

在程序员职场上,什么样的人最让人反感呢? 是技术不好的人吗?并不是。技术不好的同事,我们可以帮他。 是技术太强的人吗?也不是。技术很强的同事,可遇不可求,向他学习还来不及呢。 真正让人反感的,是技术平平&#x…

web安全之信息收集

💪💪 web安全之信息收集1.网络入口/信息1.1网络拓扑信息1.2 IP信息1.3线下网络2.域名信息2.1Whios2.2搜索引擎搜索2.3. 第三方查询2.4. ASN信息关联2.5. 域名相关性2.6. 网站信息利用2.7. HTTPS证书2.8. CDN2.9. 子域爆破3.端口信息3.1常见端口3.2端口扫…

具有现代设计和最新Bootstrap版本的数字市场HTML模板

DegMark是具有现代设计和最新Bootstrap版本的数字市场HTML模板。凭借优秀的设计很容易创建虚拟商品交易网站,比如图片素材在线交易,视频文件交易,代码交易等虚拟商品交易。 主要特色 Bootstrapv5 移动响应 FontAwesome图标 jQuery增强 …

metaRTC Visual Studio编译指南

概述 metaRTC windows版本提供qt和vs2019两种编译支持,vs2019编译工程支持从metaRTC6.0版本开始,qt编译在B站有视频教程。 metaRTC5 windows版编译教程_哔哩哔哩_bilibilimetartc5编译教程,windows版本只支持msvc,下载所带第三方库为msvc20…

生物信息-快速序列比对-edlib包安装与使用方法-python和dll

安装 下载:https://github.com/Martinsos/edlib cd build && cmake -D CMAKE_BUILD_TYPERelease .. && make升级cmake https://cmake.org/download/ 下载tar.gz包,我这里下载的是: 拷贝到 /home/xxx/app 下解压&#xff…

初识C#事件

文章目录一 事件1 抛砖引玉案例1.1工具人下楼案例1.1.1 ToolMan.cs1.1.2 LazyMan.cs1.1.3 Program.cs1.1.4 测试结果1.1.5 升级到事件二 委托和事件的区别和联系一 事件 1 抛砖引玉案例 订阅和发布机制 比如说,我要下楼去吃饭,正常情况下我会问一下室友…

设计模式之适配器模式

设计模式之适配器模式 文章目录设计模式之适配器模式1. 定义2. 类型3. 场景4. 优点5. 缺点6. 适配器扩展6. 相关适配器模式7. coding7.1 被 适配者方法7.2 接口7.3 接口的实现7.4 适配者适配被适配者达到Target 目标7.5 类适配器的实现方式,其他的都不变8. 源码解析…

【Django】REST_Framework框架——序列化器serializers源码解析

一、序列化器类——Serializer 1、序列化器的作用 序列化器的使用分两个阶段: 1、在客户端请求时,使用序列化器可以完成对数据的反序列化(将字典格式的数据转化为模型对象)。 2、在服务器响应时,使用序列化器可以完…

网络原理——No.4 传输层_TCP协议中的延迟应答, 捎带应答, 面向字节流与TCP的异常处理

JavaEE传送门JavaEE 网络原理——No.2 传输层_TCP的连接管理 网络原理——No.3 传输层_TCP的滑动窗口, 流量控制与拥塞控制 目录延迟应答捎带应答面向字节流粘包问题TCP 中的异常处理(连接异常)TCP 和 UDP 的应用场景延迟应答 一种提高传输效率的机制, 又是基于流量控制, 来引…