深度学习 | Pytorch深度学习实践 (Chapter 1~9)

16 篇文章 9 订阅
订阅专栏

一、overview

 基于pytorch的深度学习的四个步骤基本如下:

        



二、线性模型 - Linear Model

基本概念

  • 数据集分为测试集和训练集(训练集、开发集)
  • 训练集(x,y)测试集只给(x)
  • 过拟合:模型学得太多导致性能不好
  • 开发集:测验模型泛化能力
  • zip:从数据集中,按数据对儿取出自变量x_val和真实值y_val


         

  • 本例中进行人工training,穷举法
  • 定义前向传播函数forward
  • 定义损失函数loss
  • MSE:平均平方误差
  • zip:从数据集中,按数据对儿取出自变量x_val和真实值y_val
import numpy as np
import matplotlib.pyplot as plt

x_data = [1.0,2.0,3.0]
y_data = [2.0,4.0,6.0]

def forward(x):#定义模型
    return x * w

def loss(x,y):#定义损失函数
    y_pred = forward(x)
    return (y_pred - y) * (y_pred - y)

w_list=[]#权重
mse_list=[]
for w in np.arange(0.0,4.1,0.1):
    print('w=',w)
    l_sum = 0
    for x_val,y_val in zip(x_data,y_data):
        y_pred_val = forward(x_val)
        loss_val = loss(x_val,y_val)
        l_sum += loss_val
        print('\t',x_val,y_val,y_pred_val,loss_val)
    print('MSE=',l_sum / 3)
    w_list.append(w)
    mse_list.append(l_sum / 3)

plt.plot(w_list,mse_list)
plt.ylabel('Loss')
plt.xlabel('w')
plt.show()

         


注:模型训练可视化

wisdom:可视化工具包



三、梯度下降 - Gradient Descent

 3.1、梯度下降

(基于cost function 即所有样本):

如我们想要找到w的最优值

        

在这里借用一下吴恩达老师视频中对梯度下降的讲解:

         

  • 贪心思想:每一次迭代得到局部最优,往梯度的负方向走
  • 梯度下降算法很难找到全局最优,但是在深度学习中损失函数中,全局最优最有很少出现,但会出现鞍点(梯度 = 0)

        

类似的,两个参数的这样推导:

        

import numpy as np
import matplotlib.pyplot as plt

w = 1.0
x_data = [1.0,2.0,3.0]
y_data = [2.0,4.0,6.0]

def forward(x):
    return x * w

def cost(xs,ys):
    cost = 0
    for x,y in zip(xs,ys):
        y_pred = forward(x)
        cost += (y_pred-y)**2
    return cost / len(xs)

def gradient(xs,ys):
    grad = 0
    for x,y in zip(xs,ys):
        grad += 2 * x * ( x * w - y)
    return grad / len(xs)

epoch_list=[]
cost_list=[]
print('Predict (before training)',4,forward(4))
for epoch in range(100):
    cost_val = cost(x_data,y_data)
    grad_val = gradient(x_data,y_data)
    w -= 0.01 * grad_val
    print('Epoch',epoch,'w=',w,'loss=',cost_val)
    epoch_list.append(epoch)
    cost_list.append(cost_val)
print('Predict (after training)',4,forward(4))

print('Predict (after training)',4,forward(4))
plt.plot(epoch_list,cost_list)
plt.ylabel('Loss')
plt.xlabel('epoch')
plt.show()

         

  • 注:训练过程会趋近收敛
  • 若生成图像局部震荡很大,可以进行指数平滑
  • 若图像发散,则训练失败,通常原因是因为学习率过大

在这里借用一下吴恩达老师视频中对学习率的讲解:  

        


3.2、随机梯度下降 Stochastic Gradient Descent

(基于单个样本的损失函数):

 —— 因为函数可能存在鞍点,使用一个样本就引入了随机性

什么是小批量梯度下降,和批量梯度下降、随机梯度下降有什么不同_哔哩哔哩_bilibili

 

此时梯度更新公式为:

         

与之前的区别:

  • cost改为loss
  • 梯度求和变为单个样本
  • 训练过程中要对每一个样本求梯度进行更新
  • 由于两个样本的梯度下降不能并行化,时间复杂度太高
  • 所以折中的方式:使用 Mini-Batch 批量随机梯度下降
  • 若干个一组,后续将会涉及
import numpy as np
import matplotlib.pyplot as plt

w = 1.0
x_data = [1.0,2.0,3.0]
y_data = [2.0,4.0,6.0]

def forward(x):
    return x * w

def loss(x,y):
    y_pred = forward(x)
    return (y_pred-y)**2

def gradient(x,y):
    return 2 * x * (x * w - y)

loss_list=[]
epoch_list=[]
print('Predict (before training)',4,forward(4))

