pytorch简单实现神经网络功能
作者:那小子真混蛋 发布时间:2022-02-21 23:29:49
标签:pytorch,神经网络
一、基本
(1)利用pytorch建好的层进行搭建
import torch
from torch import nn
from torch.nn import functional as F
#定义一个MLP网络
class MLP(nn.Module):
'''
网络里面主要是要定义__init__()、forward()
'''
def __init__(self):
'''
这里定义网络有哪些层(比如nn.Linear,Conv2d……)[可不含激活函数]
'''
super().__init__()#调用Module(父)初始化
self.hidden = nn.Linear(5,10)
self.out = nn.Linear(10,2)
def forward(self,x):
'''
这里定义前向传播的顺序,即__init__()中定义的层是按怎样的顺序进行连接以及传播的[在这里加上激活函数,以构造复杂函数,提高拟合能力]
'''
return self.out(F.relu(self.hidden(x)))
上面的3层感知器可以用于解决一个简单的现实问题:给定5个特征,输出0-1类别概率值,是一个简单的2分类解决方案。
搭建一些简单的网络时,可以用nn.Sequence(层1,层2,……,层n)一步到位:
import torch
from torch import nn
from torch.nn import functional as F
net = nn.Sequential(nn.Linear(5,10),nn.ReLU(),nn.Linear(10,2))
但是nn.Sequence仅局限于简单的网络搭建,而自定义网络可以实现复杂网络结构。
(1)中定义的MLP大致如上(5个输入->全连接->ReLU()->输出)
(2)使用网络
import torch
from torch import nn
from torch.nn import functional as F
net = MLP()
x = torch.randn((15,5))#15个samples,5个输入属性
out = net(x)
#也可调用forward->"out = net.forward(x)"
print(out)
#print(out.shape)
tensor([[-0.0760, -0.1026],
[-0.3277, -0.2332],
[-0.0314, -0.1921],
[ 0.0131, -0.1473],
[-0.0650, -0.2310],
[ 0.3009, -0.5510],
[ 0.1491, -0.0928],
[-0.1438, -0.1304],
[-0.1945, -0.1944],
[ 0.1088, -0.2249],
[ 0.0016, -0.2334],
[ 0.1401, -0.3709],
[-0.1864, -0.1764],
[ 0.0775, -0.0160],
[ 0.0150, -0.3198]], grad_fn=<AddmmBackward>)
二、进阶
(1)构建较复杂的网络结构
a. Sequence、net套娃
import torch
from torch import nn
from torch.nn import functional as F
class MLP2(nn.Module):
def __init__(self):
super().__init__()
self.net = nn.Sequential(nn.Linear(5,10),nn.ReLU(),nn.Linear(10,5))
self.out = nn.Linear(5,4)
def forward(self,x):
return self.out(F.relu(self.net(x)))
net2 = nn.Sequential(MLP2(),nn.ReLU(),nn.Linear(4,2))
net2.eval()
# eval()等价print(net2)
Sequential(
(0): MLP2(
(net): Sequential(
(0): Linear(in_features=5, out_features=10, bias=True)
(1): ReLU()
(2): Linear(in_features=10, out_features=5, bias=True)
)
(out): Linear(in_features=5, out_features=4, bias=True)
)
(1): ReLU()
(2): Linear(in_features=4, out_features=2, bias=True)
)
(2) 参数
a. 权重、偏差的访问
#访问权重和偏差
print(net2[2].weight)#注意weight是parameter类型,.data访问数值
print(net2[2].bias.data)
#输出所有权重、偏差
print(*[(name,param) for name,param in net2[2].parameters()])
b. 不同网络之间共享参数
shared = nn.Linear(8,8)
net = nn.Sequential(nn.Linear(5,8),nn.ReLU(),shared,nn.ReLU(),shared)
print(net[2].weight.data[0])
net[2].weight.data[0][0] = 100
print(net[2].weight.data[0][0])
print(net[2].weight.data[0] == net[4].weight.data[0])
net.eval()
c. 参数初始化
def init_Linear(m):
if type(m) == nn.Linear:
nn.init.normal_(m.weight,mean = 0,std = 0.01) #将权重按照均值为0,标准差为0.01的正态分布进行初始化
nn.init.zeros_(m.bias) #将偏差置为0
def init_const(m):
if type(m) == nn.Linear:
nn.init.constant_(m.weight,42) #将权重全部置为42
def my_init(m):
if type(m) == nn.Linear:
'''
对weight和bias自定义初始化
'''
pass
#如何调用?
net2.apply(init_const) #在net2中进行遍历,对每个Linear执行初始化
(3)自定义层(__init__()中可含输入输出层)
a. 不带输入输出的自定义层(输入输出一致,x数进,x数出,对每个值进行相同的操作,类似激活函数)
b. 带输入输出的自定义层
import torch
from torch import nn
from torch.nn import functional as F
#a
class decentralized(nn.Module):
def __init__(self):
super().__init__()
def forward(self,x):
return x-x.mean()
#b
class my_Linear(nn.Module):
def __init__(self,dim_in,dim_out):
super().__init__()
self.weight = nn.Parameter(torch.ones(dim_in,dim_out)) #由于x行数为dim_out,列数为dim_in,要做乘法,权重行列互换
self.bias = nn.Parameter(torch.randn(dim_out))
def forward(self,x):
return F.relu(torch.matmul(x,self.weight.data)+self.bias.data)
tmp = my_Linear(5,3)
print(tmp.weight)
(4)读写
#存取任意torch类型变量
x = torch.randn((20,20))
torch.save(x,'X') #存
y = torch.load('X') #取
#存储网络
torch.save(net2.state_dict(),'Past_parameters') #把所有参数全部存储
clone = nn.Sequential(MLP2(),nn.ReLU(),nn.Linear(4,2)) #存储时同时存储网络定义(网络结构)
clone.load_state_dict(torch.load('Past_parameters'))
clone.eval()
来源:https://www.cnblogs.com/BGM-WCJ/p/16695133.html
0
投稿
猜你喜欢
- 一、在django后台处理1、将django的setting中的加入django.contrib.messages.middleware.M
- 一、概念1. Pinia => PiniaPinia(发音为/pi?nj?/,如英语中的“pe
- GO的条件变量一、条件变量与互斥锁条件变量是基于互斥锁的,它必须基于互斥锁才能发挥作用;条件变量并不是用来保护临界区和共享资源的,它是用来协
- 将程序转换为exe文件我们先来介绍如何使用工具Pyinstaller安装Pyinstaller我们用pip安装Pyinstaller 。注意
- <!--#include file="admin_Checkuser.asp"--> <%
- Vue.js 的核心是一个允许采用简洁的模板语法来声明式的将数据渲染进 DOM,也就是将模板中的文本数据写进DOM中,使用 {{
- 如下所示:import numpynew_list = [i for i in range(9)]numpy.array(new_list)
- 常用的转换函数是 cast 和 convert,用于把表达式得出的值的类型转换成另一个数据类型,如果转换失败,该函数抛出错误,导致整个事务回
- 数据库对于服务端开发人员来说,几乎就是左膀右臂。几乎每一个服务端开发人员都要和数据库打交道。而MySQL又以其开源免费,小巧玲珑,简单易用,
- 前沿最近开始学习python了,由于要简单处理一下图片,奈何能C++力太差,openCV上手有点难,想学习一下py简单的处理一下图片就好了。
- 一旦你已经为MySQL实例管理器设置了一个密码文件并且IM正在运行,你可以连接它。你可以使用mysql客户端工具通过标准MySQL API来
- Django教程Python下有许多款不同的 Web 框架。Django是重量级选手中最有代表性的一位。许多成功的网站和APP都基于Djan
- 前言:open()函数的定义:def open(file, mode='r', buffering=None, encodi
- 1. 实验目的掌握最小二乘法求解(无惩罚项的损失函数)、掌握加惩罚项(2 范数)的损失函数优化、梯度下降法、共轭梯度法、理解过拟合、克服过拟
- SQL Server推荐使用 SET 而不是 SELECT 对变量进行赋值。当表达式返回一个值并对一个变量进行赋值时,推荐使用 SET 方法
- 最早大家都没有给链接加title的习惯,后来因为w3c标准普及,又集体加上了title。从一个极端走到另个极端,于是出现很多怪异现象。两方面
- 与数据库交互的基本语言是sql,数据库每次解析和执行sql语句多需要执行很多步骤。以sql server为例,当数据库收到一条查询语句时,语
- mybatis数据库排序今天用到了对数据库按照倒序进行输出。因为刚接触mybatis,所以对这方面还不是太了解,再网上搜了好长时间终于找到了
- 问:怎样解决MySQL 5.0.16的乱码问题?答:MySQL 5.0.16的乱码问题可以用下面的方法解决:1.设置phpMyAdminLa
- 目录1、read_sql_query 读取 mysql2、to_sql 写入数据库 要实现 pandas 对 mysql 的读写需