斯坦福 CS231n(2016) Assignment 2/3 Python 3.7版本的完成

CS231n(2016) Assignment 2/3 Python 3.7 完成

这是我斯坦福CS231n (2016冬季 1月-3月)作业2/3的答案。

目前的答案代码大多基于python2的环境,而且提供的.ipynb文件不是很适合编辑和debug。这篇作业可以在Python 3.7的环境中运行。

我的完成环境是:Windows 10 + Pychram + Python 3.7.

使用时,请恰当地对于每一功能块,注释或取消注释。每一块都有起始提示符和结束提示符。例如,
#### Start: Test softmax and SVM in layers.py #### & #### End: Test softmax and SVM in layers.py ####

建议在使用本作业的时候,配合课程提供的相应.ipynb文件。

关于数据集下载:

  • Assignment 2

根据课程作业提供的方法使用 \cs231n\datasets 中的 get_datasets.sh

或者用纯文本编辑器打开get_datasets.sh,然后根据里面的提示下载数据集。

  • Assignment 3

根据课程作业提供的方法使用 \cs231n\datasets 中的 get_datasets.sh
get_tiny_imagenet_a.sh get_pretrained_model.sh get_coco_captioning.sh

或者分别用纯文本编辑器(例如Sublime)打开以上三个文件,复制下载链接,开始下载,之后解压压缩包(均依照文件内的指示)。

如果出现了 pretrained_model.txt,备份之后直接重命名为 pretrained_model.h5

Assignment 2

最后部分设计的卷积神经网络模型 /classierfiers/customedCNN.py

这是我尝试过的网络中表现最好的,具体结构如下:

INPUT --> [CONV --> RELU --> POOL]*2 --> [CONV --> RELU] --> FC/OUT

Train the Net部分,得到的结果如下:
(Epoch 1 / 1) train acc: 0.470000; val_acc: 0.483000

我还尝试了以下的网络:

**INPUT --> [CONV --> RELU --> POOL]*2 --> [CONV --> RELU] --> FC --> ReLU --> FC/OUT **

INPUT --> [CONV --> ReLU]*2 --> [FC --> ReLU]*2 --> FC/OUT

INPUT --> [CONV --> ReLU]*2 --> POOL --> [FC --> ReLU]*2 --> FC/OUT

这些网络在训练时表现都欠佳,不过可以增大Solver() 中的 num_epochs 来获得更好的效果。

使用课程提供源码时,遇到的问题汇总

与Python版本相关的问题

  • datadict = pickle.load(f, encoding=‘bytes’)

The default decode method of pickle.load() is encodeing=“ASCII”. If the file to load is not in the saving form of ASCII, we need to choose a parameter in encoding.

encoding=‘bytes’ means load 8-bits string in the form of bytes.

  • datadict[b’labels’] / datadict[b’data’]

The original Y = datadict[‘labels’] X = datadict[‘data’] need to do this transfer. In 3, str is unicode(default); in 2, str is bytes(default), b’’ mindicates byte.

No meaning of b’’ in 2, only to be compatible with 3.

Here to add b is to let code of 2 to suit code in 3

  • tranfers iteritems into items

just a difference between 2 and 3.

  • Sign of division / & //

In python 2, / only keep the integer part, while the decimal part is abandoned. So the result is int .

In python 3, the result of / is float. You can use // to get int result.

You may come across it when you use range(), the parameter in bracket may be the result of a division.

  • Roughly, xrange() in Python2 was renamed to range() in Python3

其他问题

  • range()

the feedback of range() is range object, if you wanna a list. Transfer the a = range(0,N) into a = list(range(0,N))

  • Module scipy.misc

You may come across error report concerning to the module scipy.misc. The most possible solution is to install PIL, by pip install -U PIL. The specific reason can take this website as reference. https://stackoverflow.com/questions/15345790/scipy-misc-module-has-no-attribute-imread#

Assignment 3

对老师源程序的修改类似Assignment2。

在LSTM_Captioning中,使用了 BLEU_score 作为评价模型好坏的标准。

代码下载的地址是:
https://github.com/rrryan2016/CS231N-Assignment

你可能感兴趣的:(机器学习)