Kaggle新福利:如何用Kaggle Kernels免费使用GPU

17,689 阅读4分钟

前段时间我们分享了怎么免费用谷歌的 GPU 训练机器学习模型,详情戳这里

这次我们又有了新的薅羊毛机会:通过 Kaggle Kernels 免费使用英伟达 GPU!

什么是 Kaggle Kernels?

可能有些朋友不是很熟悉 Kaggle Kernels,但 Kaggle 应该知道,至少搞数据科学和机器学习的会听说过 Kaggle 挑战赛。Kaggle 是一个用来从事数据科学研究或分享数据科学知识的平台从 Kaggle 上我们不仅能练习数据科学,还能从 Kaggle 社区中学到很多知识。

而 Kaggle 的产品 Kaggle Kernels 相当于一个内置于浏览器的 Jupyter Notebooks,一切运行都在你眼前呈现,由你自由支配。一句话:Kaggle Kernels 就是一个能在浏览器中运行 Jupyter Notebooks 的免费平台

也就是说,只要有网络有浏览器,你随时随地都能在你的浏览器上拥有 Jupyter Notebook 环境,不用再自己设置本地环境。

由于 Kaggle Kernels 的处理能力来自云端服务器,而不是本地机器,所以我们能在不怎么消耗笔记本电量的情况下,在上面完成很多数据科学和机器学习工作。

在 Kaggle 上注册一个账户后,就可以选择一个自己想要使用的数据集,点击几下就能启动一个新的 Kernel,也就是 Notebook。

我们用的数据集都预先加载到了该 Kernel 上,所以把数据集导入机器、再等待数据集输入模型中这样一套耗时的流程,我们就不用再做了。

具体如何使用 Kaggle Kernels,可以参考这篇教程

最近 Kaggle 又推出了一个大福利:用户通过 Kaggle Kernels 可以免费使用 NVidia K80 GPU

经过 Kaggle 测试后显示,使用 GPU 后能让你训练深度学习模型的速度提高 12.5 倍。

以使用 ASL Alphabet 数据集训练模型为例,在 Kaggle Kernels 上用 GPU 的总训练时间为 994 秒,而此前用 CPU 的总训练时间达 13,419 秒。直接让你训练模型的时间缩短为原来的 12 分之一。 当然在自己实际使用中,模型训练时间缩短多长会涉及多个因素,比如模型架构、批次大小、输入流水线的复杂程度等等。不管怎么说,我们现在可以通过 Kaggle Kernels 免费使用 GPU 了!

如何在 Kaggle Kernels 上使用 GPU

Kaggle 官网上分享了怎样能在 Kaggle Kernels 上使用 GPU,并展示了示例代码:

添加 GPU

我们首先打开 Kernel 控制界面,为当前的 Kernel 设置运行一个 GPU。

选择“Setting”选项,然后选择“Enable GPU”。接着在控制栏上检查你的 Kernel 是否连上了 GPU,连接状态应显示为“GPU ON”,如下图所示:

不少数据科学库并不能使用 GPU,因此对于一些任务来说(特别是使用 TensorFlow、Keras和 PyTorch 这些深度学习库的时候),GPU 会非常有价值。

数据

我们用到的数据集包含了涉及 29 种美式手语的图像,这些手语用来指代 26 个英语字母以及空格、删除、无物的意思等等。我们的模型会查看这些图像,学习分类每张图像上的手语。

# 导入深度学习所需的库和数据
from keras.layers import Conv2D, Dense, Dropout, Flatten
from keras.models import Sequential
from keras.preprocessing.image import ImageDataGenerator

# 保证运行中的连续性
from numpy.random import seed
seed(1)
from tensorflow import set_random_seed
set_random_seed(2)

# 导入以查看数据
import cv2
from glob import glob
from matplotlib import pyplot as plt
from numpy import floor
import random

def plot_three_samples(letter):
    print("Samples images for letter " + letter)
    base_path = '../input/asl_alphabet_train/asl_alphabet_train/'
    img_path = base_path + letter + '/**'
    path_contents = glob(img_path)
 
    plt.figure(figsize=(16,16))
    imgs = random.sample(path_contents, 3)
    plt.subplot(131)
    plt.imshow(cv2.imread(imgs[0]))
    plt.subplot(132)
    plt.imshow(cv2.imread(imgs[1]))
    plt.subplot(133)
    plt.imshow(cv2.imread(imgs[2]))
    return

plot_three_samples('A')


plot_three_samples('B')

对应字母“B”的图像样本:

数据处理设定

data_dir = "../input/asl_alphabet_train/asl_alphabet_train"
target_size = (64, 64)
target_dims = (64, 64, 3) # add channel for RGB
n_classes = 29
val_frac = 0.1
batch_size = 64

data_augmentor = ImageDataGenerator(samplewise_center=True, 
                                    samplewise_std_normalization=True, 
                                    validation_split=val_frac)

train_generator = data_augmentor.flow_from_directory(data_dir, target_size=target_size, batch_size=batch_size, shuffle=True, subset="training")
val_generator = data_augmentor.flow_from_directory(data_dir, target_size=target_size, batch_size=ba

发现属于 29 种类别的 78300 张图像

发现属于 29 种类别的 8700 张图像

模型设定

my_model = Sequential()
my_model.add(Conv2D(64, kernel_size=4, strides=1, activation='relu', input_shape=target_dims))
my_model.add(Conv2D(64, kernel_size=4, strides=2, activation='relu'))
my_model.add(Dropout(0.5))
my_model.add(Conv2D(128, kernel_size=4, strides=1, activation='relu'))
my_model.add(Conv2D(128, kernel_size=4, strides=2, activation='relu'))
my_model.add(Dropout(0.5))
my_model.add(Conv2D(256, kernel_size=4, strides=1, activation='relu'))
my_model.add(Conv2D(256, kernel_size=4, strides=2, activation='relu'))
my_model.add(Flatten())
my_model.add(Dropout(0.5))
my_model.add(Dense(512, activation='relu'))
my_model.add(Dense(n_classes, activation='softmax'))

my_model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=["accuracy"])

模型拟合

my_model.fit_generator(train_generator, epochs=5, validation_data=val_generator)

Epoch 1/5
1224/1224 [==============================] - 206s 169ms/step - loss: 1.1439 - acc: 0.6431 - val_loss: 0.5824 - val_acc: 0.8126
Epoch 2/5
1224/1224 [==============================] - 179s 146ms/step - loss: 0.2429 - acc: 0.9186 - val_loss: 0.5081 - val_acc: 0.8492
Epoch 3/5
1224/1224 [==============================] - 182s 148ms/step - loss: 0.1576 - acc: 0.9495 - val_loss: 0.5181 - val_acc: 0.8685
Epoch 4/5
1224/1224 [==============================] - 180s 147ms/step - loss: 0.1417 - acc: 0.9554 - val_loss: 0.4139 - val_acc: 0.8786
Epoch 5/5
1224/1224 [==============================] - 181s 148ms/step - loss: 0.1149 - acc: 0.9647 - val_loss: 0.4319 - val_acc: 0.8948

<keras.callbacks.History at 0x7f5cbb6537b8>

关于如何赢得 Kaggle 挑战赛,你可能还喜欢:

Kaggle 首战拿银总结 | 入门指导 (长文、干货).


不可错过的人工智能必修算法手册