前段时间咱们分享了怎么免费用谷歌的 GPU 训练机器学习模型,详情戳这里。算法
此次咱们又有了新的薅羊毛机会:经过 Kaggle Kernels 无偿使用英伟达 GPU!浏览器
可能有些朋友不是很熟悉 Kaggle Kernels,但 Kaggle 应该知道,至少搞数据科学和机器学习的会据说过 Kaggle 挑战赛。Kaggle 是一个用来从事数据科学研究或分享数据科学知识的平台从 Kaggle 上咱们不只能练习数据科学,还能从 Kaggle 社区中学到不少知识。bash
而 Kaggle 的产品 Kaggle Kernels 至关于一个内置于浏览器的 Jupyter Notebooks,一切运行都在你眼前呈现,由你自由支配。一句话:Kaggle Kernels 就是一个能在浏览器中运行 Jupyter Notebooks 的免费平台。服务器
也就是说,只要有网络有浏览器,你随时随地都能在你的浏览器上拥有 Jupyter Notebook 环境,不用再本身设置本地环境。网络
因为 Kaggle Kernels 的处理能力来自云端服务器,而不是本地机器,因此咱们能在不怎么消耗笔记本电量的状况下,在上面完成不少数据科学和机器学习工做。架构
在 Kaggle 上注册一个帐户后,就能够选择一个本身想要使用的数据集,点击几下就能启动一个新的 Kernel,也就是 Notebook。dom
咱们用的数据集都预先加载到了该 Kernel 上,因此把数据集导入机器、再等待数据集输入模型中这样一套耗时的流程,咱们就不用再作了。机器学习
具体如何使用 Kaggle Kernels,能够参考这篇教程。ide
最近 Kaggle 又推出了一个大福利:用户经过 Kaggle Kernels 能够无偿使用 NVidia K80 GPU !post
通过 Kaggle 测试后显示,使用 GPU 后能让你训练深度学习模型的速度提升 12.5 倍。
以使用 ASL Alphabet 数据集训练模型为例,在 Kaggle Kernels 上用 GPU 的总训练时间为 994 秒,而此前用 CPU 的总训练时间达 13,419 秒。直接让你训练模型的时间缩短为原来的 12 分之一。 固然在本身实际使用中,模型训练时间缩短多长会涉及多个因素,好比模型架构、批次大小、输入流水线的复杂程度等等。无论怎么说,咱们如今能够经过 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 挑战赛,你可能还喜欢: