人工智能学习45-Incep网络
人工智能学习概述—快手视频
人工智能学习45-Incep网络—快手视频
人工智能学习46-Incep网络—快手视频
人工智能学习47-Incep网络—快手视频
人工智能学习48-Incep网络—快手视频
人工智能学习49-Incep网络—快手视频
人工智能学习50-Incep总结—快手视频
10类猕猴样本文件
通过网盘分享的文件:monkey10_species.zip
链接: https://pan.baidu.com/s/1faHJMdUasnlGUX_FVPgJNg 提取码: 5abn
InceptionV3 训练 10 类猕猴识别示例
#导入inceptionV3 类库
from keras.applications.inception_v3 import InceptionV3, preprocess_input
#keras.preprocessing.image 导入图像增强工具
from keras.preprocessing.image import ImageDataGenerator
#从keras.layers 导入全连接层,平均池化层
from keras.layers import Dense, GlobalAveragePooling2D
#从keras导入模型类
from keras import Sequential, Model
#导入图形处理类库
import matplotlib.pyplot as plt
#引入numpy类库,方便矩阵操作
import numpy as np
#导入OS模块,方便操作文件与目录
import os
#避免多库依赖警告信息
os.environ['KMP_DUPLICATE_LIB_OK'] = 'True'
#设置神经网络模型存储目录,当前python源文件所在目录上一级下的saved_models目录
save_dir = '../saved_models'
#如果目录saved_models不存在,新建此目录
if not os.path.isdir(save_dir):
os.makedirs(save_dir)
#神经网络模块名称
model_name = 'finetune_incepV3_trained_model.h5'
#全连接层向量大小
fc_size = 1023
#输入图像高度(单位:像素)
height = 299
#输入图像宽度(单位:像素)
width = 299
#InceptionV3 类库使用已经训练好的模型进行迁移学习,增加一种新的动物,在原模型基
础上,训练新模型可以识别新增加的动物,原模型可以识别10种猕猴
num_classes = 11
#定义添加新全连接层的方法
def add_new_last_layer(base_model, nb_classes):
x = base_model.output
x = GlobalAveragePooling2D()(x)
x = Dense(fc_size, activation='relu')(x)
pred = Dense(nb_classes, activation='softmax')(x)
model = Model(inputs=base_model.input, outputs=pred)
return model
#定义编译模型的方法
def setup_to_transfer_learn(model, base_model):
for layer in base_model.layers:
layer.trainable = False
model.compile(optimizer='rmsprop',
metrics=['acc'])
#声明InceptionV3 模型,权重使用imagenet
loss='categorical_crossentropy',
base_model = InceptionV3(weights='imagenet', include_top=False)
#调用方法添加新全连接层
incep_model = add_new_last_layer(base_model, num_classes)
#调用方法编译模型
setup_to_transfer_learn(incep_model, base_model)
#显示模型汇总信息
incep_model.summary()
#定义训练数据集增强类
train_datagen = ImageDataGenerator(
preprocessing_function=preprocess_input, #使用 VGG16 定义输入函数
rotation_range=40, #表示图像在水平上随机移动的范围
width_shift_range=0.2, #表示图像在水平上随机移动的范围
height_shift_range=0.2, # 表示图像在垂直方向上随机移动的范围
shear_range=0.2, # 随机剪切变换的角度范围,图像将随机剪切0到20度的角度
zoom_range=0.2, # 随机缩放的范围,图像将随机缩放90%到110%
horizontal_flip=True, # 是否进行水平翻转
fill_mode='nearest' #当变换导致某些像素需要被填充时使用的填充方法,'nearest'
表示使用最近的像素进行填充
)
#定义验证数据集增强类
valid_datagen = ImageDataGenerator(
preprocessing_function=preprocess_input
)
#小批量训练模式下每次训练样本数量
batch_size = 32
#训练集数据增强生成器
train_generator = train_datagen.flow_from_directory(
"../monkey10_species/training/training", #训练图片所在目录
target_size=(height, width), #图片尺寸大小
batch_size=batch_size, #每次训练样品批量
seed=10, # 指定随机数种子,用于洗牌操作的随机性
shuffle=True, #是否对样品数据洗牌
class_mode='categorical' #指定标签的类型,可以是"categorical"(多分类问题)、
"binary"(二分类问题)、"sparse"(稀疏标签问题)或"None"(无标签问题)
)
#训练集样品总量
train_num = train_generator.samples
valid_generator = valid_datagen.flow_from_directory(
"../monkey10_species/validation/validation", #训练图片所在目录
target_size=(height, width), #图片尺寸大小
batch_size=batch_size, #每次训练样品批量
seed=10, # 指定随机数种子,用于洗牌操作的随机性
shuffle=False, #是否对样品数据洗牌
class_mode='categorical' #指定标签的类型,可以是"categorical"(多分类问题)、
"binary"(二分类问题)、"sparse"(稀疏标签问题)或"None"(无标签问题)
)
#验证集样品总量
valid_num = valid_generator.samples
#开始训练模型,匹配训练集与标注真实数值映射关系
history = incep_model.fit_generator(
train_generator, #训练集生成器
steps_per_epoch=train_num // batch_size, # 定义了一个 epoch 中应抽取的步数(批
次数量)
epochs=5, #训练次数
validation_data=valid_generator, #测试集生成器
validation_steps=valid_num // batch_size
)
# 保存模型
model_path = os.path.join(save_dir, model_name)
incep_model.save(model_path)
print('Model save as file %s' % model_path)
#从history 对象中获取准确度核损失统计信息
acc = history.history['acc'] #训练集准确度
val_acc = history.history['val_acc'] #验证集准确度
loss = history.history['loss'] #训练集损失
val_loss = history.history['val_loss'] #验证集损失
epochs = range(1, len(acc) + 1)
#训练集准确度曲线
plt.plot(epochs, acc, 'bo', label='Train Accuracy')
#验证集准确度曲线
plt.plot(epochs, val_acc, 'b', label='Validation Accuracy')
plt.title('Train Accuracy')
plt.legend()
#显示图形窗口
plt.show()
#训练集损失曲线
plt.plot(epochs, loss, 'ro', label='Train Loss')
#验证集损失曲线
plt.plot(epochs, val_loss, 'r', label='Validation Loss')
plt.title('Train Loss')
plt.legend()
#显示图形窗口
plt.show()
运行结果:
InceptionV3 预测 10 类猕猴示例
#导入InceptionV3 类库
from keras.applications.inception_v3 import preprocess_input
#导入图像处理库
from keras.preprocessing import image
#导入装载模型方法load_model
from keras.saving.save import load_model
#引入numpy类库,方便矩阵操作
import numpy as np
#引入sys类库
import sys
#导入OS模块,方便操作文件与目录
import os
#避免多库依赖警告信息
os.environ['KMP_DUPLICATE_LIB_OK'] = 'True'
#设置神经网络模型存储目录,当前python源文件所在目录上一级下的saved_models目录
save_dir = '../saved_models'
#神经网络模块名称
model_name = 'finetune_incepV3_trained_model.h5'
#神经网络模块所在目录
model_path = os.path.join(save_dir, model_name)
num_classes = 11
#输入图像高度(单位:像素)
height = 299
#输入图像宽度(单位:像素)
width = 299
#定义输入图片变量
img_path = None
#命令行输入参数数组
arguments = sys.argv[1:2]
#如果数组为空,img_path设置为默认图片
if len(arguments) == 0:
img_path = '../cat.jpg'
else:
img_path = arguments[0] #第一个参数为图片文件
#由图片文件名称转载图片数据
img = image.image_utils.load_img(img_path, target_size=(height, width))
#图片数据转化为数组
x = image.image_utils.img_to_array(img)
#扩展图片数组维度,第一维扩展维图片样本数量
x = np.expand_dims(x, axis=0)
#由InceptionV3 提供数据载入函数装载图片数据
x = preprocess_input(x)
#装载神经网络模型
model = load_model(model_path)
#模型预测输入图片的动物分类
pred = model.predict(x)
#显示预测概率最大的分类
print(pred.argmax())