在之前,我们实现了使用torch自带的层对fashion_mnist数据集进行分类。这次,我们加入一个自己实现的block,实现一个四层的多层感知机进行softmax分类,作为对“自定义块”的代码实现的一个练习。

我们设计的多层感知机是这样的:输入维度为784,在展平层过后,第一层为全连接层,输入输出维度分别为784,256;第二层为全连接层,输入输出维度分别为256,128;第三层为全连接层,输入输出维度分别为128,64;第四层为全连接层(输出层),输入输出维度分别为64,10.代码如下:

import torch
from d2l import torch as d2l
from torch import nn
from torch.nn import functional as F batch_size = 256
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)
num_inputs = 784
num_outputs = 10 #输入层784; 隐藏层一784,256;隐藏层二256,128; 隐藏层三128,64; 输出层64,10
#我们用自定义Module实现隐藏层二、隐藏层三。
class practice_Module(nn.Module):
def __init__(self):
super().__init__()
self.lin1 = nn.Linear(256,128)
self.lin2 = nn.Linear(128,64)
nn.init.normal_(self.lin1.weight,std=0.01)
nn.init.normal_(self.lin2.weight,std=0.01)
def forward(self,X):
X = self.lin1(X)
X = F.relu(X)
X = self.lin2(X)
X = F.relu(X)
return X manual_block = practice_Module()
net = nn.Sequential(nn.Flatten(),
nn.Linear(784,256),
nn.ReLU(),
nn.Dropout(0.2),
manual_block,
nn.Dropout(0.3),
nn.Linear(64,10)
) def init_weight(m):
if m == nn.Linear:
nn.init.normal_(m.weight,std=0.01)
return
net.apply(init_weight) loss = torch.nn.CrossEntropyLoss(reduction='none')
trainer = torch.optim.SGD(net.parameters(),lr=0.1)
num_epochs = 20
d2l.train_ch3(net,train_iter,test_iter,loss,num_epochs,trainer)

首先在我们自定义的模块中,初始化函数__init__中定义我们需要的两个层lin1和lin2.上面的代码在抽象的类practice_Module中的初始化函数__init__中进行了参数初始化,也就是说默认情况下用这个类创建的所有对象都会进行这样的默认初始化。

当然,也可以按我们的需要对具体的模块对象进行参数初始化。

然后在forward函数中定义这个模块进行的操作,即先让数据经过线性层lin1,激活,再经过线性层lin2,激活,然后输出。return X语句,return的X值作为输出,就会作为nn.Sequential中的下一层输入。

注意:这里面的前向传播函数名必须是forward,而不能是其他的,改成其他的就会报错:

Module [practice_Module] is missing the required "forward" function

这也是为什么practice_Module类的实例在nn.Sequential中可以自动计算的原因,是因为系统会自动找到该实例中的方法forward并执行。

下面的语句初始化了一个practice_Module类的实例。可以这样理解:practice_Module是一个抽象的网络结构,而manual_block这个实例才是一个具体的我们需要的模型(包含具体参数)。

可以用如下代码对自定义的模块实例进行初始化。这里,nn.init.normal_()可以对nn.Module的子类的某一具体的层进行参数初始化。

在nn.Sequential中加入我们自定义的模块是非常简单的:

init_weight()函数对torch中定义好了的层进行参数初始化:

