https://www.toutiao.com/a6670173759829180936/

在本文中,我们将讨论如何使用Keras在不适合内存的大数据集上训练我们的深度学习网络。

介绍

深度学习算法优于所有其他算法,能够在大多数问题上产生最先进的结果。深度学习算法成功的主要原因是数据集的大小越来越大。现在,深度学习算法在大型数据集上进行训练,这些数据集甚至不适合内存。问题是:如何在如此庞大的数据集上训练我们的模型?本文分为以下几个部分:

一般情况下,深度学习算法的性能优于其他算法,并且能够在大多数问题上产生较好的结果。深度学习算法成功的主要原因是数据集的不断增大。现在,深度学习算法在大型数据集上进行训练,这些数据集甚至不适合内存。问题是:如何在如此巨的数据集中训练我们的深度学习模型呢?本文分为以下几个部分:

  • 下载和了解数据集
  • 数据集的准备 - 批量加载数据集
  • 数据集在训练和验证集中的Shuffling和拆分
  • 创建自定义生成器
  • 定义模型体系结构和训练模型
  • 结论

作为一个例子,我们将解决Kaggle“Plant Seedlings Classification”的挑战。这个数据集并不大,但我们将假设数据集太大,无法装入内存,然后将批量加载数据集。

下载和了解数据集

