特征图计算大小公式:
# 特征图 = (N + 2 * p -F) / S + 1
# 特征图 = (输入图像大小 + padding大小 * 2 - 卷积核) / 步长 + 1
# N 输入图像大小
# P padding大小
# F 卷积核大小
# S 步长
CNN网络
# 网络:
# 100*100*3 输入图像大小
# 3*3 Conv(向量卷积运算)
# relu 激活函数
# Pooling 1/2 池化 50*50*16
# 3*3 Conv(向量卷积运算)
# relu 激活函数
# Pooling 1/2 池化 25*25*32
# 3*3 Conv(向量卷积运算)
# relu 激活函数
# Pooling 1/2 池化 12*12*64
# Flatten 降维函数 12*12*64 = 9216
# 计算(金字塔原则)全连接:开方(9216 * 类别数3)= 166.27...
# fc(全连接) 166 relu 激活函数
# fc(全连接) 22 relu 激活函数 开方(166*3) = 22.31...
# fc(全连接) 3 sigmoid 激活函数
# 当前输出类型为3
import tensorflow as tf
from tensorflow.keras import layers, Sequential
model = Sequential([
# 2维卷积,卷积核个数16, 卷积核大小3*3, padding='same'按照原大小输出, 设置输入大小, 激活函数选择
layers.Conv2D(16, 3, padding='same', input_shape=(100, 100, 3), activation='relu'),
# 池化
layers.MaxPool2D(),
layers.Conv2D(32, 3, padding='same', activation='relu'),
layers.MaxPool2D(),
layers.Conv2D(64, 3, padding='same', activation='relu'),
layers.MaxPool2D(),
# 转为1维
layers.Flatten(),
# 全连接层:layers.Dense
layers.Dense(166, activation='relu'),
layers.Dense(22, activation='relu'),
# 输出 类别数
layers.Dense(3, activation='sigmoid'),
])