使用Theano实现神经网络分类器教程
概述
本教程将介绍如何使用Theano库构建一个简单的神经网络分类器。Theano是一个强大的Python库,允许我们高效地定义、优化和评估涉及多维数组的数学表达式。我们将实现一个二分类神经网络模型,并详细解释每个步骤的实现原理。
准备工作
首先需要导入必要的库:
import numpy as np
import theano
import theano.tensor as T
数据集准备
我们使用随机生成的数据集来演示分类器的训练过程:
N = 400 # 训练样本数量
feats = 784 # 输入特征维度
# 生成数据集:D = (输入值, 目标类别)
D = (rng.randn(N, feats), rng.randint(size=N, low=0, high=2))
这里生成了400个样本,每个样本有784个特征(类似于MNIST数据集的维度),目标类别为0或1的二分类问题。
模型构建
1. 定义符号变量
x = T.dmatrix("x") # 输入数据矩阵
y = T.dvector("y") # 目标值向量
2. 初始化权重和偏置
W = theano.shared(rng.randn(feats), name="w") # 权重向量
b = theano.shared(0., name="b") # 偏置项
权重使用随机初始化,偏置初始化为0。
3. 构建计算图
# 计算目标=1的逻辑概率(激活函数)
p_1 = T.nnet.sigmoid(T.dot(x, W) + b)
# 预测阈值
prediction = p_1 > 0.5
# 交叉熵损失函数
xent = -y * T.log(p_1) - (1-y) * T.log(1-p_1)
# 带L2正则化的成本函数
cost = xent.mean() + 0.01 * (W ** 2).sum()
# 计算成本函数的梯度
gW, gb = T.grad(cost, [W, b])
这里使用了sigmoid激活函数和交叉熵损失函数,并添加了L2正则化项以防止过拟合。
模型训练
1. 编译训练函数
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)))
2. 编译预测函数
predict = theano.function(inputs=[x], outputs=prediction)
3. 训练过程
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])))
训练500次,每50次打印一次损失值和准确率。
准确率计算
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
这个函数计算预测准确率,通过比较预测值和真实值来计算正确预测的比例。
结果分析
训练完成后,我们可以查看模型在训练集上的表现:
print("target values for D:")
print(D[1])
print("prediction on D:")
print(predict(D[0]))
技术要点总结
-
Theano符号计算:Theano使用符号变量构建计算图,然后编译为高效的执行代码。
-
逻辑回归模型:本质上这是一个单层神经网络(逻辑回归),使用sigmoid激活函数进行二分类。
-
损失函数:交叉熵损失函数适合分类问题,比平方误差更适合概率输出。
-
正则化:L2正则化(权重衰减)帮助防止过拟合,惩罚过大的权重值。
-
梯度下降:自动微分计算梯度,使用固定学习率更新参数。
扩展思考
- 如何修改代码实现多分类问题?
- 尝试添加隐藏层构建真正的多层神经网络
- 实验不同的学习率和正则化系数
- 使用真实数据集替换随机生成的数据
这个简单的神经网络分类器展示了Theano的基本用法,为理解更复杂的深度学习模型奠定了基础。通过调整网络结构和参数,可以解决更复杂的分类问题。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考