11_ Callbacks实践-Alexnet猫狗识别

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]

猜你喜欢

转载自blog.csdn.net/PecoHe/article/details/105102109
今日推荐