for epoch in range(100):
    for x,y in zip(x_data,y_data):
        grad = gradient(x,y)
        w = w - 0.01 * grad
        print('\tgrad',x,y,grad)
        l = loss(x,y)
        loss_list.append(l)
        epoch_list.append(epoch)
    print("progress",epoch,'w=',w,'loss=',l)

print('Predict (after training)',4,forward(4))
plt.plot(epoch_list,loss_list)
plt.ylabel('Loss')
plt.xlabel('epoch')
plt.show()

         

         



四 、反向传播 - BackPropagation

对于复杂的网络:

举例来讲两层神经网络

        

若进行线性变换,不管多少层,最终都可以统一成一种形式,但为了让你不能在化简(即提高模型复杂程度),所以我们要对每一层最终的输出

加一个非线性的变化函数(比如sigmiod)

        

则层层叠加若需要求梯度的话就要用到  —— 链式求导:

  • 1、构建计算图 —— 前馈计算(Forward)先计算最终的loss

        

  • 2、反馈(Backward)

         

 来看一下最简单的线性模型中的计算图的计算过程:

        


        

在pytorch中,使用tensor类型的数据

        

import torch
import matplotlib.pyplot as plt

x_data = [1.0,2.0,3.0]
y_data = [2.0,4.0,6.0]

w = torch.Tensor([1.0]) #注意这里一定要加[] 权重初始值
w.requires_grad = True

def forward(x):
    return x * w #因为w是Tensor,这里的运算符已经被重载了,x会进行自动转换,即构造了计算图

def loss(x,y):
    y_pred = forward(x)
    return (y_pred - y) ** 2

epoch_list = []
loss_list = []
print('Predict (before training)',4,forward(4))

for epoch in range(100):
    #sum=0
    for x,y in zip(x_data,y_data):
        l = loss(x,y) #只要一做backward计算图会释放,会准备下一次的图
        l.backward()
        print('\tgrad:',x,y,w.grad.item()) #item将梯度数值直接拿出来为标量
        w.data = w.data - 0.01 * w.grad.data #grad必须要取到data

        #sum += l 但l为张量,计算图,进行加法计算会构造计算图,将会发生溢出

        w.grad.data.zero_() #!!!权重里面梯度的数据必须显式清零

        print("progress",epoch,l.item())
        epoch_list.append(epoch)
        loss_list.append(l.item())

print('Predict (after training)',4,forward(4))
plt.plot(epoch_list,loss_list)
plt.ylabel('Loss')
plt.xlabel('epoch')
plt.show()

         



五、利用PyTorch实现线性回归模型 - Linear Regression With PyTorch

pytorch神经网络四步走

  • 1、构建数据集
  • 2、设计模型(用来计算y_hat)
  • 3、构建损失函数和优化器(我们使用pytorch封装的API)
  • 4、训练周期(前馈 反馈 更新)

本例将使用 Mini-Batch,numpy有广播机制矩阵相加会自动扩充。

         

 使用pytorch的关键就不在于求梯度了,而是构建计算图,这里使用仿射模型,也叫线性单元。

代码实现:

import torch
import matplotlib.pyplot as plt

# 1、准备数据
x_data = torch.Tensor([[1.0],[2.0],[3.0]])
y_data = torch.Tensor([[2.0],[4.0],[6.0]])

# 2、构建模型
class LinearModel(torch.nn.Module):
    def __init__(self): #构造函数
        super(LinearModel,self).__init__()
        self.linear = torch.nn.Linear(1,1) #构造一个对象

    def forward(self,x):
        y_pred = self.linear(x) #实现可调用对象
        return y_pred

model = LinearModel()

# 3、构造损失函数和优化器
criterion = torch.nn.MSELoss(size_average=False) #继承nn.Module,是否求平均
optimizer = torch.optim.SGD(model.parameters(),lr=0.01) #是一个类,不继承nn.Module,不会构建计算图,lr学习率

epoch_list = []
loss_list = []

for epoch in range(100):
    # 前馈 计算 y_hat
    y_pred = model(x_data)
    # 前馈 计算损失
    loss = criterion(y_pred,y_data) #loss标量
    print(epoch,loss) # loss是一个对象,打印将会自动调用__str__()

    optimizer.zero_grad() # 所有权重梯度归零
    # 反馈 反向传播
    loss.backward()
    # 自动更新,权重进行更新
    optimizer.step()

    epoch_list.append(epoch)
    loss_list.append(loss.item())

# Output weight and bias
print('w = ',model.linear.weight.item())
print('b = ',model.linear.bias.item())

# Test Model
x_test = torch.Tensor([4.0])
y_test = model(x_test)
print('y_pred = ',y_test.data)
plt.plot(epoch_list,loss_list)

plt.ylabel('Loss')
plt.xlabel('epoch')
plt.show()

         

       

         

        



