https://blog.csdn.net/weixin_44791964/article/details/102748770
用AlexNet网络构建一个图像分类模型
看了无数遍也记不住的 padding 的计算方法:
def AlexNet(input_shape=(224, 224, 3), output_shape=4):
model = Sequential()
model.add(
Conv2D(
filters=96,
kernel_size=(11,11),
strides=(4,4),
padding='valid',
input_shape=input_shape,
activation='relu'
)
)
model.add(BatchNormalization())
model.add(
MaxPooling2D(
pool_size=(3, 3),
strides=(2, 2),
padding='valid'
)
)
model.add(
Conv2D(
filters=128,
kernel_size=(5,5),
strides=(1,1),
padding='same',
activation='relu'
)
)
model.add(BatchNormalization())
model.add(
MaxPooling2D(
pool_size=(3,3),
strides=(2,2),
padding='valid'
)
)
model.add(
Conv2D(
filters=192,
kernel_size=(3,3),
strides=(1,1),
padding='same',
activation='relu'
)
)
model.add(
Conv2D(
filters=192,
kernel_size=(3,3),
strides=(1,1),
padding='same',
activation='relu'
)
)
model.add(
Conv2D(
filters=128,
kernel_size=(3,3),
strides=(1,1),
padding='same',
activation='relu'
)
)
model.add(
MaxPooling2D(
pool_size=(3,3),
strides=(2,2),
padding='valid'
)
)
model.add(Flatten())
model.add(Dense(1024, activation='relu'))
model.add(Dropout(0.25))
model.add(Dense(1024, activation='relu'))
model.add(Dropout(0.25))
model.add(Dense(output_shape, activation='softmax'))
model.summary()
return model
首先将原始图像resize成(224, 224, 3)
然后是一系列卷积、BN、最大池化的操作:
11×11的卷积核,步长为4,padding = ‘valid’,卷积操作输出结果shape为(54, 54, 96)
经过BN归一化,输出shape为(54, 54, 96)
经过最大池化,池化卷积核大小为3×3,步长为2,padding = ‘valid’,池化的结果为
(26, 26, 96)
5×5的卷积核,步长为1,padding= ‘same’,卷积操作输出结果shape为(26, 26, 128)
经过BN归一化,输出shape为(26, 26, 128)
经过最大池化,池化卷积核大小为3×3,步长为2,padding = ‘valid’,池化结果为
(12, 12, 128)
3×3卷积核,步长为1,padding = ‘same’, 卷积操作输出shape为(12, 12, 192)
3×3卷积核,步长为1, padding = ‘same’, 卷积操作输出shape为(12, 12, 192)
3×3卷积核, 步长为1,padding = ‘same’, 卷积操作输出shape为(12, 12, 128)
经过最大池化,池化卷积核大小为3×3,步长为2,padding = ‘valid’, 池化结果为
(5, 5, 128)
把输出的神经元平铺,全连接层将输出的神经元缩减为1024;使用relu激活函数,还有dropout = 0.25
全连接层输出神经数为1024;使用relu激活函数,dropout = 0.25
最后增加一个全连接层,输出的神经元数和分类的总类别数相等,用softmax分类器
用于训练和测试的图像数据分成4类,(B007, IR007, Normal, OR007@3)。
要生成一个.txt文件用于存放每张图片对应的文件名和标签
文件名和标签之间的分隔符是 “;”
在训练过程中首先读取.txt文件中每一行,每一行都代表一个文件和它对应的标签。将图片数据顺序打乱,把图片格式的数据转化成能够输入到模型的格式。
90%的数据用于训练,10%的数据用于验证。
使用AlexNet模型。
这里我训练了50个epoch,每3个epoch保存一次模型;
定义学习率下降的方式是:acc三次不下降就下降学习率继续训练;
一个batch大小为128,即每次输入128张图片;
最后保存模型Alex_model.h5
只训练了50个epoch准确率不高
predict.py
读取AlexNet模型,读取训练好的权重,输入一张测试集中的图片,输出预测结果:
代码链接:链接:https://pan.baidu.com/s/1WP9wMqZPDizErcDpO4Ni8g
提取码:8qde
感谢
https://blog.csdn.net/weixin_44791964/article/details/102748770
你以为的顿悟其实是别人的基本功