Colab问题记录

最近因为做毕设,模型要来回跑,数据量也不小,在本地跑的话既耗时又耗资源,所以就移到了Colab上实验。Colab (Colaboratory) 由Google提供,是一个可免费提供GPU等算力的平台,长得像 Jupyter Notebook,在上面进行Python编码很方便。

由于是新手,免不了遇到很多问题,这里记录下来,以便以后查阅。

首先是数据导入导出问题。

Q1:我的实验数据在本地,如何加载到Colab?
A:两个步骤

步骤1:输入以下代码,需要选择要上传的数据文件

1
2
from google.colab import files
uploaded = files.upload()

步骤2:将上传的数据文件导入到一个数据框中,但要确保 filename步骤1 中上传的数据文件名一致

1
2
import io
data = pd.read_csv(io.BytesIO(uploaded['filename.csv']))

除了从本地加载数据外,还可以从 GithubGoogle Drive 导入,方法也简单,具体可参考这里

Q2:对于训练结果,我想将其导出到 result.csv 文件并存储到与Colab关联的 Google Drive 中,应该怎么做?
A: 四个步骤

步骤1:将下列授权代码copy到cell中运行,允许登录Google账号并完成相关授权。一般是两次授权,一次允许登录,一次允许访问。

1
2
3
4
5
6
7
8
!apt-get install -y -qq software-properties-common python-software-properties module-init-tools
!add-apt-repository -y ppa:alessandro-strada/ppa 2>&1 > /dev/null!apt-get update -qq 2>&1 > /dev/null!apt-get -y install -qq google-drive-ocamlfuse fuse
from google.colab import auth
auth.authenticate_user()
from oauth2client.client import GoogleCredentials
creds = GoogleCredentials.get_application_default()import getpass
!google-drive-ocamlfuse -headless -id={creds.client_id} -secret={creds.client_secret} < /dev/null 2>&1 | grep URL
vcode = getpass.getpass()!echo {vcode} | google-drive-ocamlfuse -headless -id={creds.client_id} -secret={creds.client_secret}

步骤2:指定存放 result.csv 文件的根目录

1
2
3
4
5
6
7
8
9
# 查看默认文件目录
!ls

# 指定Google Drive云端硬盘的根目录,名为drive
!mkdir -p drive
!google-drive-ocamlfuse drive

# 再次查看根目录,是否为drive
!ls

步骤3:指定存放 result.csv 文件的具体工作文件夹,例如

1
2
3
4
5
# 指定当前的工作文件夹
import os

# drive为之前指定的工作根目录,得加
os.chdir("drive/name/your_project")

步骤4:运行将数据写入 result.csv 文件的代码,该结果文件就存在之前指定的目录中了,可下载到本地。

1
2
data = pd.DataFrame(data=cols,columns=columns)
data.to_csv('result.csv',index=False)

Q3Matplotlib绘图显示中文,乱码,使用的字体在Colab找不到,如何解决?
A:四个步骤

注:Colab的虚拟机 Ubuntu 操作系统没有支持中文的字体,通过执行 !fc-list :lang=zh 命令,发现结果为空。

步骤1:获得要使用字体的压缩文件所在 url,比如,我想使用 SimHei,下载链接可以在这里找到。别的字体可以问度娘和Google,Google Noto Fonts 提供了多种语言字体。

步骤2:下载后确认该字体是即将要使用的,特别确认字体文件是否是 .otf 或者 .ttf 结尾,比如,我使用 SimHei.ttf,同时把上一步中压缩文件的下载链接存起来,我的是 https://www.wfonts.com/download/data/2014/06/01/simhei/simhei.zip

步骤3:下载、解压、移动字体文件。在Colab中编辑以下代码,像使用 Ubuntu 终端一样,将用到诸如 wgetmvunzip 之类的Ubuntu命令
下载的是一个压缩包,里面包含以.otf 或者 .ttf 结尾的字体文件,所以需要解压;如果已下载字体文件本身(即未压缩),则无需解压缩这一步。
然后,把字体文件移动到 Ubuntu环境 中的字体目录,一般都是 /usr/share/fonts/truetype

1
2
3
4
# 下载--解压--移动字体文件
!wget "https://www.wfonts.com/download/data/2014/06/01/simhei/simhei.zip"
!unzip "simhei.zip"
!mv SimHei.ttf /usr/share/fonts/truetype/

步骤4:测试是否能正常显示中文,需要用到上面的字体目录,比如

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import matplotlib.pyplot as plt
%matplotlib inline

import matplotlib.font_manager as fm
path = '/usr/share/fonts/truetype/SimHei.ttf'
fontprop = fm.FontProperties(fname=path, size=13)

figure = plt.figure(figsize=(8,4),dpi=80)
ax = figure.add_axes((0.1, 0.1, 0.8, 0.8))
plt.plot(X_test,y_test, 'c*-', color=(1, 0, 0, 1), linewidth=2.0, label='实际值')
plt.plot(X_test,test_predict, 'c*-', color=(0, 0, 1, 1), linewidth=2.0, label='预测值')

plt.title("模型结果",fontproperties=fontprop)
plt.xlabel("X值",fontproperties=fontprop)
plt.ylabel("Y值",fontproperties=fontprop)
plt.legend(loc = "lower left",prop=fontprop)
plt.show()

Q4:在显示训练结果时,因为Colab上显示输出的内存有限,在达到限制后,缓存的数据就会被截断,无法展示后面轮的训练结果。但是,模型仍然在后台跑,并且处理了输出,只是由于缓存的限制,它不显出来。
A:三种可选择的方法。

  1. 最干脆的方式:清除输出,cell左上角点击 × 就可以了
  2. 通过设置参数不显示输出,将模型拟合中的 verbose 参数置为0
  3. 若就是想看完整的训练中间结果,那么可以增大内存的限制,让你的训练结果都展示出来。如果使用 Tensorflow 作为后端,可在 Keras 中编写 Tensorflow 回调来查看详细输出,具体操作可参考这里

参考链接

  1. https://towardsdatascience.com/3-ways-to-load-csv-files-into-colab-7c14fcbdcb92
  2. https://stackoverflow.com/questions/58636816/cant-save-export-my-dataframe-to-csv-on-googles-colab
  3. https://www.jianshu.com/p/ce2e63d1c10c
  4. https://buomsoo-kim.github.io/colab/2018/04/27/Using-External-fonts-in-colab.md/
-------------完-------------