pytorch7-多层感知机

多层神经网络

在这里插入图片描述


对应的矩阵计算公式如下:
W h , b h W_h,b_h Wh,bh表示第一层权重和偏移
W o , b o W_o,b_o Wo,bo表示第二层权重和偏移
H = X W h + b h H=XW_h+b_h H=XWh+bh
O = H W o + b o O=HW_o+b_o O=HWo+bo
也就是将隐藏层的输出直接作为输出层的输入。如果将以上两个式子联立起来,可以得到
O = ( X W h + b h ) W o + b o = X W h W o + b h W o + b o O=(XW_h+b_h)W_o+b_o=XW_h W_o +b_h W_o +b_o O=(XWh+bh)Wo+bo=XWhWo+bhWo+bo

激活函数

ReLU 激活函数

R e L U ( x ) = m a x ( x , 0 ) ReLU (x)=max(x,0) ReLU(x)=max(x,0)

import torch
import numpy as np
import matplotlib.pylab as plt
import sys
sys.path.append("..")
import d2lzh_pytorch as d2l
def xyplot(x_vals, y_vals, name):
	d2l.set_figsize(figsize=(5, 2.5))
	d2l.plt.plot(x_vals.detach().numpy(), y_vals.detach().numpy())
	d2l.plt.xlabel('x')
	d2l.plt.ylabel(name + '(x)')
x=torch.arange(-8.0,8.0,0.1,requires_grad=True)
y=x.relu()
xyplot(x,y,'relu')

函数图像
在这里插入图片描述


y.sum().backward()
xyplot(x, x.grad, 'grad of relu')

梯度图 在这里插入图片描述


sigmoid 函数

s i g m o i d ( x ) = 1 1 + e x p ( − x ) sigmoid(x)=\frac {1}{1+exp(-x)} sigmoid(x)=1+exp(x)1

在这里插入图片描述


梯度函数
s i g m o i d ′ ( x ) = s i g m o i d ( x ) ( 1 − s i g m o i d ( x ) ) sigmoid'(x)=sigmoid(x)(1-sigmoid(x)) sigmoid(x)=sigmoid(x)(1sigmoid(x))
梯度图像

在这里插入图片描述


tanh函数

tanh(双曲正切)函数可以将元素的值变换到(-1)到1之间
t a n h ( x ) = 1 − e x p ( − 2 x ) 1 + e x p ( − 2 x ) tanh(x)=\frac{1-exp(-2x)}{1+exp(-2x)} tanh(x)=1+exp(2x)1exp(2x)
在这里插入图片描述


梯度函数
t a n h ′ ( x ) = 1 − t a n h 2 ( x ) tanh'(x)=1-tanh^2(x) tanh(x)=1tanh2(x)
梯度图像
在这里插入图片描述


多层感知机

H = ψ ( X W h + b h ) H=\psi(XW_h+b_h) H=ψ(XWh+bh)
O = H W o + b o O=HW_o+b_o O=HWo+bo
ψ 代 表 多 层 感 知 机 的 激 活 函 数 , 我 们 可 以 在 最 后 的 输 出 上 添 加 损 失 函 数 , S O F T M A X 等 \psi 代表多层感知机的激活函数,我们可以在最后的输出上添加损失函数,SOFTMAX等 ψSOFTMAX

多层感知机从零开始实现

import torch
import numpy as np
import sys
sys.path.append("..")
batch_size=256
train_iter, test_iter = load_data_fashion_mnist(batch_size)

# Fashion-MNIST数据集中的图像形状为28x28=784,我们定义最后的输出格式为10
num_inputs, num_outputs, num_hiddens = 784, 10, 256
W1 = torch.tensor(np.random.normal(0, 0.01, (num_inputs,num_hiddens)), dtype=torch.float)
b1 = torch.zeros(num_hiddens, dtype=torch.float)
W2 = torch.tensor(np.random.normal(0, 0.01, (num_hiddens,num_outputs)), dtype=torch.float)
b2 = torch.zeros(num_outputs, dtype=torch.float)
params = [W1, b1, W2, b2]
param.requires_grad_(requires_grad=True)

# 下面定义激活函数
def relu(x):
	return torch.max(input=X, other=torch.tensor(0.0))

