原文连接 https://jinkey.ai/post/tech/x...
本文做者 Jinkey(微信公众号 jinkey-love,官网 https://jinkey.ai)
文章容许非篡改署名转载,删除或修改本段版权信息转载的,视为侵犯知识产权,咱们保留追求您法律责任的权利,特此声明!
Colab 是谷歌内部类 Jupyter Notebook 的交互式 Python 环境,免安装快速切换 Python 2和 Python 3 的环境,支持Google全家桶(TensorFlow、BigQuery、GoogleDrive等),支持 pip 安装任意自定义库。
网址:
https://colab.research.google...html
Colab 自带了 Tensorflow、Matplotlib、Numpy、Pandas 等深度学习基础库。若是还须要其余依赖,如 Keras,能够新建代码块,输入python
# 安装最新版本Keras # https://keras.io/ !pip install keras # 指定版本安装 !pip install keras==2.0.9 # 安装 OpenCV # https://opencv.org/ !apt-get -qq install -y libsm6 libxext6 && pip install -q -U opencv-python # 安装 Pytorch # http://pytorch.org/ !pip install -q http://download.pytorch.org/whl/cu75/torch-0.2.0.post3-cp27-cp27mu-manylinux1_x86_64.whl torchvision # 安装 XGBoost # https://github.com/dmlc/xgboost !pip install -q xgboost # 安装 7Zip !apt-get -qq install -y libarchive-dev && pip install -q -U libarchive # 安装 GraphViz 和 PyDot !apt-get -qq install -y graphviz && pip install -q pydot
对于同一个 notebook,登陆操做只须要进行一次,而后才能够进度读写操做。linux
# 安装 PyDrive 操做库,该操做每一个 notebook 只须要执行一次 !pip install -U -q PyDrive from pydrive.auth import GoogleAuth from pydrive.drive import GoogleDrive from google.colab import auth from oauth2client.client import GoogleCredentials # 受权登陆,仅第一次的时候会鉴权 auth.authenticate_user() gauth = GoogleAuth() gauth.credentials = GoogleCredentials.get_application_default() drive = GoogleDrive(gauth)
执行这段代码后,会打印如下内容,点击链接进行受权登陆,获取到 token 值填写到输入框,按 Enter 继续便可完成登陆。git
# 列出根目录的全部文件 # "q" 查询条件教程详见:https://developers.google.com/drive/v2/web/search-parameters file_list = drive.ListFile({'q': "'root' in parents and trashed=false"}).GetList() for file1 in file_list: print('title: %s, id: %s, mimeType: %s' % (file1['title'], file1['id'], file1["mimeType"]))
能够看到控制台打印结果github
title: Colab 测试, id: 1cB5CHKSdL26AMXQ5xrqk2kaBv5LSkIsJ8HuEDyZpeqQ, mimeType: application/vnd.google-apps.documenttitle: Colab Notebooks, id: 1U9363A12345TP2nSeh2K8FzDKSsKj5Jj, mimeType: application/vnd.google-apps.folderweb
其中 id 是接下来的教程获取文件的惟一标识。根据 mimeType 能够知道 Colab 测试
文件为 doc 文档,而 Colab Notebooks 为文件夹(也就是 Colab 的 Notebook 储存的根目录),若是想查询 Colab Notebooks 文件夹下的文件,查询条件能够这么写:shell
# '目录 id' in parents file_list = drive.ListFile({'q': "'1cB5CHKSdL26AMXQ5xrqk2kaBv5LBkIsJ8HuEDyZpeqQ' in parents and trashed=false"}).GetList()
目前测试过能够直接读取内容的格式为 .txt
(mimeType: text/plain),读取代码:缓存
file = drive.CreateFile({'id': "替换成你的 .txt 文件 id"}) file.GetContentString()
而 .csv
若是用GetContentString()
只能打印第一行的数据,要用``微信
file = drive.CreateFile({'id': "替换成你的 .csv 文件 id"}) #这里的下载操做只是缓存,不会在你的Google Drive 目录下多下载一个文件 file.GetContentFile('iris.csv', "text/csv") # 直接打印文件内容 with open('iris.csv') as f: print f.readlines() # 用 pandas 读取 import pandas pd.read_csv('iris.csv', index_col=[0,1], skipinitialspace=True)
Colab 会直接以表格的形式输出结果(下图为截取 iris 数据集的前几行), iris 数据集地址为 http://aima.cs.berkeley.edu/d... ,学习的同窗能够执行上传到本身的 Google Drive。网络
# 建立一个文本文件 uploaded = drive.CreateFile({'title': '示例.txt'}) uploaded.SetContentString('测试内容') uploaded.Upload() print('建立后文件 id 为 {}'.format(uploaded.get('id')))
更多操做可查看 http://pythonhosted.org/PyDri...
对于同一个 notebook,登陆操做只须要进行一次,而后才能够进度读写操做。
!pip install --upgrade -q gspread from google.colab import auth auth.authenticate_user() import gspread from oauth2client.client import GoogleCredentials gc = gspread.authorize(GoogleCredentials.get_application_default())
把 iris.csv 的数据导入建立一个 Google Sheet 文件来作演示,能够放在 Google Drive 的任意目录
worksheet = gc.open('iris').sheet1 # 获取一个列表[ # [第1行第1列, 第1行第2列, ... , 第1行第n列], ... ,[第n行第1列, 第n行第2列, ... , 第n行第n列]] rows = worksheet.get_all_values() print(rows) # 用 pandas 读取 import pandas as pd pd.DataFrame.from_records(rows)
打印结果分别为
[['5.1', '3.5', '1.4', '0.2', 'setosa'], ['4.9', '3', '1.4', '0.2', 'setosa'], ...
![]()
sh = gc.create('谷歌表') # 打开工做簿和工做表 worksheet = gc.open('谷歌表').sheet1 cell_list = worksheet.range('A1:C2') import random for cell in cell_list: cell.value = random.randint(1, 10) worksheet.update_cells(cell_list)
with open('example.txt', 'w') as f: f.write('测试内容') files.download('example.txt')
这里以我在 Github 的开源LSTM 文本分类项目为例子https://github.com/Jinkeycode...
把 master/data
目录下的三个文件存放到 Google Drive 上。该示例演示的是对健康、科技、设计三个类别的标题进行分类。
在 Colab 上新建 Python2 的笔记本
!pip install keras !pip install jieba !pip install h5py import h5py import jieba as jb import numpy as np import keras as krs import tensorflow as tf from sklearn.preprocessing import LabelEncoder
受权登陆
# 安装 PyDrive 操做库,该操做每一个 notebook 只须要执行一次 !pip install -U -q PyDrive from pydrive.auth import GoogleAuth from pydrive.drive import GoogleDrive from google.colab import auth from oauth2client.client import GoogleCredentials def login_google_drive(): # 受权登陆,仅第一次的时候会鉴权 auth.authenticate_user() gauth = GoogleAuth() gauth.credentials = GoogleCredentials.get_application_default() drive = GoogleDrive(gauth) return drive
列出 GD 下的全部文件
def list_file(drive): file_list = drive.ListFile({'q': "'root' in parents and trashed=false"}).GetList() for file1 in file_list: print('title: %s, id: %s, mimeType: %s' % (file1['title'], file1['id'], file1["mimeType"])) drive = login_google_drive() list_file(drive)
缓存数据到工做环境
def cache_data(): # id 替换成上一步读取到的对应文件 id health_txt = drive.CreateFile({'id': "117GkBtuuBP3wVjES0X0L4wVF5rp5Cewi"}) tech_txt = drive.CreateFile({'id': "14sDl4520Tpo1MLPydjNBoq-QjqOKk9t6"}) design_txt = drive.CreateFile({'id': "1J4lndcsjUb8_VfqPcfsDeOoB21bOLea3"}) #这里的下载操做只是缓存,不会在你的Google Drive 目录下多下载一个文件 health_txt.GetContentFile('health.txt', "text/plain") tech_txt.GetContentFile('tech.txt', "text/plain") design_txt.GetContentFile('design.txt', "text/plain") print("缓存成功") cache_data()
读取工做环境的数据
def load_data(): titles = [] print("正在加载健康类别的数据...") with open("health.txt", "r") as f: for line in f.readlines(): titles.append(line.strip()) print("正在加载科技类别的数据...") with open("tech.txt", "r") as f: for line in f.readlines(): titles.append(line.strip()) print("正在加载设计类别的数据...") with open("design.txt", "r") as f: for line in f.readlines(): titles.append(line.strip()) print("一共加载了 %s 个标题" % len(titles)) return titles titles = load_data()
加载标签
def load_label(): arr0 = np.zeros(shape=[12000, ]) arr1 = np.ones(shape=[12000, ]) arr2 = np.array([2]).repeat(7318) target = np.hstack([arr0, arr1, arr2]) print("一共加载了 %s 个标签" % target.shape) encoder = LabelEncoder() encoder.fit(target) encoded_target = encoder.transform(target) dummy_target = krs.utils.np_utils.to_categorical(encoded_target) return dummy_target target = load_label()
max_sequence_length = 30 embedding_size = 50 # 标题分词 titles = [".".join(jb.cut(t, cut_all=True)) for t in titles] # word2vec 词袋化 vocab_processor = tf.contrib.learn.preprocessing.VocabularyProcessor(max_sequence_length, min_frequency=1) text_processed = np.array(list(vocab_processor.fit_transform(titles))) # 读取词标签 dict = vocab_processor.vocabulary_._mapping sorted_vocab = sorted(dict.items(), key = lambda x : x[1])
这里使用 Embedding 和 lstm 做为前两层,经过 softmax 激活输出结果
# 配置网络结构 def build_netword(num_vocabs): # 配置网络结构 model = krs.Sequential() model.add(krs.layers.Embedding(num_vocabs, embedding_size, input_length=max_sequence_length)) model.add(krs.layers.LSTM(32, dropout=0.2, recurrent_dropout=0.2)) model.add(krs.layers.Dense(3)) model.add(krs.layers.Activation("softmax")) model.compile(loss="categorical_crossentropy", optimizer="adam", metrics=["accuracy"]) return model num_vocabs = len(dict.items()) model = build_netword(num_vocabs=num_vocabs) import time start = time.time() # 训练模型 model.fit(text_processed, target, batch_size=512, epochs=10, ) finish = time.time() print("训练耗时:%f 秒" %(finish-start))
sen 能够换成你本身的句子,预测结果为[健康类文章几率, 科技类文章几率, 设计类文章几率]
, 几率最高的为那一类的文章,但最大几率低于 0.8 时断定为没法分类的文章。
sen = "作好商业设计须要学习的小技巧" sen_prosessed = " ".join(jb.cut(sen, cut_all=True)) sen_prosessed = vocab_processor.transform([sen_prosessed]) sen_prosessed = np.array(list(sen_prosessed)) result = model.predict(sen_prosessed) catalogue = list(result[0]).index(max(result[0])) threshold=0.8 if max(result[0]) > threshold: if catalogue == 0: print("这是一篇关于健康的文章") elif catalogue == 1: print("这是一篇关于科技的文章") elif catalogue == 2: print("这是一篇关于设计的文章") else: print("这篇文章没有可信分类")