六、逻辑斯蒂回归 - Logistics Regression 逻辑斯蒂回归

  • —— 虽然叫回归模型,但既可解决分类模型,也可解决回归模型
  • 本节是讲的二分类,背景是:学习多少小时能够考试通过;
  • 训练好模型以后,直接用来预测,4小时的学习,能够通过的概率是多大?

  • torchvision提供相应的数据集,可以指定需要的数据集,train表示需要训练集还是测试集。
  • 分类问题我们的输出为概率,将线性模型输出的实数空间映射到[0,1]之间,logist函数即可完成这个映射。
  • logist函数为饱和函数,是sigmoid中最典型的。

        

  •  其他的sigmoid函数:

        

所以现在我们的模型:

        

对应的loss也要发生改变,现在输出的是一个分布,不再是一个数值,

所以现在相比较的是两个分布之间的差异:可以选择用KL散度或者cross-entropy(交叉熵)

交叉熵举例:交叉熵越大越好

        

在本例中我们采用二分类的交叉熵,因为加了负号,所以这里的loss越小越好,称为BCE损失

         

         

  •  criterion = torch.nn.BCELoss(size_average=False) #继承nn.Module,是否给每个批量求均值,设置与否关键会影响学习率的设置,因为如果损失变小了,将来求出来的导数也会乘上这个常数

import torchvision
import torch.nn.functional as F
import torch
import matplotlib.pyplot as plt

# 1、准备数据
x_data = torch.Tensor([[1.0],[2.0],[3.0]])
y_data = torch.Tensor([[0],[0],[1]])

# 2、构建模型
class LogisticRegressionModel(torch.nn.Module):
    def __init__(self):
        super(LogisticRegressionModel,self).__init__()
        self.linear = torch.nn.Linear(1,1)

    def forward(self,x):
        y_pred = F.sigmoid(self.linear(x))
        return y_pred

model = LogisticRegressionModel()

# 3、构造损失函数和优化器
criterion = torch.nn.BCELoss(size_average=False) #继承nn.Module,是否给每个批量求均值
optimizer = torch.optim.SGD(model.parameters(),lr=0.01) #是一个类,不继承nn.Module,不会构建计算图,lr学习率

epoch_list = []
loss_list = []

for epoch in range(1000):
    # 前馈 计算 y_hat
    y_pred = model(x_data)
    # 前馈 计算损失
    loss = criterion(y_pred,y_data) #loss标量
    print(epoch,loss) # loss是一个对象,打印将会自动调用__str__()

    optimizer.zero_grad() # 所有权重梯度归零
    # 反馈 反向传播
    loss.backward()
    # 自动更新,权重进行更新
    optimizer.step()

    epoch_list.append(epoch)
    loss_list.append(loss.item())

# Output weight and bias
print('w = ',model.linear.weight.item())
print('b = ',model.linear.bias.item())

# Test Model
x_test = torch.Tensor([4.0])
y_test = model(x_test)
print('y_pred = ',y_test.data)
plt.plot(epoch_list,loss_list)

plt.ylabel('Loss')
plt.xlabel('epoch')
plt.show()

         

        



七、处理多维特征的输入 - Multiple Dimension lnput

引例:糖尿病数据集分类任务

行称为:样本(Sample)      数据库中称为:记录(record)

列称为:特征                   数据库中称为:字段

注:sklearn中提供一个关于糖尿病的数据集可作为回归任务的数据集


Mlultiple Dimension Loqistic Regression Model

  • x可以看成一个向量,每一个x都要和w进行相乘,我们就可以写成图中上面的红色部分,因为标量的转置还是他自身,为了方便演示我们可以写成转置的形式。

                

即:

        

再来看下Mini-Batch(N samples)的情况

        

为什么这里要将方程运算转换成矩阵运算 即 向量形式呢?

———— 我们可以利用并行运算的能力,提高运行速度。

则只需将上一节的代码中数据准备和构建模型进行修改即可:

        


Logistics回归只有一层神经网络,若我们构造一个多层神经网络

        


         

将矩阵看成一种空间变换的函数,这里的(8,2)是指将一个任意八维空间的向量映射到一个二维空间上,注意是线性的,而我们所做的空间变换不一定是线性的,

所以我们想要多个线性变换层通过找到最优的权重,把他们组合起来,来模拟一个非线性变换,

注意绿色框中我们引入的 \sigma 即激活函数 ,在神经网络中我们通过引入激活函数给线性变换加入非线性操作,这样就使得我们可以去拟合相应的非线性变换。


对于本例 我们使用 Example: Artificial Neural Network

        

1、建立数据集

import numpy as np
import torch

