变分自动编码器【03/3】:使用 Docker 和 Bash 脚本进行超参数调整

一、说明

        在深入研究第 1 部分中的介绍和实现,并在第 2 部分中探索训练过程之后,我们现在将重点转向在第 3 部分中通过超参数调整来优化模型的性能。要访问本系列的完整代码,请访问我们的 GitHub 存储库在GitHub - asokraju/ImageAutoEncoder: A repository to learn features from Off Road Navigation Vehicles

        在任何机器学习模型中,超参数都是我们调整以获得最佳模型性能的旋钮和杠杆。然而,找到正确的设置有点像大海捞针——非常耗时,有时甚至令人困惑!但不用担心,我们将以简单直接的方式引导您完成整个过程。

        在本部分中,我们将利用 Docker 和 Bash 脚本对变分自动编码器执行超参数调整。Docker 是一个用于部署应用程序的流行平台,它将帮助我们为实验创建一个隔离的环境,确保我们的结果是可重现的。同时,Bash 脚本将自动执行使用不同超参数运行模型的繁琐任务,从而使该过程更加高效。

        那么,您准备好调整您对变分自动编码器的理解并释放模型的全部潜力了吗?让我们一起深入研究“变分自动编码器:使用 Docker 和 Bash 脚本进行超参数调整”!

        如果您需要复习或想要重温任何概念,请不要忘记重温第 1 部分和第 2 部分。快乐学习!

二、超参数实验

        任何机器学习模型的开发通常都涉及微调一系列超参数。然而,手动测试每种可能的组合将是一项艰巨的任务。这就是master.sh派上worker.sh用场的地方。这两个 bash 脚本自动化了尝试不同超参数并记录结果的过程,为我们节省了大量的时间和精力。

  master.sh是我们的控制室,编排我们希望测试的各种超参数组合。它系统地循环遍历我们预定义的一组超参数(在本例中为学习率、潜在维度和批量大小),并且对于每个独特的组合,它调用脚本worker.sh

        剧本worker.sh就是地面上的工人。每次调用它时,它都会从 接收超参数的独特组合master.sh,为该实验设置专用日志目录,然后train.py使用这些特定的超参数运行我们的模型(在本例中)。日志目录根据使用的超参数进行唯一命名,以便我们以后可以轻松识别每个实验的结果。

        有了这两个脚本,我们就可以放松下来,让我们的机器完成繁重的工作,使用不同的超参数运行实验并记录结果,以便我们在闲暇时进行分析。

# Contents of master.sh #!/bin/bash -l
for learning_rates in 0.001
dofor latent_dims in 6 8dofor batch_sizes in 128do./scripts/call_experiments.sh $learning_rates $latent_dims $batch_sizesdonedone
done

        现在让我们仔细看看这些脚本的详细信息。

        主脚本:

        该master.sh脚本的主要功能是循环遍历我们想要测试模型训练的不同超参数,然后调用脚本worker.sh使用提供的超参数执行每个实验。

        我们来分解一下步骤:

  1. #!/bin/bash -l:这一行通常称为 shebang,告诉系统该文件是一个 bash 脚本,应该这样执行。
  2. for learning_rates in 0.001:这将开始一个循环,迭代不同的学习率。在本例中,它仅包含一个值 0.001。您可以添加更多由空格分隔的值,例如for learning_rates in 0.001 0.01 0.1
  3. for latent_dims in 6 8for batch_sizes in 128:这些是其他超参数的附加循环 - 潜在维度和批量大小。
  4. ./scripts/call_experiments.sh $learning_rates $latent_dims $batch_sizescall_experiments.sh:这是使用当前选择的超参数调用脚本的关键步骤。这些值作为参数传递给worker.sh脚本。
  5. done:其中每一个都关闭一个 for 循环。由于存在三个for循环,因此必须有三个done命令。

本质上,该脚本将对指定学习率、潜在维度和批量大小的笛卡尔积执行超参数搜索,并worker.sh为每个组合运行脚本。

        工人脚本

        该worker.sh脚本旨在接受一组超参数作为输入,为实验设置唯一的日志目录,然后使用这些超参数运行 Python 训练脚本。