# 定义模型
def net(X):
	X = X.view((-1, num_inputs))
	H = relu(torch.matmul(X, W1) + b1)
	return torch.matmul(H, W2) + b2

# 定义损失函数 
loss = torch.nn.CrossEntropyLoss()

# 训练模型
def train_ch3(net,train_iter,test_iter,
              loss,num_epochs,batch_size,
              params=None,lr=None,optimizer=None):
	for epoch in range(num_epochs):
		train_l_sum,train_acc_sum,n=0.0,0.0,0
		for X,y in train_iter:
			y_hat=net(X)
			l=loss(y_hat,y).sum()
			
			#梯度请零
			if optimizer is not None:
				optimizer.zero_grad()
			elif params in not None and params[0] is not None:
				for param in params:
					param.grad.data.zero_()
			l.backward()
			if optimizer in None:
				sgd(params,lr,batch_size)
			else:
				optimizer.step()
			train_l_sum +=l.item()
			train_acc_sum +=(y_hat.argmax(dim=1)==y).sum().item()
			n+=y.shape[0]
		test_acc=evaluate_accuracy(test_iter,net)
		print('epoch %d, loss %.4f, train acc %.3f, test acc %.3f'%(epoch + 1,train_l_sum / n,train_acc_sum / n,test_acc))
	
num_epochs,lr=5,100.0

train_ch3(net,train_iter,test_iter,loss,num_epochs,batch_size,params,lr)

多层感知机的简洁实现

import torch
from torch import nn
from torch.nn import init
import numpy as np
import sys
sys.path.append("..")
import d2lzh_pytorch as d2l

# 模型定义
num_inputs,num_outpus,num_hiddens=784,10,256

class FlattenLayer(nn.Module):
	def __init__(self)L
		super(FlattenLayer,self).__init__()
	def forward(self,x):
		return x.view(x.shape[0],-1)
 
net=nn.Sequential(
	FlattenLayer(),
	nn.Linear(num_inputs,num_hiddens),
	nn.ReLU(),
	nn.Linear(num_hiddens,num_outputs),)

for params in net.parameters():
	init.normal_(params,mean=0,std=0.01)

# 读取数据并训练模型
batch_size = 256
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size)
loss = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(net.parameters(), lr=0.5)
num_epochs = 5
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs,batch_size, None, None, optimizer)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用PyTorch实现多层感知机(Multilayer Perceptron, MLP)是一种常见的神经网络模型。下面是一个简单的示例代码: ```python import torch import torch.nn as nn # 定义多层感知机模型 class MLP(nn.Module): def __init__(self, input_size, hidden_size, output_size): super(MLP, self).__init__() self.fc1 = nn.Linear(input_size, hidden_size) # 第一层全连接层 self.relu = nn.ReLU() # 激活函数 self.fc2 = nn.Linear(hidden_size, output_size) # 第二层全连接层 def forward(self, x): out = self.fc1(x) out = self.relu(out) out = self.fc2(out) return out # 创建模型实例 input_size = 784 # 输入大小,MNIST数据集的图片大小为28x28=784 hidden_size = 256 # 隐藏层大小 output_size = 10 # 输出大小,MNIST数据集有10个类别 model = MLP(input_size, hidden_size, output_size) # 定义损失函数和优化器 criterion = nn.CrossEntropyLoss() # 交叉熵损失函数 optimizer = torch.optim.SGD(model.parameters(), lr=0.01) # 随机梯度下降优化器 # 训练模型 num_epochs = 10 # 训练轮数 for epoch in range(num_epochs): for images, labels in train_loader: # 遍历训练数据集 images = images.reshape(-1, 28*28) # 将图片展平为向量 outputs = model(images) # 前向传播 loss = criterion(outputs, labels) # 计算损失 optimizer.zero_grad() # 梯度清零 loss.backward() # 反向传播 optimizer.step() # 更新参数 # 使用模型进行预测 with torch.no_grad(): correct = 0 total = 0 for images, labels in test_loader: # 遍历测试数据集 images = images.reshape(-1, 28*28) outputs = model(images) _, predicted = torch.max(outputs.data, 1) # 获取预测结果 total += labels.size(0) correct += (predicted == labels).sum().item() accuracy = correct / total print('Accuracy: {:.2f}%'.format(accuracy * 100)) ```

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值