xy = np.loadtxt('./dataset/diabetes.csv.gz', delimiter=',', dtype=np.float32)
x_data = torch.from_numpy(xy[:, :-1])
y_data = torch.from_numpy(xy[:, [-1]])
  • 分隔符为,
  • 为什么用float32,因为常用游戏显卡只支持32位浮点数,只有特别贵的显卡才支持64位
  • 由于课程中导入的数据是anaconda安装工具包中的自带的压缩文本数据,所以直接采用numpy中的loadtxt读取,这个函数可以直接读取Linux下压缩的格式,此处是.gz
  • 因为我们的x和y是放在一起的所以 :-1表示不要最后一列 → 拿出来前八列
  • 注意y,所有行,拿出来需要加中括号,拿出来矩阵 → 拿出最后一列

2、模型建立

class Model(torch.nn.Module):
    def __init__(self):
        super(Model, self).__init__()
        self.linear1 = torch.nn.Linear(8, 6)
        self.linear2 = torch.nn.Linear(6, 4)
        self.linear3 = torch.nn.Linear(4, 1)
        self.sigmoid = torch.nn.Sigmoid()

    def forward(self, x):
        x = self.sigmoid(self.linear1(x))
        x = self.sigmoid(self.linear2(x))
        x = self.sigmoid(self.linear3(x))
        return x

model = Model()
  •  注意上次调用的是nn.Function下的sigmoid,但是这里调用的是nn下的一个模块
  • forward函数中,如果是一串,就用一个x,上面的输出是下面的输入

 3、构造损失函数和优化器

criterion = torch.nn.BCELoss(size_average=True)
optimizer = torch.optim.SGD(model.parameters(), lr=0.1)

 4、模型训练(虽然是mini-batch的风格 但这里还是全部数据,下一节会涉及)

for epoch in range(100):
    # forward
    y_pred = model(x_data)
    loss = criterion(y_pred, y_data)
    print(epoch, loss.item())

    # backword
    optimizer.zero_grad()
    loss.backward()

    # update
    optimizer.step()

         


可以尝试不同的激活函数对结果的影响

torch.nn — PyTorch 2.1 documentation

Visualising Activation Functions in Neural Networks - dashee87.github.io

注意:Relu函数取值是0到1,如果最后的输入是小于0的,那么最后输出会是0,但我们可能会算In0,所以一般来说会将最后一层的激活函数改成sigmoid。

        



 八、加载数据集 - Dataset and DataLoader

  • Dataset:加载数据集,支持我们以索引方式拿出样本
  • Dataloader:拿出一组Mini-Batch快速使用


三个概念:Epoch,Batch-size,Iterations

  • 若使用Mini-Batch,我们的训练循环要写成嵌套循环
      • 外层循环:每一寸循环是一次epoch(训练周期)
      • 内层循环:每一次循环执行一个batch(对batch进行迭代)
  • Epoch:所有的样本都进行了一次训练
  • Batch-Size:每一次训练的样本数量
  • Iteration:Batch分了多少个,即内层迭代了多少次


Dataloader: 分组,并做成可迭代的batch

         


  •  dataset抽象类 不可实例化,dataloader可以实例化
  • 数据集类里面有三个函数,这三个函数较为固定,分别自己的作用;
    • 继承Dataset后我们必须实现三个函数:
      • __len__()帮助我们返回数据集大小
      • getitem__()帮助我们通过索引找到某个样本
      • __init__()是初始化函数,之后我们可以提供数据集路径进行数据的加载
  •  Dataset的 init 中如果数据量较少可以导入所有的数据,若数据较大(图像、语音)无结构数据
import numpy as np
import torch
from torch.utils.data import Dataset
from torch.utils.data import DataLoader
import matplotlib.pyplot as plt

epoch_list = []
loss_list = []

class DiabetesDataset(Dataset):
    def __init__(self,filepath):
        xy = np.loadtxt(filepath, delimiter=',', dtype=np.float32)
        self.len = xy.shape[0] #(n,9)
        self.x_data = torch.from_numpy(xy[:, :-1])
        self.y_data = torch.from_numpy(xy[:, [-1]])
    def __getitem__(self, index):
        return self.x_data[index],self.y_data[index]
    def __len__(self):
        return self.len

dataset = DiabetesDataset('D:\python_project\diabetes.csv.gz')
train_loader = DataLoader(dataset=dataset,batch_size=32,shuffle=True,num_workers=1)

class Model(torch.nn.Module):
    def __init__(self):
        super(Model, self).__init__()
        self.linear1 = torch.nn.Linear(8, 6)
        self.linear2 = torch.nn.Linear(6, 4)
        self.linear3 = torch.nn.Linear(4, 1)
        self.sigmoid = torch.nn.Sigmoid()

    def forward(self, x):
        x = self.sigmoid(self.linear1(x))
        x = self.sigmoid(self.linear2(x))
        x = self.sigmoid(self.linear3(x))
        return x

model = Model()

criterion = torch.nn.BCELoss(reduction='mean')
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)

