数据扩增
在数据集中的数据不多的情况下,可以使用图片生成器ImageDataGenerator用来生成一个batch的图像数据,进行数据扩增.
示例:
#!/usr/bin/python
# coding:utf8
from keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_img
datagen = ImageDataGenerator(rotation_range=40,
width_shift_range=0.2,
height_shift_range=0.2,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True,
fill_mode='nearest')
img = load_img('/image/panda.jpg')
x = img_to_array(img)
x = x.reshape((1,)+x.shape)
i = 0
for batch in datagen.flow(x, batch_size=1,
save_to_dir='/train/1/', save_prefix='pandas', save_format='jpg'):
i += 1
if i>60:
break
输出:
模型的训练、保存与恢复
将扩增之后的图片数据集按类分为训练集验证集.
图片数据放置形式:
train\
0\
dog_0_1.jpg
dog_0_2.jpg
dog_0_3.jpg
...
1\
panda_0_1.jpg
panda_0_2.jpg
panda_0_3.jpg
...
validation\
0\
dog_0_1.jpg
dog_0_2.jpg
dog_0_3.jpg
...
1\
panda_0_1.jpg
panda_0_2.jpg
panda_0_3.jpg
...
训练模型并保存模型(分别保存整个模型、保存模型权重、保存模型结构).
示例:
#!/usr/bin/python
# coding:utf8
from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D
from keras.layers import Dropout, Flatten, Dense
from keras.preprocessing.image import ImageDataGenerator
# 建立模型
model = Sequential()
model.add(Conv2D(32, 3, activation='relu', input_shape=(150,150,3)))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(32, 3, activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(64, 3, activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(64, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(1, activation='sigmoid'))
# 编译
model.compile(loss='binary_crossentropy',
optimizer='rmsprop',
metrics=['accuracy'])
train_datagen = ImageDataGenerator(rescale=1./255,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True)
test_datagen = ImageDataGenerator(rescale=1./255)
# 从图片中直接产生数据和标签
train_generator = train_datagen.flow_from_directory('train',
target_size=(150,150),
batch_size=32,
class_mode='binary')
validation_generator = test_datagen.flow_from_directory('validation',
target_size=(150,150),
batch_size=32,
class_mode='binary')
model.fit_generator(train_generator,
steps_per_epoch=1000,
epochs=60,
validation_data=validation_generator,
validation_steps=200)
# 保存整个模型
model.save('model.hdf5')
# 保存模型的权重
model.save_weights('model_weights.h5')
# 保存模型的结构
json_string = model.to_json()
open('model_to_json.json','w').write(json_string)
yaml_string = model.to_yaml()
open('model_to_yaml.yaml','w').write(json_string)
保存完整模型
通过model.save()将模型和权重保存在一个.hdf5文件中.
model.save('model/model.hdf5')
完整模型的恢复
通过keras.models.load_model()可以将模型重新实例化.
示例:
#!/usr/bin/python
# coding:utf8
from keras.models import load_model
import numpy as np
from keras.preprocessing import image
from keras.preprocessing.image import load_img
# 加载权重
model = load_model('model.hdf5')
# 加载图像
img = load_img('pandas_0_96.jpg',target_size=(150, 150))
img = image.img_to_array(img) / 255.0
img = np.expand_dims(img, axis=0)
predictions = model.predict(img)
print (predictions)
输出:
[[0.9967361]]
保存模型权重
通过model.save_weights()可以将模型的权重保存到指定路径下的.h5文件中.
model.save_weights('model/model_weights.h5')
模型权重的恢复
首先建立对应模型,然后通过model.load_weights()从.hdf5文件中加载到当前模型.
如果想将权重载入不同的模型(有些层相同)中,则设置by_name=True,只有名字匹配的层才会载入权重.
示例:
#!/usr/bin/python
# coding:utf8
from keras.preprocessing.image import load_img
from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D
from keras.layers import Dropout, Flatten, Dense
import numpy as np
from keras.preprocessing import image
# 建立模型
model = Sequential()
model.add(Conv2D(32, 3, activation='relu', input_shape=(150,150,3)))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(32, 3, activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(64, 3, activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(64, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='rmsprop', metrics=['accuracy'])
# 加载权重
classifier = model.load_weights('model_weights.h5')
# 加载图像
img = load_img('pandas_0_96.jpg',target_size=(150, 150))
img = image.img_to_array(img) / 255.0
img = np.expand_dims(img, axis=0)
predictions = model.predict(img)
print (predictions)
输出:
[[0.9967361]]
保存模型结构
通过model.to_json()或model.to_yaml(),返回代表模型的JSON字符串,仅包含网络结构,不包含权值.这样可以把模型序列化为json或yaml文件,然后保存到本地.
保存为json文件:
json_string = model.to_json()
open('model_to_json.json','w').write(json_string)
保存为yaml文件:
yaml_string = model.to_yaml()
open('model_to_yaml.yaml','w').write(json_string)
模型结构的恢复
通过model.to_json或model.to_yaml可以从JSON字符串或YAML字符串中重构原模型.
JSON字符串或YAML字符串可以通过open(filepath).read()从对应的json文件或yaml文件中读取.
示例:
from keras.models import model_from_yaml
yaml_string = open('model_to_yaml.yaml').read()
model = model_from_yaml(yaml_string)
# 打印出模型
model.summary()
打印出模型概况:
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d_1 (Conv2D) (None, 148, 148, 32) 896
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 74, 74, 32) 0
_________________________________________________________________
conv2d_2 (Conv2D) (None, 72, 72, 32) 9248
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 36, 36, 32) 0
_________________________________________________________________
conv2d_3 (Conv2D) (None, 34, 34, 64) 18496
_________________________________________________________________
max_pooling2d_3 (MaxPooling2 (None, 17, 17, 64) 0
_________________________________________________________________
flatten_1 (Flatten) (None, 18496) 0
_________________________________________________________________
dense_1 (Dense) (None, 64) 1183808
_________________________________________________________________
dropout_1 (Dropout) (None, 64) 0
_________________________________________________________________
dense_2 (Dense) (None, 1) 65
=================================================================
Total params: 1,212,513
Trainable params: 1,212,513
Non-trainable params: 0
_________________________________________________________________
dog:
panda:
Keras版本:2.1.5
参考:
Keras中文文档::图片生成器ImageDataGenerator
Keras中文文档::关于Keras模型
The Keras Blog::Building a simple Keras + deep learning REST API