想免費用谷歌資源訓練神經網路?Colab 詳細使用教程 —— Jinkey 原創

原文鏈接 jinkey.ai/post/tech/xia

本文作者 Jinkey(微信公眾號 jinkey-love,官網 jinkey.ai

文章允許非篡改署名轉載,刪除或修改本段版權信息轉載的,視為侵犯知識產權,我們保留追求您法律責任的權利,特此聲明!

1 簡介

Colab 是谷歌內部類 Jupyter Notebook 的互動式 Python 環境,免安裝快速切換 Python 2和 Python 3 的環境,支持Google全家桶(TensorFlow、BigQuery、GoogleDrive等),支持 pip 安裝任意自定義庫。網址:colab.research.google.com

2 庫的安裝和使用

Colab 自帶了 Tensorflow、Matplotlib、Numpy、Pandas 等深度學習基礎庫。如果還需要其他依賴,如 Keras,可以新建代碼塊,輸入

# 安裝最新版本Kerasn# https://keras.io/n!pip install kerasn# 指定版本安裝n!pip install keras==2.0.9n# 安裝 OpenCVn# https://opencv.org/n!apt-get -qq install -y libsm6 libxext6 && pip install -q -U opencv-pythonn# 安裝 Pytorchn# http://pytorch.org/n!pip install -q http://download.pytorch.org/whl/cu75/torch-0.2.0.post3-cp27-cp27mu-manylinux1_x86_64.whl torchvisionn# 安裝 XGBoostn# https://github.com/dmlc/xgboostn!pip install -q xgboostn# 安裝 7Zipn!apt-get -qq install -y libarchive-dev && pip install -q -U libarchiven# 安裝 GraphViz 和 PyDotn!apt-get -qq install -y graphviz && pip install -q pydotn

3 Google Drive 文件操作

授權登錄

對於同一個 notebook,登錄操作只需要進行一次,然後才可以進度讀寫操作。

# 安裝 PyDrive 操作庫,該操作每個 notebook 只需要執行一次n!pip install -U -q PyDrivenfrom pydrive.auth import GoogleAuthnfrom pydrive.drive import GoogleDrivenfrom google.colab import authnfrom oauth2client.client import GoogleCredentialsnn# 授權登錄,僅第一次的時候會鑒權nauth.authenticate_user()ngauth = GoogleAuth()ngauth.credentials = GoogleCredentials.get_application_default()ndrive = GoogleDrive(gauth)n

執行這段代碼後,會列印以下內容,點擊連接進行授權登錄,獲取到 token 值填寫到輸入框,按 Enter 繼續即可完成登錄。

遍歷目錄

# 列出根目錄的所有文件n# "q" 查詢條件教程詳見:https://developers.google.com/drive/v2/web/search-parametersnfile_list = drive.ListFile({q: "root in parents and trashed=false"}).GetList()nfor file1 in file_list:n print(title: %s, id: %s, mimeType: %s % (file1[title], file1[id], file1["mimeType"]))n

可以看到控制台列印結果

title: Colab 測試, id: 1cB5CHKSdL26AMXQ5xrqk2kaBv5LSkIsJ8HuEDyZpeqQ, mimeType: application/vnd.google-apps.document

title: Colab Notebooks, id: 1U9363A12345TP2nSeh2K8FzDKSsKj5Jj, mimeType: application/vnd.google-apps.folder

其中 id 是接下來的教程獲取文件的唯一標識。根據 mimeType 可以知道 Colab 測試 文件為 doc 文檔,而 Colab Notebooks 為文件夾(也就是 Colab 的 Notebook 儲存的根目錄),如果想查詢 Colab Notebooks 文件夾下的文件,查詢條件可以這麼寫:

# 目錄 id in parentsnfile_list = drive.ListFile({q: "1cB5CHKSdL26AMXQ5xrqk2kaBv5LBkIsJ8HuEDyZpeqQ in parents and trashed=false"}).GetList()n

讀取文件內容

目前測試過可以直接讀取內容的格式為 .txt(mimeType: text/plain),讀取代碼:

file = drive.CreateFile({id: "替換成你的 .txt 文件 id"}) nfile.GetContentString()n

.csv 如果用GetContentString()只能列印第一行的數據,要用``

file = drive.CreateFile({id: "替換成你的 .csv 文件 id"}) n#這裡的下載操作只是緩存,不會在你的Google Drive 目錄下多下載一個文件nfile.GetContentFile(iris.csv, "text/csv") nn# 直接列印文件內容nwith open(iris.csv) as f:n print f.readlines()n# 用 pandas 讀取nimport pandasnpd.read_csv(iris.csv, index_col=[0,1], skipinitialspace=True)n

Colab 會直接以表格的形式輸出結果(下圖為截取 iris 數據集的前幾行), iris 數據集地址為 aima.cs.berkeley.edu/da ,學習的同學可以執行上傳到自己的 Google Drive。

寫文件操作

# 創建一個文本文件nuploaded = drive.CreateFile({title: 示例.txt})nuploaded.SetContentString(測試內容)nuploaded.Upload()nprint(創建後文件 id 為 {}.format(uploaded.get(id)))n

更多操作可查看 pythonhosted.org/PyDriv

4 Google Sheet 電子表格操作

授權登錄

對於同一個 notebook,登錄操作只需要進行一次,然後才可以進度讀寫操作。

!pip install --upgrade -q gspreadnfrom google.colab import authnauth.authenticate_user()nnimport gspreadnfrom oauth2client.client import GoogleCredentialsnngc = gspread.authorize(GoogleCredentials.get_application_default())n

讀取

把 iris.csv 的數據導入創建一個 Google Sheet 文件來做演示,可以放在 Google Drive 的任意目錄

worksheet = gc.open(iris).sheet1nn# 獲取一個列表[n# [第1行第1列, 第1行第2列, ... , 第1行第n列], ... ,[第n行第1列, 第n行第2列, ... , 第n行第n列]]nrows = worksheet.get_all_values()nprint(rows)nn# 用 pandas 讀取nimport pandas as pdnpd.DataFrame.from_records(rows)n

列印結果分別為

[[5.1, 3.5, 1.4, 0.2, setosa], [4.9, 3, 1.4, 0.2, setosa], ...

寫入

sh = gc.create(谷歌表)nn# 打開工作簿和工作表nworksheet = gc.open(谷歌表).sheet1ncell_list = worksheet.range(A1:C2)nnimport randomnfor cell in cell_list:n cell.value = random.randint(1, 10)nworksheet.update_cells(cell_list)n

5 下載文件到本地

from google.colab import filesnwith open(example.txt, w) as f:n f.write(測試內容)nfiles.download(example.txt)n

6 實戰

這裡以我在 Github 的開源LSTM 文本分類項目為例子github.com/Jinkeycode/kmaster/data 目錄下的三個文件存放到 Google Drive 上。該示例演示的是對健康、科技、設計三個類別的標題進行分類。

新建

在 Colab 上新建 Python2 的筆記本

安裝依賴

!pip install kerasn!pip install jieban!pip install h5pynnimport h5pynimport jieba as jbnimport numpy as npnimport keras as krsnimport tensorflow as tfnfrom sklearn.preprocessing import LabelEncodern

載入數據

授權登錄

# 安裝 PyDrive 操作庫,該操作每個 notebook 只需要執行一次n!pip install -U -q PyDrivenfrom pydrive.auth import GoogleAuthnfrom pydrive.drive import GoogleDrivenfrom google.colab import authnfrom oauth2client.client import GoogleCredentialsnndef login_google_drive():n # 授權登錄,僅第一次的時候會鑒權n auth.authenticate_user()n gauth = GoogleAuth()n gauth.credentials = GoogleCredentials.get_application_default()n drive = GoogleDrive(gauth)n return driven

列出 GD 下的所有文件

def list_file(drive):n file_list = drive.ListFile({q: "root in parents and trashed=false"}).GetList()n for file1 in file_list:n print(title: %s, id: %s, mimeType: %s % (file1[title], file1[id], file1["mimeType"]))n nndrive = login_google_drive()nlist_file(drive)n

緩存數據到工作環境

def cache_data():n # id 替換成上一步讀取到的對應文件 idn health_txt = drive.CreateFile({id: "117GkBtuuBP3wVjES0X0L4wVF5rp5Cewi"}) n tech_txt = drive.CreateFile({id: "14sDl4520Tpo1MLPydjNBoq-QjqOKk9t6"})n design_txt = drive.CreateFile({id: "1J4lndcsjUb8_VfqPcfsDeOoB21bOLea3"})n #這裡的下載操作只是緩存,不會在你的Google Drive 目錄下多下載一個文件n n health_txt.GetContentFile(health.txt, "text/plain")n tech_txt.GetContentFile(tech.txt, "text/plain")n design_txt.GetContentFile(design.txt, "text/plain")n n print("緩存成功")n ncache_data()n

讀取工作環境的數據

def load_data():n titles = []n print("正在載入健康類別的數據...")n with open("health.txt", "r") as f:n for line in f.readlines():n titles.append(line.strip())nn print("正在載入科技類別的數據...")n with open("tech.txt", "r") as f:n for line in f.readlines():n titles.append(line.strip())nnn print("正在載入設計類別的數據...")n with open("design.txt", "r") as f:n for line in f.readlines():n titles.append(line.strip())nn print("一共載入了 %s 個標題" % len(titles))nn return titlesn ntitles = load_data()n

載入標籤

def load_label():n arr0 = np.zeros(shape=[12000, ])n arr1 = np.ones(shape=[12000, ])n arr2 = np.array([2]).repeat(7318)n target = np.hstack([arr0, arr1, arr2])n print("一共載入了 %s 個標籤" % target.shape)nn encoder = LabelEncoder()n encoder.fit(target)n encoded_target = encoder.transform(target)n dummy_target = krs.utils.np_utils.to_categorical(encoded_target)nn return dummy_targetn ntarget = load_label()n

文本預處理

max_sequence_length = 30nembedding_size = 50nn# 標題分詞ntitles = [".".join(jb.cut(t, cut_all=True)) for t in titles]nn# word2vec 詞袋化nvocab_processor = tf.contrib.learn.preprocessing.VocabularyProcessor(max_sequence_length, min_frequency=1)ntext_processed = np.array(list(vocab_processor.fit_transform(titles)))nn# 讀取詞標籤ndict = vocab_processor.vocabulary_._mappingnsorted_vocab = sorted(dict.items(), key = lambda x : x[1])n

構建神經網路

這裡使用 Embedding 和 lstm 作為前兩層,通過 softmax 激活輸出結果

# 配置網路結構ndef build_netword(num_vocabs):n # 配置網路結構n model = krs.Sequential()n model.add(krs.layers.Embedding(num_vocabs, embedding_size, input_length=max_sequence_length))n model.add(krs.layers.LSTM(32, dropout=0.2, recurrent_dropout=0.2))n model.add(krs.layers.Dense(3))n model.add(krs.layers.Activation("softmax"))n model.compile(loss="categorical_crossentropy", optimizer="adam", metrics=["accuracy"])nn return modeln nnum_vocabs = len(dict.items())nmodel = build_netword(num_vocabs=num_vocabs)nnimport timenstart = time.time()n# 訓練模型nmodel.fit(text_processed, target, batch_size=512, epochs=10, )nfinish = time.time()nprint("訓練耗時:%f 秒" %(finish-start))n

預測樣本

sen 可以換成你自己的句子,預測結果為[健康類文章概率, 科技類文章概率, 設計類文章概率], 概率最高的為那一類的文章,但最大概率低於 0.8 時判定為無法分類的文章。

sen = "做好商業設計需要學習的小技巧"nsen_prosessed = " ".join(jb.cut(sen, cut_all=True))nsen_prosessed = vocab_processor.transform([sen_prosessed])nsen_prosessed = np.array(list(sen_prosessed))nresult = model.predict(sen_prosessed)nncatalogue = list(result[0]).index(max(result[0]))nthreshold=0.8nif max(result[0]) > threshold:n if catalogue == 0:n print("這是一篇關於健康的文章")n elif catalogue == 1:n print("這是一篇關於科技的文章")n elif catalogue == 2:n print("這是一篇關於設計的文章")n else:n print("這篇文章沒有可信分類") n

推薦閱讀:

計算機方向學生 MacBook Pro 128GiB 是否夠用?
如何看待Linkface被SenseTime收購?
梯度下降法的神經網路容易收斂到局部最優,為什麼應用廣泛?
什麼是創造力,AI可以獲得嗎?
amazon picking challenge(APC)2016中識別和運動規劃的主流演算法是什麼?

TAG:谷歌Google | 深度学习DeepLearning | Keras |