if __name__ == '__main__':
    for epoch in range(100):
        for i,data in enumerate(train_loader,0):
                print(1)
                # 1、准备数据
                inputs, labels = data
                # 2、前馈
                y_pred = model(inputs)
                loss = criterion(y_pred,labels)
                print(epoch,i,loss.item())
                # 3、反馈
                optimizer.zero_grad()
                loss.backward()
                # 4、更新
                optimizer.step()

                epoch_list.append(epoch)
                loss_list.append(loss.item())

    plt.plot(epoch_list,loss_list)
    plt.ylabel('Loss')
    plt.xlabel('epoch')
    plt.show()

不是我结果怎这样?

         


更多数据集:

       

         



九、多分类问题 - Softmax分类器

         

  • Sigmoid函数主要用于解决二分类问题,它的特性在于将输入值映射到0和1之间的概率值。然而,在多类别问题中,我们需要将输入值映射到多个不同的类别上,而不仅仅是0和1。
  • 如果我们尝试使用sigmoid函数来解决多类别问题,我们需要将其进行扩展以支持多个类别。一种常见的方法是使用一对多(One-vs-Rest)策略,其中针对每个类别训练一个独立的二分类模型。然后,我们可以使用sigmoid函数将每个模型的输出转换为概率值。
  • 然而,这种方法存在一些问题。首先,由于每个模型都是独立训练的,可能会导致类别之间存在冲突或重叠。其次,sigmoid函数在处理极端情况时(接近0或1)容易饱和,这可能会导致梯度消失或梯度爆炸问题,对模型的训练造成困难。
  • 因此,为了解决多类别问题,通常会使用其他适合的函数,如Softmax函数。Softmax函数可以将输入值映射到多个类别的概率分布,同时保持概率之和为1。这样,我们可以更好地处理多类别问题,并避免sigmoid函数的限制。

        

 Softmax层:

                

因为只有一项结果会为0,所以在算Loss时只算一项即可。

        

在pytorch中:

        

 具体例子:

        


反看之前的题目:

lmplementation of classifier to MNIST dataset

        

  • ToTenser:神经网络想要的输入比较小,所以原始图像需要转变成一个图像张量        
  • Normalize:标准化 切换到 0,1 分布 ,参数为 均值 标准差,类似四六级成绩
  • 因为我们选用小批量,所以这里的N表示每个批量N个样本,每个样本都是一维28x28的图像
  • 则输入为四阶张量,但在全连接神经网络中,要求输入必须是矩阵,
  • 所以需要将1x28x28这个三阶张量 变为 一阶的向量
  • 则只要将图像的每一行拼起来即可,一行即为784个元素,所以可以使用view函数,将输入变为二阶张量,第一个参数为-1,将来会自动算出对应值
  • 最后得到 Nx784 的矩阵
  • 注意:最后一层不做激活

        


为什么每一层Linear层后都要加一层激活函数?

在神经网络中,每一层后加入激活函数有几个主要原因:

  1. 引入非线性:线性层只是对输入进行线性变换,无法处理复杂的非线性关系。通过添加激活函数,可以引入非线性,使得神经网络能够学习更加复杂的特征和模式。

  2. 增强模型表达能力:激活函数可以增加模型的表达能力,使其能够适应更广泛的数据分布和任务。通过非线性变换,激活函数可以将输入映射到更高维度的特征空间,从而提取更多的有用信息。

  3. 解决梯度消失问题:线性层的堆叠容易导致梯度逐渐消失的问题。激活函数的使用可以帮助传播梯度,避免梯度在深层网络中过早地衰减。这对于训练深层神经网络至关重要。

  4. 使输出范围有限:某些激活函数(例如sigmoid函数、tanh函数)可以将输出值限制在特定的范围内(例如[0,1]或[-1,1]),这有助于解决回归或分类问题中的数值稳定性和收敛性问题。

需要注意的是,并非所有层都需要添加激活函数。例如,在输出层进行回归任务时,可以选择不使用激活函数或者使用恒等函数作为激活函数。在某些特定的网络架构中,也可能会采用其他类型的层(如BatchNormalization层、MaxPooling层)来替代激活函数的作用。


 代码实现:

import torch
from torchvision import transforms
from torchvision import datasets
from torch.utils.data import DataLoader
import torch.nn.functional as F
import torch.optim as optim

# 1、数据准备
batch_size = 64
transform = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize((0.1307,),(0.3081,))
])

train_dataset = datasets.MNIST(root='../dataset/mnist',train=True,download=True,transform=transform)
train_loader = DataLoader(train_dataset,shuffle=True,batch_size=batch_size)

test_dataset = datasets.MNIST(root='../dataset/mnist',train=False,download=True,transform=transform)
test_loader = DataLoader(test_dataset,shuffle=False,batch_size=batch_size)

