工程项目深度学习
Softmax回归的从零开始实现Softmax回归利用框架实现 带毕设
工程项目- 大数据环境
配置VMnet8、Vmware Workstation Net网络地址转换的IP和网关、配置三台虚拟机的静态IP。开启并测试环境。
2. 数据分析平台
安装SQL Server+Vistual studio,将前后端代码与数据库迁移,并调试。
深度学习 Softmax回归的从零开始实现softmax是所有深度学习多分类问题的模型的最后一层,将上一层传递下来的结果处理成对应分类的概率。
import torch from IPython import display from d2l import torch as d2l batch_size = 256 #每一个批量为256张图片 train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size) # 训练集和测试集的迭代器,每次返回一个批量大小的数据
softmax的输入是向量,因此需要将图片拉成向量。同时会损失掉很多空间信息。
W初始为高斯随机分布。
num_inputs = 784 # 28*28 num_output = 10 # 类别数为10 W = torch.normal(0, 0.01, size=(num_input, num_output), requires_grad=True) b = torch.zeros(num_outputs, requires_grad=True) # 都需要计算梯度
定义softmax函数,但是矩阵中非常大或非常小的元素可能造成数值上溢或下溢,我们没有采取措施来防止这点。softmax函数使得有正有负的上一层传递过来的结果变成概率的正值,并且每行相加和为1
def softmax(X): X_exp = torch.exp(X) # 每个元素做指数计算 partition = X_exp.sum(1, keepdim=True) # 每一行求和 return X_exp / partition # 这里应用了广播机制
实现softmax回归模型,下面的代码定义了输入如何通过网络映射到输出。
def net(X) return softmax(torch.matmul(X.reshape((-1, W.shape[0])), w) + b)
在数据传递到我们的模型之前,我们使用reshape函数将每张原始图像展平为向量。其中,torch.matmul 为矩阵点乘,-1代表batchsize的大小,即256。W.shape[0]为784。先将矩阵X展平成256*784维的向量,再与参数w点乘。
实现交叉熵损失函数。range()函数创建一个整数列表,返回一个可迭代对象。首先理解y_hat[[0, 1], y],其中**[]中代表样本编号**,整个函数将样本对应真实标签的预测值拿出来。
其次,定义cross_entropy,对于给定的y_hat预测和真实标号y,range生成的从0到y_hat的向量,取每个样本对应的真实标号的预测值,再取对数的相反数。
def cross_entropy(y_hat, y): return - torch.log(y_hat[range(len(y_hat)), y]) cross_entropy(y_hat, y)
计算准确率,判断预测类别和真实类别是否一致:预测正确的样本数/总样本数
def accuracy(y_hat, y): if len(y_hat.shape) > 1 and y_hat.shape[1] > 1: y_hat = y_hat.argmax(axis=1) cmp = y_hat.type(y.dtype) == y #将y_hat的类型转成y的类型,再作比较,转成一个布尔类型的张量 return float(cmp.type(y.dtype).sum()) accuracy(y_hat, y) / len(y)
定义Softmax回归的训练:
def train_epoch_ch3(net, train_iter, loss, updater): if isinstance(net, torch.nn.Model): net.train() # train模式指前向+后向,告诉Pytorch计算梯度 metric = Accumulator(3) for X, y in train_iter: y_hat = net(X) l = loss(y_hat, y) # 如果updater是一个Optimizer if isinstance(updater, torch.optim.Optimizer): updater.zero_grad() l.backward() updater.step() metric.add( float(l) * len(y), accuracy(y_hat, y), y.size().numel()) # 如果是手动实现,则l是一个向量 else: l.sum().backward() updater(X.shape[0]) metric.add(float(l.sum()), accuracy(y_hat, y), y_numel()) return metric[0] / metric[2], metric[1] / metric[2] # 错误率与正确率
调用:
def train_ch3(net, train_iter, test_iter, loss, num_epochs, updater): # 扫num_epochs遍数据 for epoch in range(num_epochs): train_metrics = train_epoch_ch3(net, train_iter, loss, updater) test_acc = evaluate_accuracy(net, test_iter)
最后,实现小批量随机梯度下降来优化模型的损失函数。
lr = 0.1 num_epochs = 10 def updater(batch_size): return d2l.sgd([w, b], lr, batch_size) train_ch3(net, train_iter, test_iter, cross_entropy, num_epochs, updater)Softmax回归利用框架实现
第一步,将数据导入,构造数据迭代器。
import torch from torch import nn from d2l import torch as d2l batch_size = 256 train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)
第二步,softmax回归的输出层是一个全连接层,而Pytorch不会隐式地调整输入的形状,所以定义了展平层在线性层前调整网络输入的形状。
net = nn.Sequential(nn.Flatten(), nn.Linear(784, 10) def init_weights(m): if type(m) == nn.Linear: nn.init.normal_(m.weight, std=0.01) net.apply(init_weights);
第三步,没有将softmax概率传递到损失函数中,而是传递未归一化的预测,并同时计算softmax及其对数。
loss = nn.CrossEntropyLoss()
第四步,小批量随机梯度下降作为优化算法。
trainer = torch.optim.SGD(net.parameters(), lr=0.1)
第五步,调用训练函数。
num_epochs = 10 d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, trainer)带毕设
- 修改、批注开题报告将代码和Anaconda3等动手学深度学习的环境安装好分享前后端实践视频课程,解释前后端如何逻辑地连通搜集Python训练的模型如何进行线上调用分享克里金学习资料
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)