机器学习-数据科学库-day3

人工智能43

机器学习-数据科学库-day3

*
- @[TOC](机器学习-数据科学库-day3)
* numpy学习
*
- 什么是numpy
- numpy创建数组(矩阵)
-
+ numpy中常见的更多数据类型
+ 数据类型的操作
+ 数组的形状
+ 练习
+ 数组和数的计算
+ 数组和数组的计算
+ 广播原则
+ 轴(axis)
+
* 二维数组的轴
* 三维数组的轴
- 数组的切片
-
+ numpy读取数据
+ numpy读取和存储数据
+ numpy中的转置
+ numpy索引和切片
+ numpy中数值的修改
+ numpy中布尔索引
+ numpy中三元运算符
+ numpy中的clip(裁剪)
+
* 练习
+ numpy中的nan和inf
+ numpy中的nan的注意点
+ numpy中常用统计函数
+ ndarry缺失值填充均值
+ 动手练习
- 数组的拼接
-
+ 数组的竖直和水平拼接
+ 数组的行列交换
+ 动手练习
- numpy更多好用的方法
- numpy生成随机数
-
+ 分布的补充
+ numpy的注意点copy和view
- day2 & day3 小结:

numpy学习

什么是numpy

一个在Python中做科学计算的基础库,重在数值计算,也是大部分PYTHON科学计算库的基础库,多用于在大型、多维数组上执行数值运算

numpy创建数组(矩阵)

机器学习-数据科学库-day3

; numpy中常见的更多数据类型

机器学习-数据科学库-day3

数据类型的操作

机器学习-数据科学库-day3

; 数组的形状

机器学习-数据科学库-day3
机器学习-数据科学库-day3

练习


import numpy as np
import random

t1=np.array([1,2,3,4,5])
print(t1)
print(type(t1))

t2=np.array(range(10))
print(t2)
print(type(t2))

t3=np.arange(1,10,2)
print(t3)
print(type(t3))
print(t3.dtype)
print("*"*20)

t4=np.array(range(1,4),dtype="f8")
print(t4)
print(t4.dtype)

t5=np.array([1,1,0,0,1,0,1],dtype=bool)
print(t5)
print(t5.dtype)

t6=t5.astype("int8")
print(t6)
print(t6.dtype)

t7=np.array([random.random() for i in range(10)])
print(t7)
print(t7.dtype)

t8=np.round(t7,2)
print(t8)
print(t8.dtype)

print(np.arange(0,10).reshape(2,5))

运行结果:

C:\ANACONDA\python.exe C:/Users/Lenovo/PycharmProjects/Code/day02/page58.py
[1 2 3 4 5]
<class 'numpy.ndarray'>
[0 1 2 3 4 5 6 7 8 9]
<class 'numpy.ndarray'>
[1 3 5 7 9]
<class 'numpy.ndarray'>
int32
********************
[1. 2. 3.]
float64
[ True  True False False  True False  True]
bool
[1 1 0 0 1 0 1]
int8
[0.53470254 0.68531382 0.08348858 0.55545799 0.21017324 0.92818368
 0.20948581 0.89012421 0.35591318 0.06539644]
float64
[0.53 0.69 0.08 0.56 0.21 0.93 0.21 0.89 0.36 0.07]
float64
[[0 1 2 3 4]
 [5 6 7 8 9]]

Process finished with exit code 0

数组和数的计算

机器学习-数据科学库-day3

; 数组和数组的计算

机器学习-数据科学库-day3

广播原则

机器学习-数据科学库-day3

; 轴(axis)

在numpy中可以理解为方向,使用0,1,2...数字表示,对于一个一维数组,只有一个0轴,对于2维数组(shape(2,2)),有0轴和1轴,对于三维数组(shape(2,2, 3)),有0,1,2轴

有了轴的概念之后,我们计算会更加方便,比如计算一个2维数组的平均值,必须指定是计算哪个方向上面的数字的平均值

二维数组的轴

机器学习-数据科学库-day3

; 三维数组的轴

