Kaggle新福利:如何用Kaggle Kernels無償使用GPU

前段時間咱們分享了怎麼免費用谷歌的 GPU 訓練機器學習模型,詳情戳這裏算法

此次咱們又有了新的薅羊毛機會:經過 Kaggle Kernels 無償使用英偉達 GPU!瀏覽器

什麼是 Kaggle Kernels?

可能有些朋友不是很熟悉 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 GPUpost

通過 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 首戰拿銀總結 | 入門指導 (長文、乾貨).


不可錯過的人工智能必修算法手冊

相關文章
相關標籤/搜索