# contents of worker.sh#!/bin/bashlearning_rate=$1
latent_dim=$2
batch_size=$3PARENT_DIR="$(dirname $PWD)"
EXEC_DIR=$PWD
log_dir="logs/lr=${learning_rate}_latentdim=${latent_dim}_batchsize=${batch_size}"
mkdir -p $log_dir
echo "Current working directory is: $(pwd)"
python train.py --image-dir='../train_data' --learning-rate=${learning_rate} --latent-dim=${latent_dim} --batch-size=${batch_size} --logs-dir=${log_dir}

        下面对其步骤进行详细说明:

  1. #!/bin/bash:就像在master.sh脚本中一样,这个 shebang 将文件声明为 bash 脚本。
  2. learning_rate=$1latent_dim=$2batch_size=$3:这些行捕获 提供的输入参数master.sh并将它们分配给相应的变量。
  3. PARENT_DIR="$(dirname $PWD)"EXEC_DIR=$PWD: 在这里,我们将父目录路径和当前目录路径保存到变量中以供将来使用。
  4. log_dir="logs/lr=${learning_rate}_latentdim=${latent_dim}_batchsize=${batch_size}"mkdir -p $log_dir:这一对行创建一个唯一的目录来存储当前超参数集的日志。-p命令中的标志确保mkdir它创建整个目录路径(如果不存在)。
  5. echo "Current working directory is: $(pwd)":此行只是将当前工作目录打印到终端以进行调试。
  6. 最后一行使用所选的超参数运行 Python 训练脚本,并指定本次运行的日志目录:python train.py --image-dir='../train_data' --learning-rate=${learning_rate} --latent-dim=${latent_dim} --batch-size=${batch_size} --logs-dir=${log_dir}

        总之,该worker.sh脚本使用一组给定的超参数执行单个实验,将实验的输出记录在专用目录中,然后终止。

三、Docker 设置

        Dockerfile 和 docker-compose 文件在 Docker 上下文中使用,Docker 是一个允许您将应用程序及其依赖项打包到隔离容器中的平台。

        Dockerfile 是一个文本文件,其中包含一组用于构建 Docker 映像的指令。它定义基础映像,设置工作目录,将文件复制到映像中,安装依赖项,并指定启动容器时要运行的命令。

        另一方面,docker-compose 文件用于定义和管理多个容器作为单个应用程序的一部分。它允许您定义服务、它们的配置以及它们如何相互交互。

# Contents of Dockerfile
# Use an official Tensorflow runtime as a parent image
FROM tensorflow/tensorflow:latest# Set the working directory to /app
WORKDIR /autoencodersCOPY . .# Install any needed packages specified in requirements.txt
RUN pip install --no-cache-dir -r requirements.txt
RUN pip install pyyamlRUN chmod +x scripts/master.sh
RUN chmod +x scripts/worker.sh# Run app.py when the container launches
CMD ["python", "train.py"]

        现在,让我们详细了解 Dockerfile 中的每个步骤:

  1. FROM tensorflow/tensorflow:latest:此行指定要使用的基础映像,这是官方 TensorFlow 运行时映像的最新版本。
  2. WORKDIR /autoencoders:将容器内的工作目录设置为/autoencoders. 这是后续命令将被执行的地方。
  3. COPY . .:将当前目录(Dockerfile所在目录)中的所有文件复制到/autoencoders容器内的目录中。
  4. RUN pip install --no-cache-dir -r requirements.txt:安装文件中指定的Python包requirements.txt。该--no-cache-dir标志用于避免在容器上缓存包索引。
  5. RUN pip install pyyamlpyyaml使用 pip 安装软件包。某些 YAML 相关功能可能需要此包。
  6. RUN chmod +x scripts/master.shRUN chmod +x scripts/worker.sh:更改 shell 脚本的权限master.sh并使worker.sh它们可执行。
  7. CMD ["python", "train.py"]:指定容器启动时运行的默认命令。train.py在本例中,它使用 Python 解释器运行Python 脚本。
# contents of requirements.txt
pandas==1.3.3
numpy==1.21.2
matplotlib==3.4.3
argparse==1.4.0
protobuf==3.20.*
tensorflow==2.7.0
pyyaml

现在,让我们继续讨论 docker-compose 文件:

  1. version: '3':指定正在使用的 docker-compose 文件格式的版本。
  2. services:定义组成应用程序的服务(容器)。
  3. autoencoders:服务的名称。
  4. build:指定如何构建该服务的镜像。
  5. context: .:将构建上下文设置为当前目录(docker-compose 文件所在的位置)。
  6. dockerfile: Dockerfile:指定用于构建映像的 Dockerfile。
  7. ports: - "8080:80":将主机上的8080端口映射到容器上的80端口。这允许通过访问容器内运行的服务localhost:8080
  8. volumes: - ./:/autoencoders:将主机上的当前目录挂载到/autoencoders容器内的目录,确保主机上文件的更改反映在容器内。
  9. - type: bind source: F:/train_data target: /train_data:将F:/train_data主机上的目录与/train_data容器内的目录绑定,允许从容器内访问训练数据。
  10. command: ./scripts/master.sh:指定启动容器时运行的命令。在这种情况下,它运行master.sh位于scripts目录中的脚本。
