- 系统:windows
- 编辑器:spyder
- 工具:keras
- 使用inceptionv3等模型,在训练集和验证集上提取出特征和label并作为h5进行保存。可以使用多个模型保存特征。提取出特征后,构建两层神经网络做分类器。进行训练,训练速度很快。总共只需5分钟就能得到一个94%的分类器。
- 修改keras中自带的resize方法,改成antialias,原有方法会产生纹波.
- 数据集:链接
- divide_trainAndval.py将原文件夹,切分成train和val两个文件夹。
- inceptionv3,inceptionv3,vgg16,residual50提取特征,代码:
basic_model = inception_v3.Inception_V3(include_top = False,weight = 'imagenet')
feature = GlobalAveragePooling2D()(basic_model.output)
model = models(inputs = basic_model.input,outputs = feature)
f = model.predict(data) #f即为提取出的特征。
- data使用ImageDataGenerator()和gen.flow_from_direction产生.其中keras自带的resize方法很差,会对图片产生纹波,换成interpolation='antialias'。这个需要在keras里面进行修改,在"C:\Users\tunan\AppData\Local\Continuum\anaconda3\envs\tensorflow\lib\site-packages\keras_preprocessing\image.py"文件第34行加入
'antialias':pil_image.ANTIALIAS
gen = ImageDataGenerator()
train_gen = gen.flow_from_directory(r"data\valAndTrain\train",
shuffle = False,batch_size = 16,
class_mode = 'categorical',
target_size = input_size,
interpolation='antialias',
)
data,label = train_gen.next() #取出每次的数据和标签
- 用h5py的方法储存提取出的特征。与直接用np.array写入文件的好处是,不用一次写入文件,分批次写入速度更快。而且写入是以字典的形式,容易读取。
dt = h5py.special_dtype(vlen = str)
with h5py.File("data\\feature") as h:
h.create_dataset("train", data=train_feature)
h.create_dataset("val", data=val_feature)
h.create_dataset('test',data = test_feature)
h.create_dataset("train_labels", data=train_labels)
h.create_dataset("val_labels", data=val_labels)
ds = h.create_dataset('file_name',test_name.shape,dtype = dt)
ds[:] = test_name
- 该代码块用字典的方式将train_feature,val_feature等变量储存到h5文件中。
存储代码:1、h = h5py.File("name")
2、h.create_dataset("train",data = train_feature)
3、储存字符串,dt = h5py.special_dtype(vlen = str); #定义类型
ds = h.create_dataset('file_name',test_name.shape,dtype = dt) #定义变量,大小和类型
ds[:] = test_name #对其赋值 - 读取方式:
1、h = h5py.File('name','r')
2、train_feature = np.array(h[train_feature])