切换视频源:

Classification 分类学习

作者: Alice 编辑: 莫烦 2016-11-03

学习资料:

导入模块并创建数据

引入需要使用的Python包:

import numpy as np
import theano
import theano.tensor as T

先定义一个功能,用来计算分类问题的准确率,即预测的类别中有多少是和实际类别一样的,计算出百分比。

def compute_accuracy(y_target, y_predict):
    correct_prediction = np.equal(y_predict, y_target)
    accuracy = np.sum(correct_prediction)/len(correct_prediction)
    return accuracy

randn 随机生成数据集。 D 中的 input_values 是 400 个样本,784 个feature。 target_class 是有两类,0 和 1。 要做的是,用神经网络训练数据学习哪些输入对应 0,哪些对应 1.

rng = np.random

N = 400             # training 数据个数
feats = 784         # input 的 feature 数

# 生成随机数: D = (input_values, target_class)
D = (rng.randn(N, feats), rng.randint(size=N, low=0, high=2))

建立模型

接下来,定义神经网络。

先定义一个大的图片,编辑好图片的小部件,再把训练数据集放到图片中去自动地训练。

定义 xy,相当于 placeholder。

# 定义 x y 容器
x = T.dmatrix("x")
y = T.dvector("y")

初始化 weightsbias。 有多少 features 就生成多少个 weights, 今天只是用最基本的 input 和 output 层的神经网络,如果想用 hidden layer 可以参考上一节课的例子。

# 初始化 weights and biases
W = theano.shared(rng.randn(feats), name="w")
b = theano.shared(0., name="b")

定义激活函数,交叉熵。 p_1 是用 sigmoid 求的概率,输入越小,则概率值越接近 0,越大则越接近 1,等于 0 则值为 0.5. p_1 > 0.5 时,预测值为 True,即为 1。 然后计算针对每个 sample 的交叉熵 xent。 再计算整批数据的 cost,为了减小 overfitting,这里加入了 L1-正则化。 接下来可以计算 weights 和 bias 的梯度 gW, gb

p_1 = T.nnet.sigmoid(T.dot(x, W) + b)   # sigmoid 激励函数
prediction = p_1 > 0.5                  
xent = -y * T.log(p_1) - (1-y) * T.log(1-p_1) # 交叉熵

# xent 也可以使用下面这个达到一样的效果
# xent = T.nnet.binary_crossentropy(p_1, y) 

cost = xent.mean() + 0.01 * (W ** 2).sum()  # l2 正则化
gW, gb = T.grad(cost, [W, b])             

激活模型

接下来激活网络。

学习率需要小于 1. 接下来定义两个函数 trainpredict,方法和上一节课的类似。 outputs 可以输出两个 prediction 和交叉熵损失的平均值 xent.mean

learning_rate = 0.1
train = theano.function(
          inputs=[x, y],
          outputs=[prediction, xent.mean()],
          updates=((W, W - learning_rate * gW), (b, b - learning_rate * gb)))
predict = theano.function(inputs=[x], outputs=prediction)

训练模型

接下来训练模型。 用训练集的 feature 和 target 训练模型,输出预测值和损失 pred, err。 每 50 步打印一次损失和准确率。

# Training
for i in range(500):
    pred, err = train(D[0], D[1])
    if i % 50 == 0:
        print('cost:', err)
        print("accuracy:", compute_accuracy(D[1], predict(D[0])))

最后打印出预测值与实际值进行比较。

print("target values for D:")
print(D[1])
print("prediction on D:")
print(predict(D[0]))

"""
cost: 11.677533008109728
accuracy: 0.52
cost: 6.1946164642562636
accuracy: 0.6175
cost: 3.012375762498935
accuracy: 0.725
cost: 1.3340537876600198
accuracy: 0.8275
cost: 0.4690120202455575
accuracy: 0.9075
...


target values for D:
[1 1 0 1 0 1 0 1 1 1 1 1 .....]

prediction on D:
[1 1 0 1 0 1 0 1 1 1 1 1 .....]
"""

分享到: Facebook 微博 微信 Twitter
如果你觉得这篇文章或视频对你的学习很有帮助, 请你也分享它, 让它能再次帮助到更多的需要学习的人. 莫烦没有正式的经济来源, 如果你也想支持 莫烦Python 并看到更好的教学内容, 赞助他一点点, 作为鼓励他继续开源的动力.

支持 让教学变得更优秀