花朵分类任务-2
1. 图像数据的获取和转换
1.1 文件
flowers/category_name/image
文件夹地址单独设定:
FLOWER_DAISY_DIR='./flowers/daisy'
FLOWER_SUNFLOWER_DIR='./flowers/sunflower'
FLOWER_TULIP_DIR='./flowers/tulip'
FLOWER_DANDI_DIR='./flowers/dandelion'
FLOWER_ROSE_DIR='./flowers/rose'
1.2 图片数据的转换
- X=[ ]是存放图片数据的list, Z=[ ]是存放图片标签的list
- X.shape = (m, 150, 150, 3) 使用
cv2
读取图片 - 分别读取每一类的所有图片
img = cv2.imread(path,cv2.IMREAD_COLOR) # 读取图片
img = cv2.resize(img, (IMG_SIZE,IMG_SIZE)) # 统一大小 150 * 150
#img.shape = (150, 150, 3)
#X.shape = (m, 150, 150, 3) m是图片数量
#此时X的形式已经固定-tensor
X.append(np.array(img)) # 存放图片数据
Z.append(str(label)) # 存放图片标签
此时X已是tensor形式,Z中元素为str
形式,按读取顺序排列
如:Z = [‘daisy’,‘daisy’…‘rose’,‘rose’…]
1.3 数据的编码
将数据转换为可以进行训练的格式:
# Label都在Z[]中,将标签转为数字编码,再变为one-hot编码
le=LabelEncoder()
Y=le.fit_transform(Z) # 将标签变为数字,按标签的首字母排序,从0-4
Y=to_categorical(Y,5) # one-hot
# 现在X还是list,里面的元素是np.array(img)
X=np.array(X) # 将其转为np数组
X=X/255 # 归一化
# 此时X是图片数据,Y是标签数据
X不多赘述,Y进行了两次编码,从str
到数字编码
到one-hot
所以最后才能用数字编码
进行反变换生成标签
1.4 数据集划分
- 此时已经得到可以用于训练的格式,但还是顺序的,还需要划分训练集和验证集,以及乱序
- 使用sklearn的
train_test_split()
函数,具体用法自行搜索
得到训练集和测试集,打乱顺序,并且可以按照比例划分
2.模型构建
2.1 数据增强
使用Keras自带的ImageDataGenerator
函数,用法自行查看手册
- 随机旋转、随机缩放、随机水平垂直平移三种方法
2.2 CNN构建
Use your imagination 😃
2.3 优化算法-LR Annealer
和学习率衰减类似,当学习停滞时,降低学习率
利用Keras的Callback实现
2.4 结果评估
_________________________________________________________________
Layer (type) Output Shape Param #
==============================================================