本博文是在学习吴茂贵等人的书籍《Python深度学习基于Pytorch》(英文名为《Deep Learning with Python and Pytorch》)的时候,记录下来的一些笔记,还有版本更新时候可能会出现的问题。
我手中书的版本是2019年10月第一版第一次印刷,已经过去两年了,不知道学起来会遇到哪些问题。我的Python版本是3.7.7。随后遇到问题还会进行更新,虽然之前几本在读的书有的同步更新,有的已经鸽了,但相信我可以的。
- 书中第18页,1.6节通用函数,1.math与numpy函数的性能比较。这里计时用到的函数是time.clock()记录开始和结束时间,并以此作为估计。不过会出现这样的提示
DeprecationWarning: time.clock has been deprecated in Python 3.3 and will be removed from Python 3.8: use time.perf_counter or time.process_time instead
,意思是说在3.8版本之后time.clock将会消失,所以使用time.process_time()
加以替换即可。
另外,记录一下在我的电脑上面,math.sin和numpy.sin的时间对比,可以看到numpy.sin比math.sin运行速度快了14倍。
- 在按照书中25页资料(第2.2.2节),使用conda安装pytorch的时候,安装过程中会遇到无法找到名为conda的module,当错误发生之后,原本的conda环境也无法使用。这个问题似乎是因为如果默认在base环境下面安装pytorch的时候,会覆盖本机的python包,导致版本号不符。解决方案是使用
rm -rf ./anaconda3
,先把anaconda环境完全卸载掉(因为已经不知道anaconda内部到底哪里出现了问题,只能完全暴力卸载了)。
接下来使用conda create pytorchenv python=3.7
专门创建一个安装pytorch环境的conda环境。并切换环境conda activate pytorchenv
,在这个环境中安装torch即可conda install pytorch torchvision torchaudio cudatoolkit=11.1 -c pytorch -c nvidia
。 - 书中27页(第2.3节),配置本机访问服务器Jupyter Notebook的时候,遇到了本机和电脑服务器无法连接的问题。原因可能是服务器的防火墙开启,需要在本机和服务器之间建立一个ssh安全连接。ssh安全连接指令为
ssh 服务器的用户名@服务器IP -L 127.0.0.1:1234:127.0.0.1:8888 -p 端口号
总体访问流程如下:首先在服务器上调整jupyter的配置文件,包括端口号/密码/允许远程访问/允许全体ip访问/默认关闭浏览器窗口。接下来需要在本机建立与服务器jupyter notebook的ssh连接,注意指定服务器连接用端口号,否则会因为防火墙拒绝而无法访问。最后在本机浏览器通过ip:端口就可以访问。 - 书中46页(第2.8节),尝试使用Tensorflow进行复现的时候,发现tensorflow里面没有placeholder这个模块。原因是使用conda install tensorflow默认安装的是tensorflow 2.4版本的内容,而placeholder占位符是tensorflow 版本1的内容了。解决方案是:
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
- 绘图的时候,如果不希望添加横坐标和纵坐标的数值的话,可以使用
plt.xticks([])
来禁用。 - 绘图的时候,可以在绘制某幅图像的时候,
plt.scatter(x, y, label='something')
直接添加label。而不必在这之后另外绘制。 - 当使用datasets.ImageFolder(路径名)的时候,系统会将该文件夹下面的所有图片,按照文件夹进行分类和贴标签,只需要将一类文件/图片放到同一个文件夹下面,就可以使用datasets.ImageFolder批量构建文件数据集合了。
- 下面简单介绍一下如何使用本地浏览器,查看服务器端的tensorboard可视化样例。
tensorboardX在Web端进行显示的方法如下;
1).在服务器端使用conda activate pytorchenv,进入pytorch环境下。
2).tensorboard --logdir=~/logs/logs --port 6006,这里制定好了log地址之后,使用python也需要将对应的标签输出到这个log文件夹下面。
3).使用ssh命令建立本机与服务器端的连接。ssh 用户名@IP地址 -L 127.0.0.1:6006:127.0.0.1:6006 -p 6138
4).在本机浏览器中登录localhost:6006即可。 - 如果想要删除tensorboard中的某些图像,需要点开刚刚的logs文件夹,删除对应的标签文件。只有重启tensorboard服务之后,才能发现这幅图像已经被删除了。
- 有一个疑问,是关于归一化问题的。在训练过程中会减去平均值和除以标准差,减去的应该是训练数据集的平均值和标准差。在测试阶段以及评估阶段,应该也需要减去平均值和除以标准差,这个时候应该用谁的均值和标准差呢?训练集的平均值和标准差,还是测试集的平均值和标准差呢?
在这本书里第五章的5.3.2节对应代码中,展示出来的方法是,在预测的时候,也减去训练数据集合上的平均值和标准差,不知道这样做是否正确。
#对训练数据进行标准化
mean=X_train.mean(axis=0)
std=X_train.std(axis=0)
X_train-=mean
X_train/=std
X_test-=mean
X_test/=std
- 在书中86页的地方,做了一个批量正则化、批量随机置零的操作,用来表明使用这些方法会对泛化的特性有所提高。但是经过我的实际验证,发现使用了这些方法之后,损失函数下降的速度变慢了。不知道这是否与书中所介绍的内容所一致。
在测试数据集上进行运算得到的损失值
在训练数据集上进行运算得到的损失值
但是在书里面的运行结果是如下的:dropout得到的损失值,是要明显小于original原始数据的。这就有点让人费解了。