神经网络实现猫狗识别笔记
Published in:2020-06-20 |

神经网络实现猫狗识别

神经网络实现猫狗识别

  • 卷积神经网络
  • 卷积
1
2
3
4
1. 就是一种运算,是一种矩阵降维的运算
2. 为了解决卷积运算中,中心元素的运算比重远大于边缘元素的情况,补白
补白可以降低中间元素参与运算的比重。
3. 步长
  • 池化
1
2
3
4
1. 最大池化层:
选取一个过滤器去过滤出一个区域的最大值
2. 平均池化层
选取一个过滤器去过滤出一个区域的平均值

AlexNet

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
227 * 227 * 3
1. 卷积池化层
卷积:96个卷积核,卷积核大小11 * 11 * 3,步长为4,补白为0
池化:最大池化层,过滤器的大小是3 * 3 ,步长为2
2. 卷积池化层
卷积:256个卷积核,卷积核大小5 * 5 * 3,步长为1,补白为2
池化:最大池化层,过滤器大小3 * 3 ,步长为2
3. 卷积层
卷积:384个卷积核,卷积核大小3 * 3 * 3 ,步长为1,补白为1
4. 卷积层
卷积:384个卷积核,卷积核大小3 * 3 * 3,步长为1,补白为1
5. 卷积池化层
卷积:256个卷积核,卷积核大小3 * 3 * 3,步长为1,补白为1
池化:最大池化层,过滤器大小3 * 3,步长为2
6. 全连接层
4096个神经元,激活函数ReLu
7. 全连接层
4096个神经元,激活函数ReLu
8. 全连接层
2个神经元

Keras

1
Keras本身是封装了TensorFlow的一个高阶框架,支持快速实验。
1
2
3
安装,如果安装了TensorFlow,在安装keras的时候可能会出错,把TensorFlow都有东西全部删除。
直接pip install keras就可以了

1
2
3
4
5
6
7
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# @Time : 2020/6/15 8:34 
# @Author : XX
# @File : 猫狗识别.py
# @Software: PyCharm
import os
import cv2
import numpy as np
from keras.models import Sequential
from keras.layers import Conv2D,MaxPool2D,Dense,Flatten
from keras.utils import np_utils
import keras.losses as losses

# 1. 读取数据
def load_datas(dir_path):
# 构建特征矩阵和目标向量
datas = []
y = []
for image_name in os.listdir(dir_path):
# 读取图片,构建特征矩阵
datas.append(cv2.resize(cv2.imread(os.path.join(dir_path, image_name)),(227,227)))
# 构建目标向量
if image_name.split('.')[0]=='cat':
y.append(1)
else:
y.append(0)
# 对y进行独热(ont-hot)编码
# y = np_utils.to_categorical(y)
return np.array(datas),np.array(y)


def create_model(X,Y):
# 1. 构建一个序列模型(空壳)
# 卷积层:filters:卷积核个数,kernel_size卷积核大小,strides步长,padding补白
# 池化层:pool_size过滤器大小,strides步长
# 全连接层Dense:units神经元个数,activation激活函数
model = Sequential()
# 1. 卷积池化层
# 卷积:96个卷积核,卷积核大小11 * 11 * 3,步长为4,补白为0
model.add(Conv2D(filters=96,kernel_size=(11,11),strides=(4,4)))
# 池化:最大池化层,过滤器的大小是3 * 3 ,步长为2
model.add(MaxPool2D(pool_size=(3,3),strides=(2,2)))
# 2. 卷积池化层
# 卷积:256个卷积核,卷积核大小5 * 5 * 3,步长为1,补白为2
model.add(Conv2D(filters=256,kernel_size=(5,5),padding='same'))
# 池化:最大池化层,过滤器大小3 * 3 ,步长为2
model.add(MaxPool2D(pool_size=(3,3),strides=(2,2)))
# 3. 卷积层
# 卷积:384个卷积核,卷积核大小3 * 3 * 3 ,步长为1,补白为1
model.add(Conv2D(filters=384,kernel_size=(3,3)))
# 4. 卷积层
# 卷积:384个卷积核,卷积核大小3 * 3 * 3,步长为1,补白为1
model.add(Conv2D(filters=384,kernel_size=(3,3)))
# 5. 卷积池化层
# 卷积:256个卷积核,卷积核大小3 * 3 * 3,步长为1,补白为1
model.add(Conv2D(filters=256,kernel_size=(3,3)))
# 池化:最大池化层,过滤器大小3 * 3,步长为2
model.add(MaxPool2D(pool_size=(3,3),strides=(2,2)))
# 6. 全连接层
# 4096个神经元,激活函数ReLu
model.add(Flatten())
model.add(Dense(units=4096,activation='relu'))
# 7. 全连接层
# 4096个神经元,激活函数ReLu
model.add(Dense(units=4096, activation='relu'))
# 8. 全连接层
# 2个神经元,激活函数使用sigmoid或者softmax
model.add(Dense(units=2, activation='softmax'))
# 对模型进行编译
model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])
model.fit(X,Y,epochs=50)


if __name__ == '__main__':
# 不要用中文路径!!!!!
dir_path = r'G:\AI\kaggle\train2'
X,Y = load_datas(dir_path)
X = X/255
create_model(X,Y)


Prev:
Python练习
Next:
数据可视化分析笔记