您可以从此处下载(https://www.kaggle.com/c/plant-seedlings-classification/data)数据集。解压缩train.zip文件夹。该数据集包含分类为12种植物物种的不同阶段的植物幼苗的4750幅图像。12种植物有Black-grass,Charlock,Cleavers,Common Chickweed,Common wheat,Fat Hen,Losse Silky-bent,Maize,Scentless Mayweed,Shepherds Purse,Small-flowered Cranesbill,Sugar beet。竞赛的目标是创建一个能够从照片中确定植物种类的分类器。

当前目录如下所示:

文件夹目录

如果您的问题数据集不是这种格式,请不要担心。您的数据集可以是任何格式。我们将在下一节中看到,目标是获取所有数据点(即我们示例中的图像)并将它们保存到单个文件夹中。数据点可以是图像,音频等。

数据集的准备 - 批量加载数据集

下一步是获取整个数据集(即所有数据点(在我们的示例中为图像))并将它们存储到一个文件夹中。我们创建一个名为“all_images”的新文件夹,目标是将数据集中的所有图像存储在这个“all_images”文件夹中。

我们使用以下脚本将所有图像存储在“all_images”文件夹中。您可以编写类似的脚本来获取数据集中的所有数据点(可以是图像,音频等)并将它们存储到新文件夹中。

import os
import shutil
train_dir = '/content/train'
dest_dir = '/content/all_images'
counter = 0
for subdir, dirs, files in os.walk(train_dir):#print(files)for file in files:full_path = os.path.join(subdir, file)shutil.copy(full_path, dest_dir)counter = counter + 1
print(counter)

下一步是将每个数据点的名称(即每个图像的名称)存储在一个数组中(让我们将数组命名为filename)。还有一件事是将与每个数据点关联的标签存储在另一个数组中(让我们将这个数组称为labels)。

下面是一个Python脚本,它将每个图像的名称存储在filenames数组中,并将与该图像关联的标签存储在labels数组中。

注意:请记住,每个数据点的名称应该是唯一的。

import numpy as np
subdirs, dirs, files = os.walk('/content/all_images').__next__()
m = len(files)
print(m)
filenames = []
labels = np.zeros((m, 1))
import os
import shutil
images_dir = '/content/all_images'
filenames_counter = 0
labels_counter = -1
for subdir, dirs, files in os.walk(train_dir):#print(files)for file in files:filenames.append(file)labels[filenames_counter, 0] = labels_counterfilenames_counter = filenames_counter + 1labels_counter = labels_counter+1print(len(filenames))
print(labels.shape)

现在,您可以保存“all_images”文件夹、“filename”数组和“labels”数组,以便稍后使用。

下面我们创建一个由filename 和labels组成的numpy数组,并将它们保存为.npy文件。

# saving the filename array as .npy file
np.save('filenames.npy', filenames)
import keras
from keras.utils import to_categorical
# One hot vector representation of labels
y_labels_one_hot = to_categorical(labels)
# saving the y_labels_one_hot array as a .npy file
np.save('y_labels_one_hot.npy', y_labels_one_hot)

数据集的shuffling和拆分

下一步是对数据集进行shuffle ,以便从数据集中删除对称性。

from sklearn.utils import shuffle
filenames_shuffled, y_labels_one_hot_shuffled = shuffle(filenames, y_labels_one_hot)
# saving the shuffled file.
# you can load them later using np.load().
np.save('y_labels_one_hot_shuffled.npy', y_labels_one_hot_shuffled)
np.save('filenames_shuffled.npy', filenames_shuffled)

现在,让我们将数据集拆分为训练和验证集。我们也可以保存这些文件,因为这些文件稍后将用于训练和验证我们的机器学习模型。

from sklearn.model_selection import train_test_split
filenames_shuffled_numpy = np.array(filenames_shuffled)
X_train_filenames, X_val_filenames, y_train, y_val = train_test_split(filenames_shuffled_numpy, y_labels_one_hot_shuffled, test_size=0.2, random_state=1)
print(X_train_filenames.shape)
print(y_train.shape)
print(X_val_filenames.shape)
print(y_val.shape)
np.save('X_train_filenames.npy', X_train_filenames)
np.save('y_train.npy', y_train)
np.save('X_val_filenames.npy', X_val_filenames)
np.save('y_val.npy', y_val)

您还可以将“all_images”文件夹保存为zip格式,以便与其他团队成员共享数据集。

这些代码行只创建一个“all_images.zip”文件夹。

import shutil
shutil.make_archive("all_images", "zip", "all_images")

创建自定义生成器

注意:由于我们的数据集太大而无法容纳在内存中,因此我们必须将数据集从硬盘批量加载到内存中。

为此,我们将创建一个自定义生成器。我们的自定义生成器将要将数据集从硬盘批量加载到内存中。

class My_Custom_Generator(keras.utils.Sequence) :def __init__(self, image_filenames, labels, batch_size) :self.image_filenames = image_filenamesself.labels = labelsself.batch_size = batch_sizedef __len__(self) :return (np.ceil(len(self.image_filenames) / float(self.batch_size))).astype(np.int)def __getitem__(self, idx) :batch_x = self.image_filenames[idx * self.batch_size : (idx+1) * self.batch_size]batch_y = self.labels[idx * self.batch_size : (idx+1) * self.batch_size]return np.array([resize(imread('/content/all_images/' + str(file_name)), (80, 80, 3))for file_name in batch_x])/255.0, np.array(batch_y)

让我们试着理解整个代码:

  • 第1行:我们的Custom Generator类继承自Sequence类。
  • 第3行:在这里,我们可以向生成器提供参数。
  • 第9行:此函数计算此生成器应该生成的批数。因此,我们将总样本数除以batch_size并返回该值。
  • 第14行:在这里,给定批号idx,您需要将包含数据批次和ground-truth(GT)的列表放在一起。在此示例中,我们读取大小为batch_size的批量图像,并返回一个数组[image_batch, GT]。
  • 在__getitem __(self,idx)函数中,您可以决定批量加载时数据集会发生什么。在这里,您也可以执行预处理步骤。此外,您还可以计算音频文件的mel谱图。

我们已经创建了数据生成器。下一步是创建此类的实例。

batch_size = 32
my_training_batch_generator = My_Custom_Generator(X_train_filenames, y_train, batch_size)
my_validation_batch_generator = My_Custom_Generator(X_val_filenames, y_val, batch_size)

  • 第3,4行:实例化My_Custom_Generator的两个实例(一个用于训练,一个用于验证)。

定义模型体系结构和训练模型

我们先导入一些Python库:

import numpy as np
import pandas as pd
from skimage.io import imread
from skimage.transform import resize
import keras
from keras.models import Sequential, Model, load_model
from keras.layers import Input, Conv1D, Conv2D, MaxPooling1D, MaxPooling2D, Dense, Dropout, Activation, Flatten
from keras.layers.normalization import BatchNormalization
from keras.utils import to_categorical

现在,让我们定义模型架构并编译机器学习模型。您可以在此处使用任何模型架构。

model = Sequential()
model.add(Conv2D(filters = 64, kernel_size = (5,5), activation ='relu',input_shape=(80,80,3)))
model.add(BatchNormalization(axis=3))
model.add(Conv2D(filters = 64, kernel_size = (5,5), activation ='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(BatchNormalization(axis=3))
model.add(Dropout(0.25))
model.add(Conv2D(filters = 128, kernel_size = (5,5), activation ='relu'))
model.add(BatchNormalization(axis=3))
model.add(Conv2D(filters = 128, kernel_size = (5,5), activation ='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(BatchNormalization(axis=3))
model.add(Dropout(0.25))
model.add(Conv2D(filters = 256, kernel_size = (5,5), activation ='relu'))
model.add(BatchNormalization(axis=3))
model.add(Conv2D(filters = 256, kernel_size = (5,5), activation ='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(BatchNormalization(axis=3))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(256, activation = "relu")) #Fully connected layer
model.add(BatchNormalization())
model.add(Dropout(0.5))
model.add(Dense(60, activation = "relu")) #Fully connected layer
model.add(BatchNormalization())
model.add(Dropout(0.5))
model.add(Dense(12, activation = "softmax")) #Classification layer or output layer
model.compile(optimizer="adam", loss='categorical_crossentropy', metrics=['accuracy'])
model.summary()

现在,让我们训练我们的机器学习模型。

model.fit_generator(generator=my_training_batch_generator,steps_per_epoch = int(3800 // batch_size),epochs = 10,verbose = 1,validation_data = my_validation_batch_generator,validation_steps = int(950 // batch_size))

训练结果:

我们的模型没有给出很好的结果,而且过度拟合。我们可以使用不同的模型架构,或者预处理我们的数据集,或使用数据增强,或者使用迁移学习来提高精度。但是,这不是本文的目的。我希望现在您已经非常清楚地理解了如何使用大数据集来训练一个深度学习模型。

结论

这篇文章,我试着用一个例子给你一个非常清晰的理解,告诉你如何用一个巨大的数据集训练你自己的深度学习模型。

注意:最好先对数据集进行预处理,然后将其提供给学习算法。

如何在Keras中训练大型数据集相关推荐

  1. 目标检测第6步:YOLOv5(5.0)如何在Colab中训练自定义数据集?(更新时间:2022.3.22)

    (请先看这篇文章:本博打开方式!!!请详读!!!请详读!!!请详读!!!_Cat-CSDN博客) 如果看完这篇博文,你的问题还是没有解决,那么请关注我的公众号,后台发消息给我吧,当天回复! 目录 一. ...

  2. Python 教程之如何在 Python 中处理大型数据集CSV、Pickle、Parquet、Feather 和 HDF5 的比较

    时隔这么久, Kaggle 终于推出了新的表格数据竞赛,一开始大家都很兴奋.直到他们没有.当 Kagglers 发现数据集有 50 GB 大时,社区开始讨论如何处理如此大的数据集. CSV 文件格式需 ...

  3. 如何在TensorFlow中训练Boosted Trees模型

    在使用结构化数据时,诸如梯度提升决策树和随机森林之类的树集合方法是最流行和最有效的机器学习工具之一. 树集合方法训练速度快,无需大量调整即可正常工作,并且不需要大型数据集进行训练. 在TensorFl ...

  4. 如何在 Keras 中使用 FaceNet 开发人脸识别系统

    https://www.infoq.cn/article/4wT4mNvKlVvEQZR-JXmp Keras 是一个用 Python 编写的高级神经网络 API,能够以 TensorFlow.CNT ...

  5. 使用keras进行深度学习_如何在Keras中通过深度学习对蝴蝶进行分类

    使用keras进行深度学习 A while ago I read an interesting blog post on the website of the Dutch organization V ...

  6. 如何在Keras中检查深度学习模型(翻译)

    本文翻译自:How to Check-Point Deep Learning Models in Keras 深度学习模型可能需要数小时,数天甚至数周才能进行训练. 如果意外停止运行,则可能会丢失大量 ...

  7. python训练数据集_python – 如何训练大型数据集进行分类

    我有一个1600000推文的训练数据集.我该如何训练这类巨大的数据. 我尝试过使用nltk.NaiveBayesClassifier.如果我跑步,训练需要5天以上. def extract_featu ...

  8. 如何在colab中加载数据集并且运行文件

    方式1:从本地机器导入数据集 方式2:从google drive导入 方式3:导入kaggle网站提供的数据集 方式1: 选择导入本地的文件,注意导入的文件智慧自会对本次会话生效. 此外,还可以获得本 ...

  9. keras 多层lstm_tensorflow-如何在keras中堆叠多个lstm?

    @DanielAdiwardana的答案的详细说明.我们需要为除最后一层之外的所有LSTM层添加return_sequences = True. 将此标志设置为True可让Keras知道LSTM输出应 ...

最新文章

  1. python pool_派松水潭(Python Pool)
  2. ESLint规则配置说明
  3. etcd nginx 容器_Etcd+confd实现动态修改nginx文件
  4. L1-1 PTA使我精神焕发 (5 分)
  5. 中挪动正请求第三方支出牌照竖立支出公司
  6. 在网站上点击按钮直接聊QQ
  7. web项目报404一直找不到图片(路径绝对正确)
  8. 盘点10款逆天级效率工具,能帮创业公司节省50%时间成本
  9. 产品经理的自我修养—认知模式
  10. android 视频画面切割,安卓手机如何剪裁视频 手机视频裁剪多余部分
  11. 软件测试中报表测试用例设计方法总结
  12. python小游戏——魂斗罗这是你的童年吗?
  13. OpenGL表面剔除
  14. 解决scalac Error: bad option -make:transitive
  15. centos安装cerebro
  16. MATLAB如何生成scr文件,基于SCR脚本文件的MatlabAutoCAD结合使用
  17. 织梦dedecms会员中心投稿,管理员审核后,文档稿件动态浏览,禁止生成静态页
  18. Macos Catalina 10.15.4 (19E287) 更新后外接显示器显示BUG
  19. 机器学习--期望风险、经验风险与结构风险之间的关系
  20. Ceph常见问题百科全书

热门文章

  1. EJB基础 作者 Richard Monson-HaefelTim Rohaly
  2. python——图像处理3(均值偏移、改变亮度、图像修复、图像融合)
  3. 技术性图文还原那些腿长得能改变地球引力场的TB奇女子
  4. 新闻通稿 | 2021年世界互联网大会乌镇峰会网络法治分论坛圆满举行
  5. AI大师张钹领衔,清华AI研究院推出知识计算开放平台
  6. 收藏 | 数据分析师最常用的10个机器学习算法!(附图解)
  7. 剑指offer:反转链表 python实现
  8. 【内推】腾讯优图(深圳)实验室招计算机视觉算法实习生
  9. 31岁成为博导!从小乡村走出的985高校教授坦言:读书这条路最简单...
  10. 涨点明显 | 全面刷新COCO检测和分割Top-1(附论文下载)