加入自定义块对fashion_mnist数据集进行softmax分类的更多相关文章

  1. tensorflow 离线使用 fashion_mnist 数据集

    在tensflow中加载 fashion_mnist 数据集时,由于网络原因.可能会长时间加载不到或报错 此时我们可以通过离线的方式加载 1.首先下载数据集:fashion_mnist (下载后解压) ...

  2. 学习笔记TF010:softmax分类

    回答多选项问题,使用softmax函数,对数几率回归在多个可能不同值上的推广.函数返回值是C个分量的概率向量,每个分量对应一个输出类别概率.分量为概率,C个分量和始终为1.每个样本必须属于某个输出类别 ...

  3. 从零和使用mxnet实现softmax分类

    1.softmax从零实现 from mxnet.gluon import data as gdata from sklearn import datasets from mxnet import n ...

  4. 器学习算法(六)基于天气数据集的XGBoost分类预测

    1.机器学习算法(六)基于天气数据集的XGBoost分类预测 1.1 XGBoost的介绍与应用 XGBoost是2016年由华盛顿大学陈天奇老师带领开发的一个可扩展机器学习系统.严格意义上讲XGBo ...

  5. tensorflow 使用 5 mnist 数据集, softmax 函数

    用于分类  softmax 函数 手写数据识别:

  6. softmax分类算法原理(用python实现)

    逻辑回归神经网络实现手写数字识别 如果更习惯看Jupyter的形式,请戳Gitthub_逻辑回归softmax神经网络实现手写数字识别.ipynb 1 - 导入模块 import numpy as n ...

  7. 动手学深度学习7-从零开始完成softmax分类

    获取和读取数据 初始化模型参数 实现softmax运算 定义模型 定义损失函数 计算分类准确率 训练模型 小结 import torch import torchvision import numpy ...

  8. 利用keras自带路透社数据集进行多分类训练

    import numpy as np from keras.datasets import reuters from keras import layers from keras import mod ...

  9. 用MATLAB的Classficiation Learner工具箱对12个数据集进行各种分类与验证

    准备材料 以所有的特征集作为variable进行像Bayes吖.SVM吖.决策树吖......分类.同时对数据进行预处理,选出相关度高的特征子集作为新的一组data进行分类(预处理的代码不必放出来). ...

  10. 机器学习-MNIST数据集使用二分类

    一.二分类训练MNIST数据集练习 %matplotlib inlineimport matplotlibimport numpy as npimport matplotlib.pyplot as p ...

随机推荐

  1. esp8266 I2C 实例解析及源码分析

    一  前言 作为一个方案商兼芯片开发者,研究芯片和功能实现除了基本的工作需要,还有一层就是也变成了一种职业习惯.从芯片到方案,发现很多方案公司的人水平都比较堪忧,只会调用api,根本不会看底层的代码实 ...

  2. Linux DISPLAY环境变量的妙用(error:QXcbConnection: Could not connect to display) ,xhost 命令, 通过ssh连接显示界面

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...

  3. Linux常用指令2

    1.系统常用命令 1)在文件中查找内容 grep >grep  hello passwd //在passwd文件中搜索hello内容,会把hello所在行的内容打印到终端显示 2)查看系统中活跃 ...

  4. drf(视图组件)

    一. 前言 Django REST framwork 提供的视图的主要作用 1. 控制序列化器的执行(检验.保存.转换数据) 2. 控制数据库查询的执行 二. 两个视图基类 两个视图基类: APIVi ...

  5. 初探修模的三维模型OBJ格式轻量化压缩的遇到常见问题与处理方法

    初探修模的三维模型OBJ格式轻量化压缩的遇到常见问题与处理方法 在对经过修模的三维模型进行OBJ格式轻量化压缩处理的过程中,可能会遇到一些常见问题.以下是一些常见问题以及相应的处理方法: 1.顶点丢失 ...

  6. Java 22正式发布,一文了解全部新特性

    就在昨晚,Java 22正式发布!该版本提供了 12 项功能增强,其中包括 7 项预览功能和 1 项孵化器功能.它们涵盖了对 Java 语言.API.性能以及 JDK 中包含的工具的改进. 下面就来一 ...

  7. 记录--HTML问题:如何实现分享URL预览?

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 1. 需求分析 为了提高用户对页面链接分享的体验,需要对分享链接做一些处理. 以 Telegram(国外某一通讯软件) 为例,当在 Tel ...

  8. drools中使用function

    一.背景 当我们在drools中编写规则时,有些时候存在重复的代码,那么我们是否可以将这些重复代码抽取出来,封装成一个function来调用呢?那么在drools中如何自定义function? 二.需 ...

  9. C#调用C++ (使用C++/CLI)

    简介 C++/CLI(C++ Common Language Infrastructure)是一种允许在 .NET 平台上创建托管代码(managed code)和非托管代码(unmanaged co ...

  10. 鸿蒙HarmonyOS实战-ArkUI组件(GridRow/GridCol)

    一.GridRow/GridCol 1.概述 栅格布局是一种通用的辅助定位工具,可以帮助开发人员解决多尺寸多设备的动态布局问题.通过将页面划分为等宽的列数和行数,栅格布局提供了可循的规律性结构,方便开 ...