# Contents of docker-compose.yml
version: '3'
services:autoencoders:build:context: .dockerfile: Dockerfileports:- "8080:80"volumes:- ./:/autoencoders- type: bindsource: F:/train_datatarget: /train_datacommand: ./scripts/master.sh

        在您的docker-compose.yml文件中,您指定了两个卷。第一个卷将docker-compose.yml主机上的当前目录(文件所在的位置)映射到/autoencodersDocker 容器中的目录。

        第二个卷是绑定挂载,它将主机中的目录或文件绑定到 Docker 容器中的目录或文件。在本例中,您将F:/train_data主机上的目录绑定到/train_dataDocker 容器中的目录。

        此行很重要,因为您的训练脚本(在 Docker 容器内运行)期望在 处找到您的训练数据/train_data。但由于 Docker 容器与主机隔离,因此您需要一种方法来向脚本提供训练数据。绑定挂载通过使F:/train_data主机上的目录/train_data在 Docker 容器中可用来实现这一点。

        但是,并非每个使用您的脚本的人都会在 处获得训练数据F:/train_data。这就是为什么您需要指示他们根据训练数据所在的位置更改此行。他们可以替换F:/train_data为训练数据的路径。例如,如果他们的训练数据位于C:/Users/user123/data,他们需要将此行更改为:

# Contents of docker-compose.yml
version: '3'
services:autoencoders:build:context: .dockerfile: Dockerfileports:- "8080:80"volumes:- ./:/autoencoders- type: bindsource: C:/Users/user123/datatarget: /train_datacommand: ./scripts/master.sh

        这些步骤共同定义了用于构建映像并运行关联容器的 Dockerfile 和 docker-compose 文件,从而能够在容器化环境中训练自动编码器。

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

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

相关文章

Linux(二)常用命令

文章目录 一、文件管理命令1.1 chmod1.2 chown1.3 cat1.4 cp1.5 find1.6 head1.7 tail1.8 less1.9 more1.10 mv1.11 rm1.12 touch1.13 vim1.14 >和>>1.15 scp1.16 ln1.17 怎么用命令查看日志 二、文档管理命令2.1 grep2.2 wc2.3 echo 三、磁盘管理命令3.1 cd3.2 df3.3…

短视频账号矩阵系统3年独立开发正规接口源码搭建部署开发

一、矩阵系统源码主要有三种框架: 短视频账号矩阵源码的框架有很多种,以下列举其中几种: 1. **星图矩阵**:星图矩阵是抖音官方向商家提供的短视频广告推广平台,是抖音官方的赚钱工具。商家可利用星图矩阵进行广告推广…

适用于车载电动升窗器的解决方案

升窗器是指避免车主忘记关窗的自动关窗装置,主要通过电子模块加认组合,利用主机上的芯片里面设定的程序完成检测功能,使自动升窗步骤顺利完成。 ■ 基于ACM32F403系列MCU ■ 高性价比软件控制方案,高算力 ■ MCU内置2路CAN总线&a…

为什么项目管理工具需要项目财务信息?

