01. Python 工具
02. Python 基础
03. Numpy
- Numpy 简介
- Matplotlib 基础
- Numpy 数组及其索引
- 数组类型
- 数组方法
- 数组排序
- 数组形状
- 对角线
- 数组与字符串的转换
- 数组属性方法总结
- 生成数组的函数
- 矩阵
- 一般函数
- 向量化函数
- 二元运算
- ufunc 对象
- choose 函数实现条件筛选
- 数组广播机制
- 数组读写
- 结构化数组
- 记录数组
- 内存映射
- 从 Matlab 到 Numpy
04. Scipy
05. Python 进阶
- sys 模块简介
- 与操作系统进行交互:os 模块
- CSV 文件和 csv 模块
- 正则表达式和 re 模块
- datetime 模块
- SQL 数据库
- 对象关系映射
- 函数进阶:参数传递,高阶函数,lambda 匿名函数,global 变量,递归
- 迭代器
- 生成器
- with 语句和上下文管理器
- 修饰符
- 修饰符的使用
- operator, functools, itertools, toolz, fn, funcy 模块
- 作用域
- 动态编译
06. Matplotlib
- Pyplot 教程
- 使用 style 来配置 pyplot 风格
- 处理文本(基础)
- 处理文本(数学表达式)
- 图像基础
- 注释
- 标签
- figures, subplots, axes 和 ticks 对象
- 不要迷信默认设置
- 各种绘图实例
07. 使用其他语言进行扩展
- 简介
- Python 扩展模块
- Cython:Cython 基础,将源代码转换成扩展模块
- Cython:Cython 语法,调用其他C库
- Cython:class 和 cdef class,使用 C++
- Cython:Typed memoryviews
- 生成编译注释
- ctypes
08. 面向对象编程
09. Theano 基础
- Theano 简介及其安装
- Theano 基础
- Theano 在 Windows 上的配置
- Theano 符号图结构
- Theano 配置和编译模式
- Theano 条件语句
- Theano 循环:scan(详解)
- Theano 实例:线性回归
- Theano 实例:Logistic 回归
- Theano 实例:Softmax 回归
- Theano 实例:人工神经网络
- Theano 随机数流变量
- Theano 实例:更复杂的网络
- Theano 实例:卷积神经网络
- Theano tensor 模块:基础
- Theano tensor 模块:索引
- Theano tensor 模块:操作符和逐元素操作
- Theano tensor 模块:nnet 子模块
- Theano tensor 模块:conv 子模块
10. 有趣的第三方模块
11. 有用的工具
- pprint 模块:打印 Python 对象
- pickle, cPickle 模块:序列化 Python 对象
- json 模块:处理 JSON 数据
- glob 模块:文件模式匹配
- shutil 模块:高级文件操作
- gzip, zipfile, tarfile 模块:处理压缩文件
- logging 模块:记录日志
- string 模块:字符串处理
- collections 模块:更多数据结构
- requests 模块:HTTP for Human
12. Pandas
Theano 实例:Softmax 回归
MNIST 数据集的下载和导入
MNIST 数据集 是一个手写数字组成的数据集,现在被当作一个机器学习算法评测的基准数据集。
这是一个下载并解压数据的脚本:
In [1]:
%%file download_mnist.py
import os
import os.path
import urllib
import gzip
import shutil
if not os.path.exists('mnist'):
os.mkdir('mnist')
def download_and_gzip(name):
if not os.path.exists(name + '.gz'):
urllib.urlretrieve('http://yann.lecun.com/exdb/' + name + '.gz', name + '.gz')
if not os.path.exists(name):
with gzip.open(name + '.gz', 'rb') as f_in, open(name, 'wb') as f_out:
shutil.copyfileobj(f_in, f_out)
download_and_gzip('mnist/train-images-idx3-ubyte')
download_and_gzip('mnist/train-labels-idx1-ubyte')
download_and_gzip('mnist/t10k-images-idx3-ubyte')
download_and_gzip('mnist/t10k-labels-idx1-ubyte')
Overwriting download_mnist.py
可以运行这个脚本来下载和解压数据:
In [2]:
%run download_mnist.py
使用如下的脚本来导入 MNIST 数据,源码地址:
https://github.com/Newmu/Theano-Tutorials/blob/master/load.py
In [3]:
%%file load.py
import numpy as np
import os
datasets_dir = './'
def one_hot(x,n):
if type(x) == list:
x = np.array(x)
x = x.flatten()
o_h = np.zeros((len(x),n))
o_h[np.arange(len(x)),x] = 1
return o_h
def mnist(ntrain=60000,ntest=10000,onehot=True):
data_dir = os.path.join(datasets_dir,'mnist/')
fd = open(os.path.join(data_dir,'train-images-idx3-ubyte'))
loaded = np.fromfile(file=fd,dtype=np.uint8)
trX = loaded[16:].reshape((60000,28*28)).astype(float)
fd = open(os.path.join(data_dir,'train-labels-idx1-ubyte'))
loaded = np.fromfile(file=fd,dtype=np.uint8)
trY = loaded[8:].reshape((60000))
fd = open(os.path.join(data_dir,'t10k-images-idx3-ubyte'))
loaded = np.fromfile(file=fd,dtype=np.uint8)
teX = loaded[16:].reshape((10000,28*28)).astype(float)
fd = open(os.path.join(data_dir,'t10k-labels-idx1-ubyte'))
loaded = np.fromfile(file=fd,dtype=np.uint8)
teY = loaded[8:].reshape((10000))
trX = trX/255.
teX = teX/255.
trX = trX[:ntrain]
trY = trY[:ntrain]
teX = teX[:ntest]
teY = teY[:ntest]
if onehot:
trY = one_hot(trY, 10)
teY = one_hot(teY, 10)
else:
trY = np.asarray(trY)
teY = np.asarray(teY)
return trX,teX,trY,teY
Overwriting load.py
softmax 回归
Softmax
回归相当于 Logistic
回归的一个一般化,Logistic
回归处理的是两类问题,Softmax
回归处理的是 N
类问题。
Logistic
回归输出的是标签为 1 的概率(标签为 0 的概率也就知道了),对应地,对 N 类问题 Softmax
输出的是每个类对应的概率。
具体的内容,可以参考 UFLDL
教程:
http://ufldl.stanford.edu/wiki/index.php/Softmax%E5%9B%9E%E5%BD%92
In [4]:
import theano
from theano import tensor as T
import numpy as np
from load import mnist
Using gpu device 1: Tesla C2075 (CNMeM is disabled)
我们来看它具体的实现。
这两个函数一个是将数据转化为 GPU
计算的类型,另一个是初始化权重:
In [5]:
def floatX(X):
return np.asarray(X, dtype=theano.config.floatX)
def init_weights(shape):
return theano.shared(floatX(np.random.randn(*shape) * 0.01))
Softmax
的模型在 theano
中已经实现好了:
In [6]:
A = T.matrix()
B = T.nnet.softmax(A)
test_softmax = theano.function([A], B)
a = floatX(np.random.rand(3, 4))
b = test_softmax(a)
print b.shape
# 行和
print b.sum(1)
(3, 4)
[ 1.00000012 1\. 1\. ]
softmax
函数会按照行对矩阵进行 Softmax
归一化。
所以我们的模型为:
In [7]:
def model(X, w):
return T.nnet.softmax(T.dot(X, w))
导入数据:
In [8]:
trX, teX, trY, teY = mnist(onehot=True)
定义变量,并初始化权重:
In [9]:
X = T.fmatrix()
Y = T.fmatrix()
w = init_weights((784, 10))
定义模型输出和预测:
In [10]:
py_x = model(X, w)
y_pred = T.argmax(py_x, axis=1)
损失函数为多类的交叉熵,这个在 theano
中也被定义好了:
In [11]:
cost = T.mean(T.nnet.categorical_crossentropy(py_x, Y))
gradient = T.grad(cost=cost, wrt=w)
update = [[w, w - gradient * 0.05]]
编译 train
和 predict
函数:
In [12]:
train = theano.function(inputs=[X, Y], outputs=cost, updates=update, allow_input_downcast=True)
predict = theano.function(inputs=[X], outputs=y_pred, allow_input_downcast=True)
迭代 100 次,测试集正确率为 0.925:
In [13]:
for i in range(100):
for start, end in zip(range(0, len(trX), 128), range(128, len(trX), 128)):
cost = train(trX[start:end], trY[start:end])
print "{0:03d}".format(i), np.mean(np.argmax(teY, axis=1) == predict(teX))
000 0.8862
001 0.8985
002 0.9042
003 0.9084
004 0.9104
005 0.9121
006 0.9121
007 0.9142
008 0.9158
009 0.9163
010 0.9162
011 0.9166
012 0.9171
013 0.9176
014 0.9182
015 0.9182
016 0.9184
017 0.9188
018 0.919
019 0.919
020 0.9194
021 0.9201
022 0.9204
023 0.9203
024 0.9205
025 0.9207
026 0.9207
027 0.9209
028 0.9214
029 0.9213
030 0.9212
031 0.9211
032 0.9217
033 0.9217
034 0.9217
035 0.922
036 0.9222
037 0.922
038 0.922
039 0.9218
040 0.9219
041 0.9223
042 0.9225
043 0.9226
044 0.9227
045 0.9225
046 0.9227
047 0.9231
048 0.9231
049 0.9231
050 0.9232
051 0.9232
052 0.9231
053 0.9231
054 0.9233
055 0.9233
056 0.9237
057 0.9239
058 0.9239
059 0.9239
060 0.924
061 0.9242
062 0.9242
063 0.9243
064 0.9243
065 0.9244
066 0.9244
067 0.9244
068 0.9245
069 0.9244
070 0.9244
071 0.9245
072 0.9244
073 0.9243
074 0.9243
075 0.9244
076 0.9243
077 0.9242
078 0.9244
079 0.9244
080 0.9243
081 0.9242
082 0.9239
083 0.9241
084 0.9242
085 0.9243
086 0.9244
087 0.9243
088 0.9243
089 0.9244
090 0.9246
091 0.9246
092 0.9246
093 0.9247
094 0.9246
095 0.9246
096 0.9246
097 0.9246
098 0.9246
099 0.9248
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论