keras入门(四) ResNet网络 实现猫狗大战 2021-12-17 07:23 374阅读 0赞 先来一张resnet网络结构图,本文采用的是resnet50![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTI2MDE2NDc_size_16_color_FFFFFF_t_70][] 核心思想就是引入skip connect,阻止深层网络的退化。 ![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTI2MDE2NDc_size_16_color_FFFFFF_t_70 1][] import keras from keras import Model, layers from keras.layers import Conv2D, BatchNormalization, Add, MaxPooling2D, AveragePooling2D, Input, Activation, Flatten, \ Dense, GlobalAveragePooling2D, Dropout from keras.callbacks import EarlyStopping from keras.optimizers import SGD import os import argparse import random import numpy as np from scipy.misc import imread, imresize, imsave parser = argparse.ArgumentParser() parser.add_argument('--train_dir', default='F:/kaggle/train/') parser.add_argument('--test_dir', default='F:/kaggle/test/') parser.add_argument('--log_dir', default='./') parser.add_argument('--batch_size', default=32) parser.add_argument('--gpu', type=int, default=0) args = parser.parse_args() os.environ['CUDA_VISIBLE_DEVICES'] = str(args.gpu) type_list = ['cat', 'dog'] def identity_block(input, stage, filters): conv_name = 'cn' + str(stage) + '_branch' bais_name = 'bn' + str(stage) + '_branch' input_short_cut = input filter1, filter2, filter3 = filters input = Conv2D(filter1, (1, 1), strides=(1, 1), padding='same', name=conv_name + '_one')(input) input = BatchNormalization(name=bais_name + "_one_BN")(input) input = Activation("relu")(input) input = Conv2D(filter2, (3, 3), strides=(1, 1), padding='same', name=conv_name + '_two')(input) input = BatchNormalization(name=bais_name + "_two_BN")(input) input = Activation("relu")(input) input = Conv2D(filter3, (1, 1), strides=(1, 1), padding='same', name=conv_name + '_three')(input) input = BatchNormalization(name=bais_name + "_three_BN")(input) input = Add()([input, input_short_cut]) input = Activation("relu")(input) return input def convolutional_block(input, stage, strides, filters): conv_name = 'cn' + str(stage) + '_branch' bais_name = 'bn' + str(stage) + '_branch' input_short_cut = input filter1, filter2, filter3 = filters input = Conv2D(filter1, (1, 1), strides=strides, padding='same', name=conv_name + '_one')(input) input = BatchNormalization(name=bais_name + "_one_BN")(input) input = Activation('relu')(input) input = Conv2D(filter2, (3, 3), strides=(1, 1), padding='same', name=conv_name + '_two')(input) input = BatchNormalization(name=bais_name + "_two_BN")(input) input = Activation('relu')(input) input = Conv2D(filter3, (1, 1), strides=(1, 1), padding='same', name=conv_name + '_three')(input) input = BatchNormalization(name=bais_name + "_three_BN")(input) input_short_cut = Conv2D(filter3, (1, 1), strides=strides, padding='same', name=conv_name + '_four')(input_short_cut) input_short_cut = BatchNormalization(name=bais_name + "_four_BN")(input_short_cut) input = Add()([input, input_short_cut]) input = Activation('relu')(input) return input def ResNet50(input_shape=(224, 224, 3)): input = Input(shape=input_shape) outinput = Conv2D(64, (7, 7), strides=(2, 2), padding='same', name='conv1')(input) outinput = BatchNormalization(name="conv1_BN")(outinput) outinput = Activation("relu")(outinput) outinput = MaxPooling2D(pool_size=(3, 3), strides=(2, 2), name='pool1_1')(outinput) outinput = convolutional_block(outinput, 1, 1, [64, 64, 256]) outinput = identity_block(outinput, 2, [64, 64, 256]) outinput = identity_block(outinput, 3, [64, 64, 256]) outinput = convolutional_block(outinput, 4, 2, [128, 128, 512]) outinput = identity_block(outinput, 5, [128, 128, 512]) outinput = identity_block(outinput, 6, [128, 128, 512]) outinput = identity_block(outinput, 7, [128, 128, 512]) outinput = convolutional_block(outinput, 8, 2, [256, 256, 1024]) outinput = identity_block(outinput, 9, [256, 256, 1024]) outinput = identity_block(outinput, 10, [256, 256, 1024]) outinput = identity_block(outinput, 11, [256, 256, 1024]) outinput = identity_block(outinput, 12, [256, 256, 1024]) outinput = identity_block(outinput, 13, [256, 256, 1024]) outinput = convolutional_block(outinput, 14, 2, [512, 512, 2048]) outinput = identity_block(outinput, 15, [512, 512, 2048]) outinput = identity_block(outinput, 16, [512, 512, 2048]) outinput = GlobalAveragePooling2D(name='avg_pool')(outinput) outinput = (Dropout(0.5))(outinput) #outinput = AveragePooling2D(pool_size=(2, 2), padding="same")(outinput) #outinput = Flatten()(outinput) outinput = Dense(2, activation='softmax')(outinput) model = Model(inputs=input, outputs=outinput, name="ResNet50") return model def create_generate(train_file_list, batch_size, input_size): while (True): random.shuffle(train_file_list) image_data = np.zeros((batch_size, input_size[0], input_size[1], 3), dtype='float32') label_data = np.zeros((batch_size, 1), dtype='int32') for index, file_name in enumerate(train_file_list): image = imresize(imread(args.train_dir + file_name), input_size) label = file_name.split('.')[0] image_data[index % batch_size] = np.reshape(image / 255, (input_size[0], input_size[1], 3)) label_data[index % batch_size] = type_list.index(label) if (0 == (index + 1) % batch_size): # label_data = to_categorical(labei_data, 2) label_data = keras.utils.to_categorical(label_data, 2) yield image_data, label_data image_data = np.zeros((batch_size, input_size[0], input_size[1], 3), dtype='float32') label_data = np.zeros((batch_size, 1), dtype='int32') def train(model): early_stop = EarlyStopping(monitor='val_loss', patience=5, mode='min') tensor_board = keras.callbacks.TensorBoard(log_dir='./logs', histogram_freq=0, batch_size=16, write_graph=True, write_grads=False, write_images=False, embeddings_freq=0, embeddings_layer_names=None, embeddings_metadata=None, embeddings_data=None, update_freq='epoch') sgd = SGD(lr=0.001, decay=1e-8, momentum=0.9, nesterov=True) model.compile(optimizer=sgd, loss='categorical_crossentropy', metrics=['accuracy']) #model.compile(optimizer=sgd, loss='binary_crossentropy', metrics=['accuracy']) train_generate, validation_genarate = prepare_data() model.fit_generator(generator=train_generate, steps_per_epoch=1250 , epochs=30, verbose=1, validation_data=validation_genarate, validation_steps=30, max_queue_size=1, shuffle=True, callbacks=[early_stop, tensor_board]) model.save_weights(args.log_dir + 'model.h5') def predict(model): file_list = os.listdir(args.test_dir) cat_real_count = 0 dog_real_count = 0 cat_predict_count = 0 dog_predict_count = 0 for index, file_name in enumerate(file_list): print(index) label = file_name.split('.')[0] if 'cat' == label: cat_real_count = cat_real_count + 1 else: dog_real_count = dog_real_count + 1 image = imresize(imread(args.test_dir + file_name), (224, 224, 3)) label = model.predict(np.reshape(image / 255, (1, 224, 224, 3))) label = np.argmax(label, 1) if 0 == label: imsave('./result/cat/' + file_name, imread(args.test_dir + file_name)) cat_predict_count = cat_predict_count + 1 else: imsave('./result/dog/' + file_name, imread(args.test_dir + file_name)) dog_predict_count = dog_predict_count + 1 # print(cat_predict_count / cat_real_count) if __name__ == '__main__': try: model = ResNet50() train(model) except Exception as err: print(err) 与VGG相比,在训练过程中能够快速收敛,而且准确率更高,能够达到97%,但是训练过程中遇到了过拟合的问题,验证集上的准确率在70%~80%,怎么调参都无法解决,训练了好几天,没有太多的头绪,等以后有想法了再解决一下 [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTI2MDE2NDc_size_16_color_FFFFFF_t_70]: /images/20211217/9c1e1a5e8c314bf3ac7ebb5c86104b41.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTI2MDE2NDc_size_16_color_FFFFFF_t_70 1]: /images/20211217/e82ec0aaf48a49868c499832e1f1dca9.png
相关 Keras tensorflow Resnet模型 Resnet相关文章整理 1、Keras大法(9)——实现ResNet-34模型 [https://blog.csdn.net/weixin\_42499236/a 小灰灰/ 2022年12月27日 07:26/ 0 赞/ 130 阅读
相关 【图像分类】实战——使用ResNet实现猫狗分类(pytorch) 目录 摘要 导入项目使用的库 设置全局参数 图像预处理 读取数据 设置模型 设置训练和验证 验证 完整代码: -------------------- 青旅半醒/ 2022年10月16日 08:54/ 0 赞/ 139 阅读
相关 猫狗队列题目 源码下载链接:[https://github.com/huijuanl/AlgorithmLearning.git][https_github.com_huijuanl_Alg 桃扇骨/ 2022年05月22日 11:45/ 0 赞/ 126 阅读
相关 keras入门(二) VGG网络实现猫狗大战 上次用keras实现了简单的线性方程,接下来实现比较经典的CNN网络-----VGG16,下面显示的是VGG网络的结构图 朱雀/ 2022年02月15日 13:19/ 0 赞/ 256 阅读
相关 keras入门(四) ResNet网络 实现猫狗大战 先来一张resnet网络结构图,本文采用的是resnet50![watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cH 墨蓝/ 2021年12月17日 07:23/ 0 赞/ 375 阅读
相关 猫狗数据集 import numpy as np import pickle import cv2 import pandas as pd import tensorflow as 怼烎@/ 2021年11月24日 02:10/ 0 赞/ 371 阅读
相关 AlexNet-基于keras训练猫狗分类 什么是AlexNet模型 ![在这里插入图片描述][20210326193455111.png] ![在这里插入图片描述][20210326193502158.png 以你之姓@/ 2021年11月17日 22:46/ 0 赞/ 390 阅读
相关 keras实战-猫狗数据-VGG16 原理图 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLm 男娘i/ 2021年11月17日 18:28/ 0 赞/ 261 阅读
相关 paddlepaddle实现猫狗分类 目录 1.预备工作 1.1 数据集准备 1.2 数据预处理 2.训练 2.1 模型 2 待我称王封你为后i/ 2021年10月13日 04:19/ 0 赞/ 263 阅读
还没有评论,来说两句吧...