官方提供的.flow_from_directory(directory)函数可以读取并训练大规模训练数据,基本可以满足大部分需求。但是在有些场合下,需要自己读取大规模数据以及对应标签,下面提供一种方法。

步骤0:导入相关

import random
import numpy as np
from keras.preprocessing.image import load_img,img_to_array
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Model

步骤1:准备数据

#训练集样本路径
train_X = ["train/cat_1.jpg",
"train/cat_2.jpg",
"train/cat_3.jpg",
"train/dog_1.jpg",
"train/dog_2.jpg",
"train/dog_3.jpg"]
#验证集样本路径
val_X = ["val/cat_1.jpg",
"val/cat_2.jpg",
"val/cat_3.jpg",
"val/dog_1.jpg",
"val/dog_2.jpg",
"val/dog_3.jpg"] # 根据图片路径获取图片标签
def get_img_label(img_paths):
img_labels = [] for img_path in img_paths:
animal = img_path.split("/")[-1].split('_')[0]
if animal=='cat':
img_labels.append(0)
else:
img_labels.append(1) return img_labels # 读取图片
def load_batch_image(img_path, train_set = True, target_size=(224, 224)):
im = load_img(img_path, target_size=target_size)
if train_set:
return img_to_array(im) #converts image to numpy array
else:
return img_to_array(im)/255.0
# 建立一个数据迭代器
def GET_DATASET_SHUFFLE(X_samples, batch_size, train_set = True):
random.shuffle(X_samples) batch_num = int(len(X_samples) / batch_size)
max_len = batch_num * batch_size
X_samples = np.array(X_samples[:max_len])
y_samples = get_img_label(X_samples)
print(X_samples.shape) X_batches = np.split(X_samples, batch_num)
y_batches = np.split(y_samples, batch_num) for i in range(len(X_batches)):
if train_set:
x = np.array(list(map(load_batch_image, X_batches[i], [True for _ in range(batch_size)])))
else:
x = np.array(list(map(load_batch_image, X_batches[i], [False for _ in range(batch_size)])))
#print(x.shape)
y = np.array(y_batches[i])
yield x,y

步骤2:对训练数据进行数据增强处理

train_datagen = ImageDataGenerator(
rescale=1. / 255,
rotation_range=10,
width_shift_range=0.2,
height_shift_range=0.2,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True)

步骤3:定义模型

model = Model(...)

步骤4:模型训练

n_epoch = 12
batch_size = 16
for e in range(n_epoch):
print("epoch", e)
batch_num = 0
loss_sum=np.array([0.0,0.0])
for X_train, y_train in GET_DATASET_SHUFFLE(train_X, batch_size, True): # chunks of 100 images
for X_batch, y_batch in train_datagen.flow(X_train, y_train, batch_size=batch_size): # chunks of 32 samples
loss = model.train_on_batch(X_batch, y_batch)
loss_sum += loss
batch_num += 1
break #手动break
if batch_num%200==0:
print("epoch %s, batch %s: train_loss = %.4f, train_acc = %.4f"%(e, batch_num, loss_sum[0]/200, loss_sum[1]/200))
loss_sum=np.array([0.0,0.0])
res = model.evaluate_generator(GET_DATASET_SHUFFLE(val_X, batch_size, False),int(len(val_X)/batch_size))
print("val_loss = %.4f, val_acc = %.4f: "%( res[0], res[1])) model.save("weight.h5")

另外,如果在训练的时候不需要做数据增强处理,那么训练就更加简单了,如下:

model.fit_generator(
GET_DATASET_SHUFFLE(train_X, batch_size, True),
epochs=10,
steps_per_epoch=int(len(train_X)/batch_size))

参考文献:

Training on Large Scale Image Datasets with Keras

