AlexNet:深度卷积神经网络的ImageNet分类


既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新
需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)


在梯度下降优化的反向传播步骤中,tanh激活函数的训练时间大于ReLU激活的训练时间。

实线 - ReLU 虚线 - tanh
ReLU in Numpy
import numpy as np
def ReLU(x):
return abs(x) * (x > 0)
x = np.array([1,-1, -0.5, 0.32])
ReLU(x)
array([1. , 0. , 0. , 0.32])
ReLU in Pytorch
import torch
relu = torch.nn.ReLU()
x = torch.tensor(x) # x = numpy array of [1,-1, -0.5, 0.32]
relu(x)
tensor([1.0000, 0.0000, 0.0000, 0.3200], dtype=torch.float64)
局部响应归一化
Relu具有这种理想的特性,它们不需要输入归一化来防止它们saturating。即使某些训练数据偏好正输入,也会通过ReLU进行学习。然而,局部响应归一化仍然有助于泛化。


Pytorch中的局部响应归一化
import torch.nn as nn
class LRN(nn.Module):
def __init__(self, size, alpha=1e-4, beta=0.75, k=1):
super(LRN, self).__init__()
self.avg = nn.AvgPool3d(kernel_size =(size,1,1), stride=1, padding=int((size-1)/2))
self.alpha = alpha
self.beta = beta
self.k = k
def forward(self, x):
deno = x.pow(2).unsqueeze(1)
deno = self.avg(deno).squeeze(1)
deno = deno.mul(self.alpha).add(self.k).pow(self.beta)
x = x.div(deno)
return x
x = torch.randn( 20,3, 10, 10)
lrn = nn.LocalResponseNorm(2)
lrn(x).size()

torch.Size([20, 3, 10, 10])
深度学习架构
class AlexNet(nn.Module):
def __init__(self, classes=1000):
super(AlexNet, self).__init__()
self.features = nn.Sequential(
nn.Conv2d(3, 64, kernel_size=11, stride=4, padding=2),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=3, stride=2),
nn.Conv2d(64, 192, kernel_size=5, padding=2),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=3, stride=2),
nn.Conv2d(192, 384, kernel_size=3, padding=1),
nn.ReLU(inplace=True),
nn.Conv2d(384, 256, kernel_size=3, padding=1),
nn.ReLU(inplace=True),
nn.Conv2d(256, 256, kernel_size=3, padding=1),
nn.ReLU(inplace=True),
nn.MaxPool2d(kernel_size=3, stride=2),
)
self.classifier = nn.Sequential(
nn.Dropout(),
nn.Linear(256 * 6 * 6, 4096),
nn.ReLU(inplace=True),
nn.Dropout(),
nn.Linear(4096, 4096),
nn.ReLU(inplace=True),
nn.Linear(4096, classes),
)
def forward(self, x):
x = self.features(x)
x = x.view(x.size(0), 256 * 6 * 6)
x = self.classifier(x)
return x

import pylab as plt
x = torch.randn(1, 3, 224, 224).uniform_(0, 1)
im = plt.imshow(x.squeeze().permute(1, 2, 0).numpy())
plt.show()


x = torch.randn(1, 3, 224, 224).uniform_(0, 1)
alexnet = AlexNet()
alexnet(x).size()

torch.Size([1, 1000])
减少过度拟合
数据增强
避免过度拟合的最简单方法是增加机器学习数据大小,以便深度学习模型可以学习更多广义的数据特征。
但是获取更多数据始终不是一件容易的事,因此获取更多数据的方法之一是从给定数据中人为地生成更多数据。


有许多类型的数据增强技术可用
- 翻转(水平和垂直)
- 旋转
- 缩放
- Crop
- 平移
- 高斯噪声
from skimage import io
import matplotlib.pyplot as plt
image = io.imread('https://cdn3.bigcommerce.com/s-nadnq/product_images/uploaded_images/20.jpg')
plt.imshow(image)
plt.grid(False)
plt.axis('off')
plt.show()


import random
from scipy import ndarray
import skimage as sk
from skimage import transform
from skimage import util
def random_rotation(image_array: ndarray):
random_degree = random.uniform(-25, 25)
return sk.transform.rotate(image_array, random_degree)
def random_noise(image_array: ndarray):
return sk.util.random_noise(image_array)
def horizontal_flip(image_array: ndarray):
return image_array[:, ::-1]
def vertical_flip(image_array: ndarray):
return image_array[::-1, :]

Dropout
该技术减少了神经元的复杂共同适应,因为神经元不能依赖于特定其他神经元的存在。因此,它被迫学习更有力的特征,这些特征与其他神经元的许多不同随机子集一起使用是有用的。在测试时,我们使用所有神经元但是将它们的输出乘以0.5,这是采用由exponentially-many dropout网络产生的预测分布的几何平均值的合理近似值。


既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新
需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)
转存中…(img-K5fcbE2x-1715838984112)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新
需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)
更多推荐
所有评论(0)