1. 搭建Alexnet网络模型
from tensorflow.keras.layers import *
from tensorflow.keras.models import *
from tensorflow.keras.optimizers import *
from tensorflow.keras.utils import *
import os
def alexnet(include_top=True,weights=None,
input_shape=None,pooling=None,classes=1000):
"""使用tf.keras functional api构建alexnet模型
# Arguments
include_top:是否包含网络最后的3层全连接层,默认为包含。
weights:选择预训练权重,默认'None'为随机初始化权重。
input_shape:输入的尺寸,应该是一个元组,当include_top设为True时默认为(224,224,3),否则应当被
定制化,因为输入图像的尺寸会影响到全连接层参数的个数。
pooling:指定池化方式。
classes:类别数量。
# Returns
返回一个tf.keras model实例。
# Raises
ValueError:由于不合法的参数会导致相应的异常。
"""
# 检测weights参数是否合法
if weights != None and not os.path.exists(weights):
raise ValueError("the input of weights is not valid")
input_ = tf.keras.Input(shape=input_shape)
# first layer
net = Conv2D(96,11,strides=4,padding='valid',activation='relu',name='conv_1')(input_)
net = BatchNormalization(axis=1)(net)
net = MaxPooling2D(pool_size=3,strides=2,padding='same',name='maxpool_1')(net)
# second layer
net = Conv2D(256,5,strides=1,padding='same',activation='relu',name='conv_2')(net)
net = BatchNormalization(axis=1)(net)
net = MaxPooling2D(3,2,padding='valid',name='maxpool_2')(net)
# third layer
net = Conv2D(384,3,strides=1,padding='same',activation='relu',name='conv_3')(net)
# forth and fifth layer
net = Conv2D(384,3,strides=1,padding='same',activation='relu',name='conv_4')(net)
net = Conv2D(256,3,strides=1,padding='same',activation='relu',name='conv_5')(net)
net = MaxPooling2D(3,2,padding='valid',name='maxpool3')(net)
if include_top:
net = Flatten(name='flatten')(net)
net = Dense(4096, activation='relu', name='fc1')(net)
net = Dropout(0.5,name='dropout_1')(net)
net = Dense(4096, activation='relu', name='fc2')(net)
net = Dropout(0.5,name='dropout_2')(net)
net = Dense(classes, activation='softmax', name='predictions')(net)
else:
if pooling == 'avg':
net = GlobalAveragePooling2D()(net)
elif pooling == 'max':
net = GlobalMaxPooling2D()(net)
model = tf.keras.Model(input_, net, name='alexnet')
# 加载权重
if weights != None:
model.load_weights(weights)
print("Loading weigths from "+weights+" finished!")
return model
本部分完整代码:
alexnet.py
2. 数据预处理
# 处理数据
train_datagen = ImageDataGenerator(
rotation_range = 40,width_shift_range = 0.2,height_shift_range = 0.2, rescale = 1/255,shear_range = 20,
zoom_range = 0.2,horizontal_flip = True,fill_mode = 'nearest',)
test_datagen = ImageDataGenerator(rescale = 1/255,) # 数据归一化
batch_size = 32
# train_data
train_generator = train_datagen.flow_from_directory(
'01_tf_keras/sequential_model/data/cat_vs_dog/train',
target_size=(150,150),
batch_size=batch_size)
# test_data
test_generator = test_datagen.flow_from_directory(
'01_tf_keras/sequential_model/data/cat_vs_dog/test',
target_size=(150,150),
batch_size=batch_size )
3.Callbacks
# callbacks
# Tensorboard
log_dir = './tensorboard'
if not os.path.exists(log_dir):
os.makedirs(log_dir)
tb_callback = Tensorboad(log_dir)
# 保存最优模型权重
model_name='alexnet_model.h5'
save_best_model_callback = ModelCheckPoint(model_name,save_best_only=True)
# early stopping
early_stopping_callback = EarlyStopping(patience=5,min_delta=1e-3)
callbacks = [tb_callback,save_best_model_callback,early_stopping_callback]