在讨论项目时,钱是绕不开的话题。 资金是项目管理中最重要的因素之一,与范围和时间并列,三者共同构成了 “三重约束”。例如,如果缩短项目时间,就必须增加成本。 如果无法清楚了解开支及其对项目的影响(反…

Python接口自动化测试:断言封装详解

前言 在进行API接口测试时,断言起着至关重要的作用。断言是用于验证预期结果与实际结果是否一致的过程。在Python中,我们可以利用一些库来实现断言功能。 1. 安装必要的库 在Python中,我们主要会使用两个库:requests和jsonpath…

基于 SOAP 的 Web 服务 是什么服务

基于 SOAP 的 Web 服务是一种网络服务,它使用简单对象访问协议(SOAP)作为通信协议。SOAP 是一种基于 XML 的协议,用于在网络上交换结构化信息。基于 SOAP 的 Web 服务通常用于实现跨网络的远程过程调用(RPC&#xff09…

红队打靶练习:WINTERMUTE: 1

前言 网络扫描(Nmap、netdiscover) HTTP 服务枚举 使用电子邮件日志文件在浏览器中进行目录遍历 利用 SMTP RCPT 选项中的操作系统命令注入 生成 PHP 后门 (Msfvenom) 执行RCPT选项中嵌入的后门 反向连接(Metasploit) 导入 pytho…

Poi实现复杂Excel导出,理解POI操作Excel思路!!!

前言 对于简单excel报表导出,有很多简单的工具如easypoi,而且现在网上已经有很多工具类整合easypoi使用起来非常方便。但是简单的弊端往往无法适配一些负责场景,而我们实际生产中面临的都是客户自定以的一个负责报表导出,这是利用…

嵌入式开发是否会重复Java的结果?

今日话题,嵌入式开发是否会重复Java的结果?嵌入式开发与Java开发在性质和稳定性上有一些不同,因此不太容易出现与Java相似的结果。嵌入式开发通常属于第二产业,主要涉及制造业领域,如电子、机械(汽车&#…

Android-----res资源文件夹

1 res资源文件夹 res目录 assets目录 两者的区别在于: res目录下所有的资源文件都会在R.java文件下生成对应的资源id,而assets目录并不会;res目录我们可以直接通过资源id访问到对应的资源;而assets目录则需要我们通过AssetManag…

RTDETR论文快速理解和代码快速实现(训练与预测)

文章目录 前言一、摘要二、论文目的三、论文贡献四、模型结构1、模型整体结构2、backbone结构3、neck结构4、混合编码器(neck) 五、RTDERT模型训练(data-->train)1、环境安装2、训练1、数据准备2、数据yaml文件3、训练代码4、训练运行结果 3、推理1、推理代码2、推理运行结果…

基于web的楼房销售系统论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本楼房销售系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息&am…

嵌入式MCU和SOC之间的区别是什么?

今日话题,嵌入式MCU和SOC之间的区别是什么?表面上看,MCU代表嵌入式微控制器,而SOC代表片上系统,似乎只是嵌入式系统的不同称谓。然而,在实际的研发和产品设计中,你会发现它们在软硬件层面存在显…

MySQL数据库 约束

目录 约束概述 外键约束 添加外键 删除外键 删除/更新行为 约束概述 概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据。 目的:保证数据库中数据的正确、有效性和完整性。 分类: 注意:约束是作用于表中字段上…

【实战】如何在Docker Image中轻松运行MySQL

定义 使用Docker运行MySQL有许多优势。它允许数据库程序和数据分离,增强了数据的安全性和可靠性。Docker Image的轻便性简化了MySQL的部署和迁移,而Docker的资源隔离功能确保了应用程序之间无冲突。结合中间件和容器化系统,Docker为MySQL提供…

Map集合体系

Map集合的概述 Map集合是一种双列集合,每个元素包含两个数据。 Map集合的每个元素的格式:keyvalue(键值对元素)。 Map集合也被称为“键值对集合”。 Map集合的完整格式:{key1value1 , key2value2 , key3value3 , ...} Map集合的使用场景…

配置自定义RedisTemplate 解决redis序列化java8 LocalDateTime

目录 配置自定义RedisTemplate 引入依赖 配置连接redis 编写测试类 出现问题 配置序列化 解决redis序列化java8 LocalDateTime 问题背景 问题描述 问题分析 解决方案一(全局) 解决方案二(单个字段) 配置自定义RedisTe…

数据可视化分析大屏,大数据统计UI页面源文件(信息分析平台免费PS资料)

数据可视化可以帮助数据分析者更好地理解数据,发现数据中的规律和趋势。通过图表和图形等可视化工具,数据分析者可以更快速地发现数据中的关系,比如相关性、趋势、异常值等。对于普通用户来说,理解复杂的数据可能会很困难。通过数…

页面菜单,通过get请求一个url后,跳转另外一个页面,+丢失问题

业务场景描述: 在A系统,菜单点击跳B系统这个操作。 A系统菜单是get请求到B系统的一个缓冲页面,然后这个缓冲页面获取到url中的accessToken后,在这个页面中通过post请求后端接口。 问题描述: 当accessToken中包含了…

Selenium4+Python3 - Iframe、Select控件、交互式弹出框、执行JS、Cookie操作

一、iframe操作 iframe识别: 语法: driver.switch_to.frame(‘方式’) 1、常见处理方法三种 index:下标name:id或name属性的值webelement:元素 2、通过下标进入 进入第一个iframe: driver.switch_to.…