因为第5章的代码较多,且零散,所以对代码进行了一些调整和归纳,将零散的代码归为函数使用
第一节MNIST的卷积网络实现很简单,因为数据集已经集成在keras里了,而在第二节准备数据集的时候遇到了点小问题,首先书中提供的链接已经不存在了,毕竟是2年前的书了。所以就自己在kaggle上找数据集,而我下载下来的数据集又和书中的不太一样,1、目录结构不一样,2、文件名不规范,而且书中处理数据集的方法有点像命令式的方式,感觉较繁琐,所以自己写了两个函数来处理,这样可以帮助更好的理清思路,建议用GPU跑. 我的是gtx9604G显卡,跑50个epoch需要21分钟左右,虽然不快,但也比CPU好太多,大概是cpu的25倍
import os,shutil
#tensorflow本身已集成keras,但也可以额外安装,此步是为了兼容两种情况
try:
from keras import layers
from keras import models
from keras.preprocessing.image import ImageDataGenerator
from keras import optimizers
except Exception as e:
import tensorflow as tf
layers = tf.keras.layers
models = tf.keras.models
ImageDataGenerator = tf.keras.preprocessing.image.ImageDataGenerator
optimizers = tf.keras.optimizers
import matplotlib.pyplot as plt
original_dataset_dir = r'D:\Work\datasets\dogs_vs_cats\train'#原始数据集解压目录
base_dir = r'D:\Work\datasets\cats_and_dogs_small' #提取的小批量图片的保存目录
def mk_dir(*path):
try:
full_path = ''
for sub_path in path:
full_path = os.path.join(full_path, sub_path )
os.makedirs( full_path )#递归创建多层文件夹
return full_path
except Exception as e:
print('创建失败,检查文件夹是否已存在')
print( full_path )
return full_path
def copy_img( train_validation_test, dogs_or_cats,how_num ):
'''
train_validation_test字符串 ,表示要建立的是训练、验证或者是测试目录
dogs_or_cats字符串,意思为是狗还是猫
how_num元组,表示拷贝量从多少到多少,例如0,1000
'''
filename = ''.join([dogs_or_cats[:-1] , '.{}.jpg']) #dogs_or_cats[:-1]因为原始文件名是dog.25.jpg这样的,所以要先删除dogs、cats后面的‘s’
fn