# 2、构建模型
class Net(torch.nn.Module):
    def __init__(self):
        super(Net,self).__init__()
        self.l1 = torch.nn.Linear(784,512)
        self.l2 = torch.nn.Linear(512,256)
        self.l3 = torch.nn.Linear(256,128)
        self.l4 = torch.nn.Linear(128,64)
        self.l5 = torch.nn.Linear(64,10)

    def forward(self,x):
        x = x.view(-1,784)
        x = F.relu(self.l1(x))
        x = F.relu(self.l2(x))
        x = F.relu(self.l3(x))
        x = F.relu(self.l4(x))
        return self.l5(x)

model = Net()

# 3、损失函数和优化器
criterion = torch.nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(),lr=0.01,momentum=0.5)

# 4、训练和测试
def train(epoch):
    running_loss = 0.0
    for batch_idx,data in enumerate(train_loader,0):
        inputs,target = data
        optimizer.zero_grad()

        outputs = model(inputs)
        loss = criterion(outputs,target)
        loss.backward()
        optimizer.step()

        running_loss += loss.item()
        if batch_idx % 300 == 299: # 每三百次迭代输出一次
            print('[%d , %5d] loss: %.3f' % (epoch + 1 ,batch_idx + 1,running_loss / 300))
            running_loss = 0.0

def test():
    correct = 0
    total = 0
    with torch.no_grad():
        for data in test_loader:
            images,labels = data
            outputs = model(images) # 输出为一个矩阵,下面要求每一行最大值(即分类)的下标
            _,predicted = torch.max(outputs.data,dim=1)
            total += labels.size(0)
            correct += (predicted == labels).sum().item()
    print('Accuracy on test set: %d %%' % (100 * correct / total))

if __name__ == '__main__':
    for epoch in range(10):
        train(epoch)
        test()

实验结果:

        

为什么最后准确率上不去了?

因为做图像时忽略了对局部信息的利用,本例中使用的是全连接神经网络,所有的元素都和其他元素都要产生联系,所以首先我们的权重不够多,其次我们在处理图像时更关系一些高抽象级别的特征,我们现在用的是非常原始的特征,

改进:我们可以先对图像进行人工特征提取:如傅里叶变换变换成频率的表示、小波

自动特征提取:CNN


• Reading the document:
• https://pytorch.org/docs/stable/nn.html#crossentropyloss
• https://pytorch.org/docs/stable/nn.html#nllloss
• Try to know why:
• CrossEntropyLoss <==> LogSoftmax + NLLLoss



部分文字参考于

【Pytorch深度学习实践】B站up刘二大人之SoftmaxClassifier-代码理解与实现(8/9)_softmax分类器代码-CSDN博客

视频及图片来源于

09.多分类问题_哔哩哔哩_bilibili