使用Keras训练大规模数据集的更多相关文章

  1. Hinton胶囊网络后最新研究:用“在线蒸馏”训练大规模分布式神经网络

    Hinton胶囊网络后最新研究:用“在线蒸馏”训练大规模分布式神经网络 朱晓霞发表于目标检测和深度学习订阅 457 广告关闭 11.11 智慧上云 云服务器企业新用户优先购,享双11同等价格 立即抢购 ...

  2. Fast RCNN 训练自己数据集 (1编译配置)

    FastRCNN 训练自己数据集 (1编译配置) 转载请注明出处,楼燚(yì)航的blog,http://www.cnblogs.com/louyihang-loves-baiyan/ https:/ ...

  3. 使用caffe训练mnist数据集 - caffe教程实战(一)

    个人认为学习一个陌生的框架,最好从例子开始,所以我们也从一个例子开始. 学习本教程之前,你需要首先对卷积神经网络算法原理有些了解,而且安装好了caffe 卷积神经网络原理参考:http://cs231 ...

  4. 实践详细篇-Windows下使用VS2015编译的Caffe训练mnist数据集

    上一篇记录的是学习caffe前的环境准备以及如何创建好自己需要的caffe版本.这一篇记录的是如何使用编译好的caffe做训练mnist数据集,步骤编号延用上一篇 <实践详细篇-Windows下 ...

  5. keras训练cnn模型时loss为nan

    keras训练cnn模型时loss为nan 1.首先记下来如何解决这个问题的:由于我代码中 model.compile(loss='categorical_crossentropy', optimiz ...

  6. 使用py-faster-rcnn训练VOC2007数据集时遇到问题

    使用py-faster-rcnn训练VOC2007数据集时遇到如下问题: 1. KeyError: 'chair' File "/home/sai/py-faster-rcnn/tools/ ...

  7. Keras下载的数据集以及预训练模型保存在哪里

    Keras下载的数据集在以下目录中: root\\.keras\datasets Keras下载的预训练模型在以下目录中: root\\.keras\models 在win10系统来说,用户主目录是: ...

  8. YOLOV4在linux下训练自己数据集(亲测成功)

    最近推出了yolo-v4我也准备试着跑跑实验看看效果,看看大神的最新操作 这里不做打标签工作和配置cuda工作,需要的可以分别百度搜索   VOC格式数据集制作,cuda和cudnn配置 我们直接利用 ...

  9. Scaled-YOLOv4 快速开始,训练自定义数据集

    代码: https://github.com/ikuokuo/start-scaled-yolov4 Scaled-YOLOv4 代码: https://github.com/WongKinYiu/S ...

随机推荐

  1. conts、var 、let的区别

    1.const定义的变量不可以直接修改,通过 this.a = 'kkk' 进行修改, 而且必须初始化. 2.var定义的变量可以修改,如果不初始化会输出undefined 3.let是块级作用域,函 ...

  2. angular6 导出json数据到excal表

    1 首先使用npm下载插件依赖的安装包   npm install file-saver --save   npm install xlsx --save   2 引入项目中的ts文件中   impo ...

  3. BUAA-OO第二单元小结

    一.设计策略 三次作业中,由于前两次作业都只有一部电梯,因此我的线程只有两个,一个等待队列输入进程,以及一个电梯运行进程.等待队列输入进程实现十分简单,只需要根据输入把request添加到等待队列即可 ...

  4. 基于Linux-3.9.4的mykernel实验环境的极简内核分析

    382 + 原创作品转载请注明出处 + https://github.com/mengning/linuxkernel/ 一.实验环境 win10 -> VMware -> Ubuntu1 ...

  5. 使用python编辑和读取word文档

    python调用word接口主要用到的模板为python-docx,基本操作官方文档有说明. python-docx官方文档地址 使用python新建一个word文档,操作就像文档里介绍的那样: fr ...

  6. html基础学习笔记1

    <!DOCTYPE html> 声明为 HTML5 文档  <html> 元素是 HTML 页面的根元素 <head> 元素包含了文档的元(meta)数据,如 &l ...

  7. day-14带参装饰器、迭代器

    带参装饰器 通常,装饰器为被装饰的函数添加新功能,需要外界的参数  -- outer参数固定一个,就是func -- inner参数固定同被装饰的函数,也不能添加新参数 -- 可以借助函数的嵌套定义, ...

  8. redis命令行批量删除匹配到的key

    执行命令如下 redis-cli -h 12.132.30.21 -p 6379 -a 2016 -n 4 keys "ecard*" | xargs redis-cli -h 1 ...

  9. GitHub Pages:静态站点托管服务(待补充)

    不管是 react 还是 vue 项目路由都必须使用 hash 方式,否则页面打不开,切记!!! 如果使用的是 vue-cli 3 创建项目,那么你要在根目录创建 vue.config.js 文件,并 ...

  10. WIN7以上系统安装VB6的解决办法,附上个批处理。

    一.安装时显示oledb32r.dll不能在系统注册数据库中注册在C盘查找oledb32r.dll,改名为oledb32r-2.dll即可,dll冲突了. 二.WIN7安装VB6提示VB98ENT.S ...