原文来自特拉字节:https://telabytes.com/article/preview?id=119
这是练习深度学习的好时机。现有的主要深度学习框架如TensorFlow、Keras和PyTorch正在逐渐成熟,并提供了许多功能来简化深度学习过程。深度学习从业者还有其他出色的工具集。其中之一是Google Colaboratory环境。该环境基于Python Jupyter笔记本,使用户可以免费访问Tesla K80 GPU。如果您的本地计算机缺少GPU,则现在无需在Amazon AWS上租用GPU时间,至少是为了进行较小的学习任务的原型设计。这开启了任何人在MNIST等简单数据集之外进行深度学习的能力。谷歌最近也开放了在环境中免费使用TPU(Tensor Processing Units)。
免费访问GPU和TPU只是Google Colaboratory的一个好处。本文将探讨环境的功能,并向您展示如何有效地将其用作深度学习的“家庭基础”。我还将运行一个在TensorFlow中构建的示例CIFAR10分类器来演示它的用法。可以在此处找到本教程的Google Colaboratory笔记本。
Google Colaboratory基础知识
Google Colaboratory基于Jupyter笔记本电脑的设计和操作范例。我不会回顾Jupyter是如何工作的,因为我想大多数Python和TensorFlow用户已经知道这个包。要访问该环境,您必须拥有Google云端硬盘帐户并登录。您创建的.ipynb文件将保存在您的Google云端硬盘帐户中。
打开新文件后,首先要做的是重命名文件(文件 - >重命名)并设置运行环境(即是否使用标准CPU、GPU或TPU)。每当您更改运行环境时,当前笔记本会话将重新启动 - 因此最好先执行此操作。为此,请转到运行时 - >更改运行时类型。
Google Colaboratory最重要和最有用的组件之一是能够与他人共享您的笔记本,并允许其他人对您的工作发表评论。可以在屏幕右上角的“共享和注释”按钮中查看执行此操作的功能,如下所示:
注释功能允许用户对笔记本中的各个单元格进行注释,这对远程协作非常有用。
可以将每个单元选择为“代码”单元或“文本”单元。 文本单元允许开发人员创建围绕代码的注释,这有助于解释正在发生的事情或创建各种算法的文档类实现。 这与标准的Jupyter笔记本电脑类似。
本地bash命令也可以从单元格运行,它们与作为会话一部分创建的虚拟机(VM)进行交互。 例如,要安装将在本简介后面使用的PyDrive软件包,请直接执行以下操作之一:
!pip install -U -q PyDrive
这将在VM上运行普通的pip安装命令并安装PyDrive软件包。需要注意的一件重要事情是,Google Colaboratory将在一段时间不活动后超时并清除您的会话环境。这是为其他用户释放VM空间。因此,在某些情况下,可能需要在每次笔记本开头运行一系列pip安装命令,以便为您的特定用途准备好本地环境。但是,深度学习检查点,数据和结果摘要可以导出到具有永久存储的各种其他位置,例如Google Drive,本地硬盘驱动器等。
您还可以运行其他常见的LINUX命令,例如ls,mkdir,rmdir和curl。通过运行!ls \ bin可以找到Google Colaboratory上可用的更全面的bash命令和功能列表。
现在已经涵盖了这些基础知识,现在是时候研究如何在Google Collaboratory中访问TensorBoard。
访问TensorBoard
TensorBoard是TensorFlow的一个有用的可视化工具,有关如何使用它的更多详细信息,请参阅我之前的帖子。可以通过调用在训练过程中或之后编写的日志文件来访问它。在我看来,在训练期间访问这些文件是最有用的,这样可以观察您当前的方法是否产生结果。在PC上很容易调用TensorBoard服务器并通过网络浏览器访问,但这不能在Google Colaboratory中直接进行。
然而,有一个简单的解决方案 - ngrok。此程序包通过防火墙和其他网络阻止限制创建安全隧道,并允许访问公共Internet。要下载并安装ngrok到Google Colaboratory,请运行以下命令:
!wget https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-amd64.zip
!unzip ngrok-stable-linux-amd64.zip
下一步是以通常的方式创建TensorBoard会话。 要在Google Colaboratory中执行此操作,可以运行以下命令:
LOG_DIR = './log'
get_ipython().system_raw(
'tensorboard --logdir {} --host 0.0.0.0 --port 6006 &'
.format(LOG_DIR)
)
get_ipython()命令允许用户访问IPython命令,system_raw()在本机命令提示符/终端中执行命令。 传递给system_raw()的字符串参数启动TensorBoard会话,该会话在LOG_DIR中搜索日志文件,并在端口6006上运行。
下一步是执行ngrok并打印出将用户带到TensorBoard门户的链接:
get_ipython().system_raw('./ngrok http 6006 &')
! curl -s http://localhost:4040/api/tunnels | python3 -c \
"import sys, json; print(json.load(sys.stdin)['tunnels'][0]['public_url'])"
上面的第一行通过http协议启动ngrok隧道到端口6006 - 可以访问TensorBoard的相同端口。 第二行是复杂的卷曲命令。 Linux中的curl命令用于运行http请求。 在这种情况下,正在请求“http:// localhost:4040 / api / tunnels”。 这是一个本地运行的ngrok API,其中包含有关正在运行的隧道的信息。
然后,从该curl http请求接收的信息将通过Linux管道“|”运算符发送到本地Python 3应用程序。 结果通过sys.stdin以json格式进入Python - 并且已创建的隧道的公共URL将打印到屏幕。 运行此命令将在Google Colaboratory中返回一个类似于以下内容的URL:
https://712a59dd.ngrok.io
点击Google Colaboratory中的链接会将您的浏览器发送到TensorBoard门户网站。所以现在你可以在Google Colaboratory中使用TensorBoard - 这非常方便。
接下来我们将关注保存模型并从Google云端硬盘加载文件 - 这是使用Google Colaboratory时检查点和恢复模型的最简单方法。
在Google Colaboratory中保存和恢复文件查看特拉字节原文:https://telabytes.com/article/preview?id=119
在这篇文章中,我将介绍在Google Colaboratory中处理文件的两种方法,我认为这些方法最常用。要处理的文件通常包括训练或测试数据,以及保存的模型数据(即检查点或完全训练的模型数据)。
在Google Colaboratory中加载和下载文件的最简单方法是使用内置的文件夹结构浏览器。单击菜单中的视图 - >目录将启动左侧窗格/菜单。在此窗格的顶部,将出现一个名为“文件”的选项卡 - 选择此选项将显示当前运行时会话的文件结构,您可以从本地PC上载和下载该文件结构。
或者,可以通过运行以下命令以编程方式执行此操作:
from google.colab import files
uploaded = files.upload()
上面的代码将启动一个对话框,允许您导航到本地文件以上传到您的会话。 以下代码将指定的文件下载到PC上的下载区域(如果您使用的是Windows):
files.download("downloaded_weights.12-1.05.hdf5")
到现在为止还挺好。但是,这是一种非常手动的文件播放方式。这在训练期间是不可能的,因此使用此方法将检查点存储在Google Colaboratory的本地驱动器中是不可行的。另一个问题是当您在Google Colaboratory上运行长期训练课程时。如果您的训练结束并且您暂时不与控制台交互(即,您在训练结束时进行了一夜训练并且您已经睡着了),您的运行时将自动结束并释放以释放资源。
不幸的是,这意味着您还将失去所有培训进度和模型数据。换句话说,能够在训练时以编程方式存储文件/检查点非常重要。在下面的示例中,我将向您展示如何设置一个自动将检查点存储到您的Google云端硬盘帐户的培训回调,然后可以将其下载并稍后再次使用。我将在训练TensorFlow / Keras模型来分类CIFAR-10图像的背景下进行演示。有关详细信息,请参阅我的教程或我的书。
首先,我将向您展示所需的导入,使用Dataset API进行数据准备,然后是Keras模型开发。我不会解释这些,因为前面提到的教程中概述了详细信息,因此如果您想更好地理解模型,请检查一下。我们将使用PyDrive软件包与Google云端硬盘进行所有通话,因此首先您必须在会话中安装它:
!pip install -U -q PyDrive
接下来是所有的进口,数据和Keras模型开发:
import tensorflow as tf
from tensorflow import keras
import datetime as dt
import os
import numpy as np
from google.colab import files
from google.colab import drive
# these are all the Google Drive and authentication libraries required
from pydrive.auth import GoogleAuth
from pydrive.drive import GoogleDrive
from google.colab import auth
from oauth2client.client import GoogleCredentials
# import the CIFAR-10 data then load into TensorFlow datasets
(x_train, y_train), (x_test, y_test) = keras.datasets.cifar10.load_data()
# the training set with data augmentation
train_dataset = tf.data.Dataset.from_tensor_slices((x_train, y_train)).batch(256).shuffle(10000)
train_dataset = train_dataset.map(lambda x, y: (tf.div(tf.cast(x, tf.float32), 255.0), tf.reshape(tf.one_hot(y, 10), (-1, 10))))
train_dataset = train_dataset.map(lambda x, y: (tf.image.central_crop(x, 0.75), y))
train_dataset = train_dataset.map(lambda x, y: (tf.image.random_flip_left_right(x), y))
train_dataset = train_dataset.repeat()
# the validation set
valid_dataset = tf.data.Dataset.from_tensor_slices((x_test, y_test)).batch(5000).shuffle(10000)
valid_dataset = valid_dataset.map(lambda x, y: (tf.div(tf.cast(x, tf.float32),255.0), tf.reshape(tf.one_hot(y, 10), (-1, 10))))
valid_dataset = valid_dataset.map(lambda x, y: (tf.image.central_crop(x, 0.75), y))
valid_dataset = valid_dataset.repeat()
# now the model creation function
def create_model():
model = keras.models.Sequential([
keras.layers.Conv2D(96, 3, padding='same', activation=tf.nn.relu,
kernel_initializer=keras.initializers.VarianceScaling(distribution='truncated_normal'),
kernel_regularizer=keras.regularizers.l2(l=0.001),
input_shape=(24, 24, 3)),
keras.layers.Conv2D(96, 3, 2, padding='same', activation=tf.nn.relu,
kernel_initializer=keras.initializers.VarianceScaling(distribution='truncated_normal'),
kernel_regularizer=keras.regularizers.l2(l=0.001)),
keras.layers.Dropout(0.2),
keras.layers.Conv2D(192, 3, padding='same', activation=tf.nn.relu,
kernel_initializer=keras.initializers.VarianceScaling(distribution='truncated_normal'),
kernel_regularizer=keras.regularizers.l2(l=0.001)),
keras.layers.Conv2D(192, 3, 2, padding='same', activation=tf.nn.relu,
kernel_regularizer=keras.regularizers.l2(l=0.001)),
keras.layers.BatchNormalization(),
keras.layers.Dropout(0.5),
keras.layers.Flatten(),
keras.layers.Dense(256, activation=tf.nn.relu,
kernel_initializer=keras.initializers.VarianceScaling(),
kernel_regularizer=keras.regularizers.l2(l=0.001)),
keras.layers.Dense(10),
keras.layers.Softmax()
])
model.compile(optimizer=tf.train.AdamOptimizer(),
loss='categorical_crossentropy',
metrics=['accuracy'])
return model
# finally create the model
model = create_model()
代码的下一步是创建“GoogleDriveStore”回调。 这个回调继承自一般的keras.callbacks.Callback超类,这允许下面的类定义创建在训练开始时,每个纪元后等运行的函数。下面的代码是回调的初始化步骤, 训练开始时开火:
class GoogleDriveStore(keras.callbacks.Callback):
def on_train_begin(self, logs={}, model_folder="."):
self.first = True
self.init_date = dt.datetime.now()
self.model_folder = model_folder
# Authenticate and create the PyDrive client.
auth.authenticate_user()
gauth = GoogleAuth()
gauth.credentials = GoogleCredentials.get_application_default()
self.drive = GoogleDrive(gauth)
您可以观察到,首先设置了一些初始化变量,其目的很快就会明确。之后,有4行与设置Google云端硬盘连接相关。我承认我不是100%确定这些认证功能如何详细工作,但我会解释一下。
首先,运行auth.authenticate_user()函数 - 这是一个本机Google Colaborotory函数,它将提供一个供用户点击的链接。这将引导用户登录Google帐户,并提供需要输入Colaboratory笔记本的令牌以完成身份验证。
接下来,需要将此身份验证加载到PyDrive Google Drive连接中。首先创建一个OAuth认证对象(gauth)。然后,通过GoogleCredentials的get_application_default()方法提供此连接的凭据。我不确定这种方法是如何工作的,但似乎通过运行auth.authenticate_user()来获取在第一步中执行的身份验证。最后,创建一个GoogleDrive对象,并将身份验证凭据传递给此对象创建。
现在,回调具有经过身份验证的Google云端硬盘连接。下一步是在每个纪元结束后为Google云端硬盘创建检查点存储:
def on_epoch_begin(self, batch, logs={}):
if not self.first:
# get the latest
model_files = os.listdir(self.model_folder)
max_date = self.init_date
for f in model_files:
if os.path.isfile(self.model_folder + "/" + f):
if f.split(".")[-1] == 'hdf5':
creation_date = dt.datetime.fromtimestamp(
os.path.getmtime((self.model_folder + "/" + f)))
if creation_date > max_date:
file_name = f
latest_file_path = self.model_folder + "/" + f
max_date = creation_date
uploaded = self.drive.CreateFile({'title': file_name})
uploaded.SetContentFile(latest_file_path)
uploaded.Upload()
else:
self.first = False
上面的函数只是循环遍历self.model_folder目录中的所有文件。 它搜索具有hdf5扩展名的文件,这是Keras模型保存格式。 然后它找到具有最新创建日期(latest_file_path)的hdf5文件。 找到此文件后,将使用PyDrive中的GoogleDrive对象的CreateFile方法创建文件,并为该文件指定名称。 在下一行,此文件的内容设置为等于本地存储的最新hdf5文件。 最后,使用upload()方法,该文件将保存到Google云端硬盘。
其余的训练代码如下所示:
g_drive_callback = GoogleDriveStore()
callbacks = [
# Write TensorBoard logs to ./logs directory
keras.callbacks.TensorBoard(log_dir='./log/{}'.format(dt.datetime.now().strftime("%Y-%m-%d-%H-%M-%S")), write_images=True),
keras.callbacks.ModelCheckpoint("./weights.{epoch:02d}-{val_loss:.2f}.hdf5", monitor='val_loss', verbose=0, save_best_only=True),
g_drive_callback
]
model.fit(train_dataset, epochs=50, steps_per_epoch=len(x_train)//256,
validation_data=valid_dataset,
validation_steps=3, callbacks=callbacks)
从上面的代码中可以看出,训练中总共包含三个回调–TensorBoard回调(更新TensorBoard结果文件),模型检查点回调(创建hdf5模型检查点)以及最终Google Drive回调 我创造了。
接下来要介绍的是如何将经过训练的模型从Google云端硬盘加载到您的Google Colaboratory会话中。
从Google云端硬盘访问文件并将其提供给您的Google Colaboratory会话的最简单方法是将Google云端硬盘安装到会话中。 这可以很容易地执行(但是,如果您还没有使用前面解释的令牌代码,则必须通过调用drive.mount()方法进行身份验证)。 下面的代码显示了如何使用此方法将数据重新加载到模型中并运行一些预测:
drive.mount('/content/gdrive')
model = create_model()
model.load_weights("./gdrive/My Drive/weights.12-1.05.hdf5")
model.predict(valid_dataset, steps=1)
最后一行将从新加载的Keras模型中打印出一系列预测。 请注意,提供给drive.mount()的参数是会话文件结构中应安装驱动器内容的位置。 然后访问此位置以在上面的代码中加载权重。
这将为您提供Google Colaboratory的快速概览,以及一些方便的代码片段,这些代码片段允许您通常从Colaboratory运行TensorBoard,以及如何从Google云端硬盘保存和加载文件 - 这是长时间培训课程的必备条件。 我希望这可以让您充分利用这种优秀的方式来测试和构建深度学习模型,并获得免费的GPU时间!
原文来自特拉字节:https://telabytes.com/article/preview?id=119