深度学习框架pytorch入门与实践源代码.rar
11-21
深度学习框架pytorch入门与实践源代码
深度学习PyTorch极简入门PDF教程1
08-03
介绍。这里,大家把它看成是一个非线性函数即可。这样,线性感知机和非线性单元就构成了单个神经元。单个神经元描述的是输出与单一变量之间的关系。还是上面的例子,如果房
PyTorch深度学习实践》完结合集 · Hongpu Liu · overview(1)
猪猪的博客
08-13 715
前言 一、Pytorch 的安装 详解:Pytorch(一) Pytorch 的安装:https://blog.csdn.net/qq_23013309/article/details/103965619 二、线性模型(穷举法)
深度学习 | Pytorch深度学习实践Chapter 12 Basic RNN)
"You are worthy! You can do it!"
12-10 238
由于每一项的数据都和前一项相关,所以送进RNN Cell的数据不止其本身的数据,还要有上一项的数据(也就是图中的红色箭头。—— 将RNN Cell以循环的形式把序列一个一个送进去,然后依次算出隐层的过程,就叫做循环神经网络,其中RNN Cell是其中的一个单元。若使用稠密的网络,把其拼成有九个维度的向量,但如果序列很长而且维度很高,则权重数量太多到难以处理。比如果要通过图像来生成文本,那么h0就设成一个CNN+Fc,如果没有的话就可以把它设成一个对应维度的0向量)。见上面图上面部分的红色笔迹。
深度学习 | Pytorch深度学习实践Chapter 10、11 CNN)
"You are worthy! You can do it!"
10-22 402
因为我们的维度是 batchchannel,width,height ,所以是第一个维度dim=1。初始的输入通道并没有写死,而是作为构造函数里的参数,这是因为我们将来实例化时可以指明输入通道是多少。将四个分支可以放到一个列表里,然后用torch提供的函数cat沿着dim=1的维度将他们拼接起来。为了保持输入输出的大小不变,所以要将padding设置为1,输入通道和输出通道都和x保持一致。若输出和输入的维度不一样,也可以做跳连接,可以将x过一个最大池化层转换成同样的大小,如下图。为什么要做成这个样子?
深度学习框架pytorch快速开发与实战chapter3
weixin_50862344的博客
07-23 209
深度学习框架pytorch快速开发与实战chapter.3
PyTorch深度学习实战 | 迁移学习与自然语言处理实践
不断学习,不断进步,提高自己
04-04 1232
因此,使用刚刚用验证集训练得到的模型,通过predict.py来预测验证集,人工检验预测的结果是否有效,这样子就能保证我们整体的单模流程完全没问题了。为此,我们对BERT进行了改写,将BERT的12层transformer生成的表示赋予一个权重,权重的初始化如式(1)所示,而后通过训练来确定权重值,并将每一层生成的表示加权平均,再通过一层全连接层降维至512维如式(2)所示,最后结合之前的IDCNN-CRF和BILSTM-CRF模型来获得多种异构单模。该模型的精度与BERT-BILSTM-CRF相当。
【深度强化学习】深度学习Pytorch的使用
B417科研笔记
06-22 4262
文章目录前言第三章 深度学习Pytorch的使用Pytorch库基础Tensor 张量标量张量张量的操作张量 与 梯度Pytorch 的神经网络包:torch.nn自定义网络层损失函数与优化器损失函数优化器通过Tensorboard监控网络训练 前言 重读《Deep Reinforcemnet Learning Hands-on》, 常读常新, 极其深入浅出的一本深度强化学习教程。 本文的唯一贡献是对其进行了翻译和提炼, 加一点自己的理解组织成一篇中文笔记。 原英文书下载地址: 传送门 原代码地址: 传送
《动手学深度学习(PyTorch版)》笔记2
weixin_73004416的博客
01-23 1267
让计算机实现微分功能, 有以下四种方式:- 手工计算出微分, 然后编码进代码- 数值微分 (numerical differentiation)- 符号微分 (symbolic differentiation)- 自动微分(automatic differentiation)深度学习框架通过自动微分来加快求导。实际中,根据设计好的模型,系统会构建一个计算图(computational graph),来跟踪计算是哪些数据通过哪些操作组合起来产生输出。
PyTorch 深度学习实战 |用 TensorFlow 训练神经网络
不断学习,不断进步,提高自己
03-21 2038
为了更好地理解神经网络如何解决现实世界中的问题,同时也为了熟悉 TensorFlow 的 API,本篇我们将会做一个有关如何训练神经网络的练习,并以此为例,训练一个类似的神经网络。
pytorch 深度学习实战chapter1(1)
qq_53536373的博客
03-16 1103
pytorch 从入门到干饭
动手学深度学习-pytorch-源代码
04-14
动手学深度学习-pytorch-源代码
2024年度最新PyTorch深度学习实践
03-01
2024年度最新PyTorch深度学习实践2024年度最新PyTorch深度学习实践2024年度最新PyTorch深度学习实践2024年度最新PyTorch深度学习实践2024年度最新PyTorch深度学习实践2024年度最新PyTorch深度学习实践 2024年度最新...
深度学习框架PyTorch:入门与实践_高清1
08-04
前言为什么写这本书2016年是属千TensorFlow的一年,凭借谷歌的大力推广,TensorFlow占据了各大媒体的头条。2017年年初,PyTorch的横空
专属编程笔记
最新发布
u014397365的博客
06-01 984
在软件开发中,Utils(或Utilities)目录通常用于存放一些。这些工具类或函数为整个应用程序或多个模块提供便利的功能支持,使得代码更加模块化、易于维护和重用。UtilsUtils目录的设计目的在于避免代码重复,并确保在整个项目中以一致的方式处理共通任务。这样做可以提高开发效率,降低维护成本,并确保代码的整洁性和可读性。
如何mysql数据导入到mongdb
codemami的博客
05-30 1521
由于MySQL和MongoDB的数据模型不同(例如,MySQL使用关系模型,而MongoDB使用文档模型),你可能需要转换数据的格式。使用MongoDB驱动程序:你也可以使用MongoDB的官方驱动程序(如Python的pymongo)来编写脚本,将数据直接插入到MongoDB中。注意:如果你的JSON文件包含多个文档,并且它们不是作为数组的一部分(即每个文档都在其自己的行上),则需要使用--jsonArray选项。手动转换:对于小型数据集,你可以手动编辑SQL或CSV文件,将其转换为JSON格式。
在linux服务器上使用tensorboard,错误记录
wwwwzm的博客
05-30 1221
1. 使用tensorboard命令时,不是从虚拟环境中找tensorboard,而是从(全局路径)中找(/home/ljx/.local/lib/python3.9/site-packages/tensorboard)是一个在 Unix-like 系统(包括 Linux 和 macOS)的命令行界面(如 Bash shell)中使用的命令。2.使用which命令, 查看使用的tensorboard的路径,发现使用的是全局路径,不是虚拟环境路径。是一个特殊的变量,它定义了操作系统搜索可执行文件的目录。
基于NANO 9K 开发板加载PICORV32软核,并建立交叉编译环境
pocean2012的博客
05-30 1222
ISP的实现逻辑是出厂“芯片”(我们这里是软核)自带了BootLoader程序,即出厂引导程序,通过BootLoader可以将程序从串口(上位机)下载到Flash中,实际的时序是通过RST来区分正常启动还是烧录状态,然后上位机的烧录脚本来控制串口时序, 用户程序实际上是通过串口最终下载到了FLASH中,然后程序从flash启动。NANO 9K低成本体验FPGA开发,还是挺香的,官方例子有加载PICORV32软核的例子,可以建立简单的ISP编程环境,通过串口就可以加载程序,很方便。
深度学习框架pytorch:入门与实践 pdf
01-13
深度学习框架pytorch:入门与实践》是一本介绍和教授使用pytorch进行深度学习的电子书籍。pytorch是一个开源的深度学习框架,由Facebook的人工智能研究院开发并维护,它提供了一个强大的工具和接口来构建和训练深度神经网络。 这本书的内容包括了pytorch的基础知识、编程环境的搭建、数据加载和处理方法、模型构建和训练、模型的保存和加载、模型评估和优化等方面。通过这本书的学习,读者可以深入了解和掌握pytorch的各种功能和用法,并能够用pytorch实现和训练自己的深度学习模型。 此外,这本书还提供了一些实践项目,比如图像分类、目标检测和生成对抗网络等,通过这些项目的实践,读者可以进一步巩固和应用所学的知识。 总而言之,这本《深度学习框架pytorch:入门与实践》是一本很好的入门资料,适合有一定编程基础和对深度学习有兴趣的读者学习和参考。无论是作为初学者的入门指南,还是作为已经熟悉其他深度学习框架的用户的参考手册,这本书都是一个很好的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • 高数 | 【极限与等价无穷小】等价无穷小量的替换及加减替换条件 87100
  • 高数 | 【极限与等价无穷小】利用定积分定义求极限 76066
  • 高数 | 工具及必备方法 | 华里士公式大全 61770
  • 高数 | 【极限与等价无穷小】来 抓大头与抓小头 47632
  • 高数 | 【极限与等价无穷小】两个重要极限 & 经典错误 & 什么情况下求极限可以直接带入 43802

