赞
踩
深度学习(Deep learning)是机器学习的一个分支,核心思想是通过多层次的特征提取,自动学习数据的复杂模式和潜在规律。它利用多层次的神经网络结构来学习数据的表示和抽象。相比传统的浅层机器学习模型,深度学习模型具有多个隐藏层,能够自动学习数据的复杂模式和潜在规律。
深度学习的产生,主要有以下几个背景原因:
深度学习之所以被称为"深度学习",主要有以下几个原因:
深度学习适用于处理各种非结构化的数据类型,主要包括以下几种:
一般来说,深度学习的数据处理流程包括以下几个主要步骤:
import torch.nn as nn
import torch.nn.functional as F
class CNN(nn.Module):
def __init__(self):
super(CNN, self).__init__()
self.conv1 = nn.Conv2d(in_channels=1, out_channels=6, kernel_size=5)
self.pool1 = nn.MaxPool2d(kernel_size=2, stride=2)
self.conv2 = nn.Conv2d(in_channels=6, out_channels=16, kernel_size=5)
self.pool2 = nn.MaxPool2d(kernel_size=2, stride=2)
self.fc1 = nn.Linear(in_features=16 * 5 * 5, out_features=120)
self.fc2 = nn.Linear(in_features=120, out_features=84)
self.fc3 = nn.Linear(in_features=84, out_features=10)
def forward(self, x):
x = self.pool1(F.relu(self.conv1(x)))
x = self.pool2(F.relu(self.conv2(x)))
x = x.view(-1, 16 * 5 * 5)
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3(x)
return x
import torch.nn as nn
class RNN(nn.Module):
def __init__(self, input_size, hidden_size, num_layers, output_size):
super(RNN, self).__init__()
self.hidden_size = hidden_size
self.num_layers = num_layers
self.rnn = nn.RNN(input_size, hidden_size, num_layers, batch_first=True)
self.fc = nn.Linear(hidden_size, output_size)
def forward(self, x):
# 初始化隐藏状态
h0 = torch.zeros(self.num_layers, x.size(0), self.hidden_size)
# 通过 RNN 层
out, _ = self.rnn(x, h0)
# 通过全连接层
out = self.fc(out[:, -1, :])
return out
*GAN 是一种用于生成新数据样本的深度学习模型,如图像、文本、语音等。
import torch.nn as nn
import torch.optim as optim
import torch.utils.data
class Generator(nn.Module):
def __init__(self, latent_dim, output_dim):
super(Generator, self).__init__()
self.main = nn.Sequential(
nn.Linear(latent_dim, 256),
nn.LeakyReLU(0.2, inplace=True),
nn.Linear(256, 512),
nn.LeakyReLU(0.2, inplace=True),
nn.Linear(512, output_dim),
nn.Tanh()
)
def forward(self, z):
return self.main(z)
class Discriminator(nn.Module):
def __init__(self, input_dim):
super(Discriminator, self).__init__()
self.main = nn.Sequential(
nn.Linear(input_dim, 512),
nn.LeakyReLU(0.2, inplace=True),
nn.Linear(512, 256),
nn.LeakyReLU(0.2, inplace=True),
nn.Linear(256, 1),
nn.Sigmoid()
)
def forward(self, x):
return self.main(x)
主要包括以下几个关键组件:
import torch
import torch.nn as nn
import math
class MultiHeadAttention(nn.Module):
def __init__(self, d_model, num_heads):
super().__init__()
self.d_model = d_model
self.num_heads = num_heads
self.d_k = d_model // num_heads
self.linear_q = nn.Linear(d_model, d_model)
self.linear_k = nn.Linear(d_model, d_model)
self.linear_v = nn.Linear(d_model, d_model)
self.linear_out = nn.Linear(d_model, d_model)
def forward(self, q, k, v, mask=None):
batch_size = q.size(0)
q = self.linear_q(q).view(batch_size, -1, self.num_heads, self.d_k)
k = self.linear_k(k).view(batch_size, -1, self.num_heads, self.d_k)
v = self.linear_v(v).view(batch_size, -1, self.num_heads, self.d_k)
q = q.transpose(1, 2)
k = k.transpose(1, 2)
v = v.transpose(1, 2)
scores = torch.matmul(q, k.transpose(-2, -1)) / math.sqrt(self.d_k)
if mask is not None:
scores = scores.masked_fill(mask == 0, -1e9)
attn = nn.Softmax(dim=-1)(scores)
context = torch.matmul(attn, v)
context = context.transpose(1, 2).contiguous().view(batch_size, -1, self.d_model)
output = self.linear_out(context)
return output
class FeedForward(nn.Module):
def __init__(self, d_model, d_ff, dropout=0.1):
super().__init__()
self.linear1 = nn.Linear(d_model, d_ff)
self.dropout = nn.Dropout(dropout)
self.linear2 = nn.Linear(d_ff, d_model)
def forward(self, x):
x = self.linear1(x)
x = nn.functional.relu(x)
x = self.dropout(x)
x = self.linear2(x)
return x
class EncoderLayer(nn.Module):
def __init__(self, d_model, num_heads, d_ff, dropout=0.1):
super().__init__()
self.self_attn = MultiHeadAttention(d_model, num_heads)
self.feed_forward = FeedForward(d_model, d_ff, dropout)
self.norm1 = nn.LayerNorm(d_model)
self.norm2 = nn.LayerNorm(d_model)
self.dropout1 = nn.Dropout(dropout)
self.dropout2 = nn.Dropout(dropout)
def forward(self, x, mask):
attn_output = self.self_attn(x, x, x, mask)
x = x + self.dropout1(attn_output)
x = self.norm1(x)
ff_output = self.feed_forward(x)
x = x + self.dropout2(ff_output)
x = self.norm2(x)
return x
class Transformer(nn.Module):
def __init__(self, src_vocab_size, tgt_vocab_size, d_model, num_heads, num_layers, d_ff, dropout=0.1):
super().__init__()
self.src_embed = nn.Embedding(src_vocab_size, d_model)
self.tgt_embed = nn.Embedding(tgt_vocab_size, d_model)
self.pos_encode = PositionalEncoding(d_model, dropout)
self.encoder = nn.ModuleList([EncoderLayer(d_model, num_heads, d_ff, dropout) for _ in range(num_layers)])
self.linear = nn.Linear(d_model, tgt_vocab_size)
def forward(self, src, tgt, src_mask, tgt_mask):
src = self.src_embed(src)
tgt = self.tgt_embed(tgt)
src = self.pos_encode(src)
tgt = self.pos_encode(tgt)
for layer in self.encoder:
src = layer(src, src_mask)
output = self.linear(src)
return output
这个代码实现了一个基本的 Transformer 模型,包括多头注意力机制、前馈网络、层归一化和位置编码等关键组件。实际应用中,你可能还需要根据具体任务进行一些修改和优化。
下面是一个基于 DARTS(Differentiable Architecture Search) 算法的 NAS 代码实例:
import torch
import torch.nn as nn
import torch.nn.functional as F
from collections import namedtuple
Genotype = namedtuple('Genotype', 'normal normal_concat reduce reduce_concat')
def _criterion(logits, target):
return F.cross_entropy(logits, target)
class MixedOp(nn.Module):
def __init__(self, C, stride):
super(MixedOp, self).__init__()
self.op1 = nn.Conv2d(C, C, 3, stride, 1, bias=False)
self.bn1 = nn.BatchNorm2d(C)
self.op2 = nn.Conv2d(C, C, 5, stride, 2, bias=False)
self.bn2 = nn.BatchNorm2d(C)
self.op3 = nn.MaxPool2d(3, stride, 1)
self.op4 = nn.AvgPool2d(3, stride, 1)
self.op5 = nn.Identity()
def forward(self, x, weights):
return sum(w * op(x) for w, op in zip(weights, [self.op1, self.op2, self.op3, self.op4, self.op5]))
class Cell(nn.Module):
def __init__(self, genotype, C_prev_prev, C_prev, C, reduction, reduction_prev):
super(Cell, self).__init__()
if reduction_prev:
self.preprocess0 = FactorizedReduce(C_prev_prev, C)
else:
self.preprocess0 = ReLUConvBN(C_prev_prev, C, 1, 1, 0)
self.preprocess1 = ReLUConvBN(C_prev, C, 1, 1, 0)
if reduction:
op_names, indices = zip(*genotype.reduce)
concat = genotype.reduce_concat
else:
op_names, indices = zip(*genotype.normal)
concat = genotype.normal_concat
self._compile(C, op_names, indices, concat, reduction)
def _compile(self, C, op_names, indices, concat, reduction):
self._steps = len(op_names) // 2
self._concat = concat
self.multiplier = len(concat)
self._ops = nn.ModuleList()
for name, index in zip(op_names, indices):
stride = 2 if reduction and index < 2 else 1
op = MixedOp(C, stride)
self._ops += [op]
def forward(self, s0, s1, weights):
s0 = self.preprocess0(s0)
s1 = self.preprocess1(s1)
states = [s0, s1]
for i in range(self._steps):
h1 = states[indices[2*i]]
h2 = states[indices[2*i+1]]
op1 = self._ops[2*i]
op2 = self._ops[2*i+1]
h1 = op1(h1, weights[2*i])
h2 = op2(h2, weights[2*i+1])
s = h1 + h2
states += [s]
return torch.cat([states[i] for i in self._concat], dim=1)
class Network(nn.Module):
def __init__(self, C, num_classes, layers, criterion, genotype):
super(Network, self).__init__()
self._layers = layers
self.stem = nn.Sequential(
nn.Conv2d(3, C, 3, padding=1, bias=False),
nn.BatchNorm2d(C)
)
C_prev_prev, C_prev, C_curr = C, C, C
self.cells = nn.ModuleList()
reduction_prev = False
for i in range(layers):
if i in [layers//3, 2*layers//3]:
C_curr *= 2
reduction = True
else:
reduction = False
cell = Cell(genotype, C_prev_prev, C_prev, C_curr, reduction, reduction_prev)
reduction_prev = reduction
self.cells += [cell]
C_prev_prev, C_prev = C_prev, cell.multiplier*C_curr
self.global_pooling = nn.AdaptiveAvgPool2d(1)
self.classifier = nn.Linear(C_prev, num_classes)
self.criterion = criterion
def forward(self, input, architect_weights):
s0 = s1 = self.stem(input)
for i, cell in enumerate(self.cells):
s0, s1 = s1, cell(s0, s1, architect_weights[i])
out = self.global_pooling(s1)
out = self.classifier(out.view(out.size(0), -1))
return out
class Architecture(nn.Module):
def __init__(self, C, num_classes, layers, criterion):
super(Architecture, self).__init__()
self._C = C
self._num_classes = num_classes
self._layers = layers
self._criterion = criterion
self.network = Network(C, num_classes, layers, criterion, None)
self.architect_weights = nn.Parameter(torch.Tensor(sum(2 * i + 1 for i in range(self._layers)), 5))
self.reset_parameters()
def reset_parameters(self):
nn.init.kaiming_uniform_(self.architect_weights, a=math.sqrt(5))
def forward(self, input, target):
architect_weights = F.softmax(self.architect_weights, dim=-1)
logits = self.network(input, architect_weights)
return self._criterion(logits, target)
这个代码实现了一个基于 DARTS 算法的神经网络架构搜索模型。主要包含以下几个关键组件:
MixedOp: 定义了五种基本的卷积和池化操作,并使用权重来动态组合它们。
Cell: 定义了一个搜索单元,包括预处理层和多个 MixedOp 层。
Network: 定义了整个网络架构,由多个 Cell 组成。
Architecture: 定义了整个 NAS 模型,包括网络结构和架构参数。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。