ResNet-50 训练猫狗分类
这里介绍一下怎么搭建ResNet网络,并说明一下残差网络的结构,并使用ResNet来训练一个二分类问题
1.ResNet网络
对于ResNet网络的讲解可以参考这个链接(https://blog.csdn.net/koala_tree/article/details/78583979)这里说的已经很清楚了,对于视频讲解可以到网易云课堂里面搜索吴恩达的《深度学习工程师》微专业课程
使用tf2的keras代码
2.猫狗数据
猫狗图片数据可以在这里下载cats and dogs
提取码:uve0
下载后解压,然后解压里面的 train.zip 加压后的图片为猫狗图片,命名规则为cat.num.jpg,dog.num.jpg,可以将train目录更名为train_total,然后执行脚本allocation_picture.py
将数据集分为train,val,test
3.训练
运行训练脚本脚本train.py,训练模型
其中
# 训练集
train_dir = "datasets/train"
# 验证集
val_dir = "datasets/val"
# 批次大小
batch_size = 2048
# 输入图片大小
image_size = 224
# 加载数据集为 Dataset
def load_image(path, batch, size):
def _decode_and_resize(filename, label):
# 读取文件
image_string = tf.io.read_file(filename)
# 解码图片为jpeg
image = tf.image.decode_jpeg(image_string)
# 数据增强 左右随机增强
image = tf.image.random_flip_left_right(image)
# 数据增强
image = tf.image.random_contrast(image, lower=0.8, upper=1.2)
image = tf.image.random_saturation(image, lower=0.8, upper=1.2)
# resize 图片,保持原图比例
image_resized = tf.image.resize_with_pad(image, size, size) / 255.0
return image_resized, label
cats_dir = path + "/cat/"
dogs_dir = path + "/dog/"
cat_filenames = tf.constant([cats_dir + filename for filename in os.listdir(cats_dir)])
dog_filenames = tf.constant([dogs_dir + filename for filename in os.listdir(dogs_dir)])
filenames = tf.concat([cat_filenames, dog_filenames], axis=-1)
labels = tf.concat([
tf.zeros(cat_filenames.shape, dtype=tf.int32),
tf.ones(dog_filenames.shape, dtype=tf.int32)],
axis=-1)
datasets = tf.data.Dataset.from_tensor_slices((filenames, labels))
datasets = datasets.map(
map_func=_decode_and_resize,
num_parallel_calls=tf.data.experimental.AUTOTUNE)
datasets = datasets.shuffle(buffer_size=batch * 100)
datasets = datasets.batch(batch)
datasets = datasets.prefetch(tf.data.experimental.AUTOTUNE)
return datasets
4.测试
模型训练完后,计算 accuracy, recall,precision