分类专栏

  • 计算机组成原理 付费 46篇
  • 408 自用笔记整理 付费 26篇
  • 高数、线代、概统 付费 38篇
  • 深度学习 16篇
  • MSA 16篇
  • 机器学习 13篇
  • 考研数学【数一】 74篇
  • 论文 1篇
  • 机器人 2篇
  • Netty 1篇
  • 数据结构 30篇
  • 操作系统 25篇
  • 计算机网络 20篇
  • 全国408统考考研真题 5篇
  • C++ 2篇
  • C语言 10篇
  • Java 5篇
  • 外刊 2篇
  • 英语长难句 24篇
  • 共勉 8篇
  • 工具 11篇

最新评论

  • 高数 | 【极限与等价无穷小】利用定积分定义求极限

    诗酒趁年华: 讲得很好表情包

  • 高数 | 【极限与等价无穷小】来 抓大头与抓小头

    m0_68259296: 请问为什么你提到的问题中抓小头可以下面可以取1,不是只能抓带有x的项吗?

  • 高数 | 定理及性质证明 | 开 闭区间上连续函数的性质及证明

    不见日月: 谢谢楼主大大表情包表情包表情包

  • 高数 | 【概念剖析】多元函数的偏导数、方向导数、梯度以及微分之间的关系

    Atopos621: 不好意思我搞错了,你这个结论是对的,我也想知道为什么表情包

  • 高数 | 【概念剖析】多元函数的偏导数、方向导数、梯度以及微分之间的关系

    Atopos621: 错了吧表情包应该是在该点任意方向导数存在,该点不一定可微吧表情包

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • 深度学习 | 复杂注意力神经网络 —— 大模型
  • 工具 | nohup不能打印python文件日志
  • 【论文精读】 | Robust Multimodal Sentiment Analysis via Tag Encoding of Uncertain Missing Modalities
2024年24篇
2023年40篇
2022年293篇
2021年16篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西皮呦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

深圳SEO优化公司莱芜网站改版公司资阳网站优化排名公司毕节百度标王推荐梧州网站优化报价阳江网站改版多少钱宁波网络营销报价南京优化价格临汾网站制作新乡网站制作报价海北网站搜索优化公司恩施网站制作报价洛阳seo排名多少钱宣城百度seo多少钱南昌网站推广价格长葛百搜标王推荐黄石模板推广多少钱芜湖企业网站制作价格淮南百度竞价包年推广公司娄底网站建设报价阳泉百度网站优化排名多少钱哈尔滨百度网站优化排名哪家好仙桃网站制作哪家好大同百姓网标王推广报价芜湖网站seo优化报价眉山外贸网站设计价格迁安百度竞价包年推广报价忻州百度标王哪家好林芝至尊标王报价南阳模板网站建设哪家好襄阳网站关键词优化公司歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化