机器学习-数据科学库-day3

数组的切片

numpy读取数据

CSV:Comma-Separated Value,逗号分隔值文件
显示:表格状态
源文件:换行和逗号分隔行列的格式化文本,每一行的数据表示一条记录

由于csv便于展示,读取和写入,所以很多地方也是用csv的格式存储和传输中小型的数据,为了方便教学,我们会经常操作csv格式的文件,但是操作数据库中的数据也是很容易的实现的

np.loadtxt(fname,dtype=np.float,delimiter=None,skiprows=0,usecols=None,unpack=False

机器学习-数据科学库-day3

; numpy读取和存储数据

现在这里有一个英国和美国各自youtube1000多个视频的点击,喜欢,不喜欢,评论数量(["views","likes","dislikes","comment_total"])的csv,运用刚刚所学习的只是,我们尝试来对其进行操作

import numpy as np

us_file_path="./youtube_video_data/US_video_data_numbers.csv"
gb_file_path="./youtube_video_data/GB_video_data_numbers.csv"

t1=np.loadtxt(us_file_path,delimiter=",",dtype="int")
t2=np.loadtxt(us_file_path,delimiter=",",dtype="int",unpack=True)

print(t1)
print("*"*100)
print(t2)

运行结果:

C:\ANACONDA\python.exe C:/Users/Lenovo/PycharmProjects/Code/day03/page74.py
[[4394029  320053    5931   46245]
 [7860119  185853   26679       0]
 [5845909  576597   39774  170708]
 ...

 [ 142463    4231     148     279]
 [2162240   41032    1384    4737]
 [ 515000   34727     195    4722]]
****************************************************************************************************
[[4394029 7860119 5845909 ...  142463 2162240  515000]
 [ 320053  185853  576597 ...    4231   41032   34727]
 [   5931   26679   39774 ...     148    1384     195]
 [  46245       0  170708 ...     279    4737    4722]]

Process finished with exit code 0

numpy中的转置

转置是一种变换,对于numpy中的数组来说,就是在对角线方向交换数据,目的也是为了更方便的去处理数据

机器学习-数据科学库-day3

.transpose, .T, .swapaxes(1,0)
这三种方法都可以实现二维数组的转置的效果,大家能够看出来,转置和交换轴的效果一样

机器学习-数据科学库-day3


import numpy as np

t2=np.arange(24).reshape(4,6)

t3=t2.transpose()
t4=t2.T
t5=t2.swapaxes(1,0)

print(t2)
print("*"*100)
print(t3)
print("*"*100)
print(t4)
print("*"*100)
print(t5)

运行结果:

C:\ANACONDA\python.exe C:/Users/Lenovo/PycharmProjects/Code/day03/test-transpose.py
[[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]
 [12 13 14 15 16 17]
 [18 19 20 21 22 23]]
****************************************************************************************************
[[ 0  6 12 18]
 [ 1  7 13 19]
 [ 2  8 14 20]
 [ 3  9 15 21]
 [ 4 10 16 22]
 [ 5 11 17 23]]
****************************************************************************************************
[[ 0  6 12 18]
 [ 1  7 13 19]
 [ 2  8 14 20]
 [ 3  9 15 21]
 [ 4 10 16 22]
 [ 5 11 17 23]]
****************************************************************************************************
[[ 0  6 12 18]
 [ 1  7 13 19]
 [ 2  8 14 20]
 [ 3  9 15 21]
 [ 4 10 16 22]
 [ 5 11 17 23]]

Process finished with exit code 0

numpy索引和切片

对于刚刚加载出来的数据,如果只想选择其中的某些列(行)

机器学习-数据科学库-day3

机器学习-数据科学库-day3

; numpy中数值的修改

机器学习-数据科学库-day3

numpy中布尔索引

机器学习-数据科学库-day3

; numpy中三元运算符

机器学习-数据科学库-day3

numpy中的clip(裁剪)

机器学习-数据科学库-day3

; 练习


t1=np.arange(44).reshape(11,4)
print(t1[2])
print("*"*100)

print(t1[2:])
print("*"*100)

print(t1[[2,8,10]])
print("*"*100)

print(t1[:,1])

print(t1[:,2:])

print(t1[:,[0,2]])

a= t1[2,3]
print(a)
print(type(a))

b=t1[2:5,1:4]
print(b)
print(type(b))

c=t1[[0,2,2],[0,1,3]]
print(c)

t8=np.arange(24).reshape(4,6)
print(t8)
print(t8<10)
t8[t8<10]=0
print(t8)

print(np.where(t80,100,300))

运行结果:

C:\ANACONDA\python.exe C:/Users/Lenovo/PycharmProjects/Code/day03/page74.py
[ 8  9 10 11]
****************************************************************************************************
[[ 8  9 10 11]
 [12 13 14 15]
 [16 17 18 19]
 [20 21 22 23]
 [24 25 26 27]
 [28 29 30 31]
 [32 33 34 35]
 [36 37 38 39]
 [40 41 42 43]]
****************************************************************************************************
[[ 8  9 10 11]
 [32 33 34 35]
 [40 41 42 43]]
****************************************************************************************************
[ 1  5  9 13 17 21 25 29 33 37 41]
[[ 2  3]
 [ 6  7]
 [10 11]
 [14 15]
 [18 19]
 [22 23]
 [26 27]
 [30 31]
 [34 35]
 [38 39]
 [42 43]]
[[ 0  2]
 [ 4  6]
 [ 8 10]
 [12 14]
 [16 18]
 [20 22]
 [24 26]
 [28 30]
 [32 34]
 [36 38]
 [40 42]]
11
<class 'numpy.int32'>
[[ 9 10 11]
 [13 14 15]
 [17 18 19]]
<class 'numpy.ndarray'>
[ 0  9 11]
[[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]
 [12 13 14 15 16 17]
 [18 19 20 21 22 23]]
[[ True  True  True  True  True  True]
 [ True  True  True  True False False]
 [False False False False False False]
 [False False False False False False]]
[[ 0  0  0  0  0  0]
 [ 0  0  0  0 10 11]
 [12 13 14 15 16 17]
 [18 19 20 21 22 23]]
[[100 100 100 100 100 100]
 [100 100 100 100 300 300]
 [300 300 300 300 300 300]
 [300 300 300 300 300 300]]

Process finished with exit code 0

numpy中的nan和inf

nan(NAN,Nan):not a number表示不是一个数字

什么时候numpy中会出现nan:
当我们读取本地的文件为float的时候,如果有缺失,就会出现nan
当做了一个不合适的计算的时候(比如无穷大(inf)减去无穷大)

inf(-inf,inf):infinity,inf表示正无穷,-inf表示负无穷

什么时候回出现inf包括(-inf,+inf)
比如一个数字除以0,(python中直接会报错,numpy中是一个inf或者-inf)

那么如何指定一个nan或者inf呢?注意他们的type类型

机器学习-数据科学库-day3

; numpy中的nan的注意点

机器学习-数据科学库-day3

numpy中常用统计函数

求和:t.sum(axis=None)
均值:t.mean(a,axis=None) 受离群点的影响较大
中值:np.median(t,axis=None)
最大值:t.max(axis=None)
最小值:t.min(axis=None)
极值:np.ptp(t,axis=None) 即最大值和最小值只差
标准差:t.std(axis=None)

机器学习-数据科学库-day3

对于axis的设置,默认返回多维数组的全部的统计结果,如果指定axis则返回一个当前轴上的结果

; ndarry缺失值填充均值


import numpy as np

def fill_ndarray(t1):

    for i in range(t1.shape[1]):
        temp_col=t1[:,i]
        nan_num=np.count_nonzero(temp_col!=temp_col)
        if nan_num!=0:

            temp_not_nan_col=temp_col[temp_col==temp_col]

            temp_col[np.isnan(temp_col)]=temp_not_nan_col.mean()

    return t1

if __name__=="__main__":
    t1 = np.arange(12).reshape(3, 4).astype("float")

    t1[1, 2:] = np.nan
    print(t1)
    fill_ndarray(t1)
    print(t1)

运行结果:

C:\ANACONDA\python.exe C:/Users/Lenovo/PycharmProjects/Code/day03/page87.py
[[ 0.  1.  2.  3.]
 [ 4.  5. nan nan]
 [ 8.  9. 10. 11.]]
[[ 0.  1.  2.  3.]
 [ 4.  5.  6.  7.]
 [ 8.  9. 10. 11.]]

Process finished with exit code 0

动手练习

英国和美国各自youtube1000的数据结合之前的matplotlib绘制出各自的评论数量的直方图


import numpy as np
from matplotlib import pyplot as plt

us_file_path = "./youtube_video_data/US_video_data_numbers.csv"
uk_file_path = "./youtube_video_data/GB_video_data_numbers.csv"

t_us=np.loadtxt(us_file_path,delimiter=",",dtype="int")

t_us_comment=t_us[:,-1]

t_us_comment=t_us_comment[t_us_comment5000]

print(t_us_comment.max(),t_us_comment.min())

d=50

bin_nums = (t_us_comment.max()-t_us_comment.min())//d

plt.figure(figsize=(12,8),dpi=80)

plt.hist(t_us_comment,bin_nums)

plt.show()

print(t_us_comment)
print(bin_nums)

运行结果:

4995 0
[   0 3040 1071 ...  279 4737 4722]
99

机器学习-数据科学库-day3

希望了解英国的youtube中视频的评论数和喜欢数的关系,应该如何绘制改图


import numpy as np
from matplotlib import pyplot as plt

us_file_path = "./youtube_video_data/US_video_data_numbers.csv"
uk_file_path = "./youtube_video_data/GB_video_data_numbers.csv"

t_uk=np.loadtxt(uk_file_path,delimiter=",",dtype="int")

t_uk=t_uk[t_uk[:,1]500000]

t_uk_comment=t_uk[:,-1]
t_uk_like=t_uk[:,1]

plt.figure(figsize=(20,8),dpi=80)

plt.scatter(t_uk_like,t_uk_comment)

plt.show()

运行结果:

机器学习-数据科学库-day3

数组的拼接

数组的竖直和水平拼接

机器学习-数据科学库-day3

; 数组的行列交换

机器学习-数据科学库-day3

动手练习

现在我们希望在保留国家信息(每个数据的国家来源)的同时,一起研究和分析前一案例中两国的数据方法。我们该怎么办?

[En]

Now we hope to study and analyze the data methods of the two countries in the previous case together, while retaining the information of the country (the national source of each data). What should we do?


import numpy as np
import day03

us_file_path = "../day03/youtube_video_data/US_video_data_numbers.csv"
uk_file_path = "../day03/youtube_video_data/GB_video_data_numbers.csv"

us_data=np.loadtxt(us_file_path,delimiter=",",dtype="int")
uk_data=np.loadtxt(uk_file_path,delimiter=",",dtype="int")

zero_data=np.zeros((us_data.shape[0],1)).astype(int)
ones_data=np.ones((uk_data.shape[0],1)).astype(int)

us_data=np.hstack((us_data,zero_data))
uk_data=np.hstack((uk_data,ones_data))

final_data=np.vstack((us_data,uk_data))
print(final_data)

运行结果:

C:\ANACONDA\python.exe C:/Users/Lenovo/PycharmProjects/Code/day04/page94.py
[[4394029  320053    5931   46245       0]
 [7860119  185853   26679       0       0]
 [5845909  576597   39774  170708       0]
 ...

 [ 109222    4840      35     212       1]
 [ 626223   22962     532    1559       1]
 [  99228    1699      23     135       1]]

Process finished with exit code 0

numpy更多好用的方法

1.获取最大值最小值的位置
np.argmax(t,axis=0)
np.argmin(t,axis=1)
2.创建一个全0的数组: np.zeros((3,4))
3.创建一个全1的数组:np.ones((3,4))
4.创建一个对角线为1的正方形数组(方阵):np.eye(3)

numpy生成随机数

机器学习-数据科学库-day3

; 分布的补充

1.均匀分布:在相同的大小范围内的出现概率是等可能的

机器学习-数据科学库-day3

2.正态分布:呈钟型,两头低,中间高,左右对称
机器学习-数据科学库-day3

import numpy as np

np.random.seed(6)
t=np.random.randint(0,20,(3,4))
print(t)

运行结果:

[[10  9  3 10]
 [13 15 10 16]
 [ 1 11 13 15]]

numpy的注意点copy和view

  1. a=b 完全不复制,a和b相互影响
  2. a =b[:],视图的操作,一种切片,会创建新的对象a,但是a的数据完全由b保管,他们两个的数据变化是一致的,
  3. a =b.copy(),复制,a和b互不影响

day2 & day3 小结:

机器学习-数据科学库-day3
机器学习-数据科学库-day3

Original: https://blog.csdn.net/weixin_47049321/article/details/124185278
Author: weixin_47049321
Title: 机器学习-数据科学库-day3



相关阅读

Title: 图像分类篇——AlexNet详解

一、概述

AlexNet是由2012年ImageNet竞赛参赛者Hinton和他的学生Alex Krizhevsky设计的。AlexNet在当年赢得了ImageNet图像分类竞赛的冠军,使得CNN成为图像分类问题的核心算法模型,同时引发了神经网络的应用热潮。
1. AlexNet的创新
作为具有历史意义的网络结构,AlexNet包含以下方面的创新。
(1)非线性激活函数 ReLU
在AlexNet出现之前,sigmoid是最为常用的非线性激活函数。sigmoid函数能够把输入的连续实值压缩到0和1之间。但是,它的缺点也非常明显:当输入值非常大或者非常小的时候会出现饱和现象,即这些神经元的梯度接近0,因此存在梯度消失问题。为了解决这个问题,AlexNet使用ReLU作为激活函数。
ReLU函数的表达式为F(x)=max(0,z)。若输入小于0,那么输出为0;若输入大于0,那么输出等于输入。由于导数始终是1,会使得计算量有所减少,且AlexNet的作者在实验中证明了,ReLU 函数的收敛速度要比sigmoid 函数和 tanh函数快。
(2)局部响应归一化
局部响应归一化(local response normalization,LRN)的思想来源于生物学中的"侧抑制",是指被激活的神经元抑制相邻的神经元。采用LRN的目的是,将数据分布调整到合理的范围内,便于计算处理,从而提高泛化能力。虽然ReLu函数对较大的值也有很好的处理效果,但AlexNet的作者仍然采用了LRN的方式。式3.7是Hinton在有关AlexNet的论文中给出的局部响应归一化公式。

机器学习-数据科学库-day3

a表示第i个卷积核在(x,y)处经卷积、池化、ReLU函数计算后的输出,相当于该卷积核提取的局部特征。N表示这一层的卷积核总数;n表示在同一位置的临近卷积核的个数,是预先设定的;k、alpha、beta均为超参数。假设N=20,超参数和n按照论文中的设定,分别为k=2、alpha=10-4、beta=0.75、n=5。第5个卷积核在(x,y)处提取了特征,的作用就是以第5个卷积核为中心,选取前后各5/2=2个(取整,因此n所指个数包含中心卷积核)卷积核,因此有max=3和min=7,卷积核个数就是3、4、5、6、7。
通过分析公式,我们对局部响应归一化的理解会进一步加深。式3.7的存在,使得每个局部特征最后都会被缩小(只是缩小的比例不同),相当于进行了范围控制。一旦在某个卷积核周围提取的特征比它自己提取的特征的值大,那么该卷积核提取的特征就会被缩小。相反,如果在该卷积核周围提取的特征比它自己提取的特征的值小,那么该卷积核提取的特征被缩小的比例就会变小,最终的值与周围的卷积核提取的特征值相比就显得比较大了。
(3) dropout
        dropout通过设置好的概率随机将某个隐藏层神经元的输出设置为0,因此这个神经元将不参与前向传播和反向传播,在下一次迭代中会根据概率重新将某个神经元的输出置0。这样一来,在每次迭代中都能够尝试不同的网络结构,通过组合多个模型的方式有效地减少过拟合。
(4)多GPU训练
        单个GPU的内存限制了网络的训练规模。采用多GPU协同训练,可以大大提高AlexNet的训练速度。

二、AlexNet的结构

下面介绍AlexNet的结构。如图所示,由于采用双GPU协同训练,该网络结构图分为上下两部分,且两个GPU只在特定的层内通信。该模型一共分为8层,包括5个卷积层和3个全连接层,每个卷积层都包含激活函数ReLU、池化和LRN处理。

机器学习-数据科学库-day3

AlexNet架构 层类型特征图大小内核步幅填充激活OUT全连接-1000---ReLUF10全连接-4096---ReLUF9全连接-4096---ReLUs8最大池化25666332valid-C7卷积2561313551sameReLUC6卷积3841313551sameReLUC5卷积3841313551sameReLUS4最大池化2561313332valid-C3卷积2562727551sameReLUS2最大池化962727332valid-C1卷积96555511114validReLUIn输入3(RGB)227*227----

(1)Layer1卷积层
该层接收227×227×3(R、G、B三个通道)的输入图像,使用96个大小为11×11×3的卷积核进行特征提取,步长为1,扩充值为0,通过式3.1可以得到输出特征图的尺寸。由于使用了双GPU,图3.13中的每个GPU处理的卷积核的数量均为48个。卷积后,得到大小为55×55×96的特征图。
对得到的特征图,使用ReLU函数将它的值限定在合适的范围内,然后使用3×3的滤波器进行步长为2的池化操作,得到27×27×96的特征图。最后,进行归一化处理,规模不变。
(2)Layer 2卷积层
Layer 2与Layer 1相似,它接收Layer 1输出的27×27×96的特征图,采用256个5×5×96的卷积核,步长为1,扩充值为2,边缘用0填充,生成27×27×256的特征图。紧随其后的是与Layer 1相同的ReLU函数和池化操作,最后进行归一化处理。
(3) Layer3卷积层与Layer 4卷积层
Layer3和Layer4也采用了卷积层,但只进行卷积和ReLU。不进行池化和归一化操作。Layer3的每个GPU都有192个卷积核,每个卷积核的尺寸是3×3×256.步长为1,扩充值为1,边缘用0填充。最终,每个GPU都生成的个13×13的特征图。
Layer 4与Layer3的区别在于卷积核的尺寸。Layer4不像Layer3那样接收的一层所有GPU的输入,而只接收所在GPU的输出。因此,Layer 4的卷积核的尺寸为3×3×192,每个GPU都有192个卷积核。
与Layer 3相同的是,Layer 4仍然进行扩充值为1的0填充,且步长为1。最终,Layer 4的每个GPU都生成192个13×13的特征图。卷积后,这两个层都会由ReLU函数进行处理。
(4)Layer 5卷积层
Layer 5会依次进行卷积、ReLU和池化操作,但不进行归一化操作。该层中的每个GPU都接收本GPU中 Layer 4的输出,每个GPU使用128个3×3×192的卷积核,步长为1,使用扩充值为1的0填充,各自生成128个13×13的特征图后进行池化操作。池化尺寸为3×3,步长为2,最终生成6×6×128的特征图(两个GPU,共256个)。
(5)Layer 6全连接层
从该层开始,后面的网络层均为全连接层。Layer 6仍然按GPU进行卷积,每个GPU使用2048个6×6×256的卷积核,这意味着该层中的每个GPU都会接收前一层中两个GPU 的输出。卷积后,每个GPU都会生成2048个1×1的特征图。最后,进行ReLU和dropout操作,两个GPU共输出4096个值。
(6)Layer 7全连接层
Layer7与Layer6相似,与Layer6进行全连接,在进行ReLU和dropout操作后,共输出4096个值。
(7)Layer 8全连接层
Layer 8只进行全连接操作,且该层拥有1000个神经元,最终输出1000个float型的值(该值即为预测结果)。

三、构建AlexNet

构建LRN层

LRN层通常用lambda层进行包装,参数一般设置如下:

model.add(keras.layers.lambdas(lambda x: tf.nn.lrn(x, depth_radius=2, alpha=0.00002, beta=0.75, bias=1)))

也可以用自定义层实现:

class LRN(keras.layers.Layer):
    def __init__(self, depth_radius=2, bias=1, alpha=0.00002, beta=0.75, **kwargs):
        super().__init__(**kwargs)
        self.depth_radius = depth_radius
        self.bias = bias
        self.alpha = alpha
        self.beta = beta

    def call(self, input):
        return tf.nn.lrn(input, self.depth_radius, self.bias, self.alpha, self.beta)

    def get_config(self):
        base_config = super().get_config()
        return {**base_config, 'depth_radius': self.depth_radius,
                'bias': self.bias, 'alpha': self.alpha, 'beta': self.beta}

构建模型:

model = keras.Sequential()
# &#x7B2C;&#x4E00;&#x5C42;
model.add(keras.layers.Conv2D(filters=96, kernel_size=(11,11), strides=(4,4), input_shape=(227,227,3), padding="VALID", activation="relu"))
model.add(LRN())
model.add(keras.layers.MaxPooling2D(pool_size=(3,3), strides=(2,2), padding="same"))
# &#x7B2C;&#x4E8C;&#x5C42;
model.add(keras.layers.Conv2D(filters=256, kernel_size=(5,5), strides=(1,1), padding="SAME", activation="relu"))
model.add(LRN())
model.add(keras.layers.MaxPooling2D(pool_size=(3,3), strides=(2,2), padding="same"))
# &#x7B2C;&#x4E09;&#x5C42;
model.add(keras.layers.Conv2D(filters=384, kernel_size=(5,5), strides=(1,1), padding="SAME", activation="relu"))
# &#x7B2C;&#x56DB;&#x5C42;
model.add(keras.layers.Conv2D(filters=384, kernel_size=(5,5), strides=(1,1), padding="SAME", activation="relu"))
# &#x7B2C;&#x4E94;&#x5C42;
model.add(keras.layers.Conv2D(filters=256, kernel_size=(5,5), strides=(1,1), padding="SAME", activation="relu"))
model.add(keras.layers.MaxPooling2D(pool_size=(3,3), strides=(2,2), padding="same"))
# &#x7B2C;&#x516D;&#x5C42;
model.add(keras.layers.Flatten())
model.add(keras.layers.Dense(4096, activation="relu"))
model.add(keras.layers.Dropout(0.5))
# &#x7B2C;&#x4E03;&#x5C42;
model.add(keras.layers.Dense(4096, activation="relu"))
model.add(keras.layers.Dropout(0.5))
# &#x7B2C;&#x516B;&#x5C42;
model.add(keras.layers.Dense(10, activation="softmax"))

注:LRN层也可用BatchNormalization替代,性能也还OK

Original: https://blog.csdn.net/qq_52053775/article/details/124377926
Author: 樱花的浪漫
Title: 图像分类篇——AlexNet详解

相关文章
iptables防火墙原理详解 人工智能

iptables防火墙原理详解

Netfilter是由Rusty Russell提出的Linux 2.4内核防火墙框架,该框架既简洁又灵活,可实现安全策略应用中的许多功能,如数据包过滤、数据包处理、地址伪装、透明代理、动态网络地址转...
YoloV7——配置YOLOV7(一) 人工智能

YoloV7——配置YOLOV7(一)

yolov7 文章目录 yolov7 前言 一、下载源代码 二、配置环境 * 1.设置虚拟环境 2.配置环境 3.设置权重文件 4.实验现象 总结 前言 yolov7已经发布一段时间了,今天来体验一下...