keras.fit() 和 keras.fit_generator()

pythonserver side programmingprogramming

简介

Keras 中的 fit() 和 fit generator() 方法使得在 Python 中训练深度神经网络变得异常简单。fit() 方法可以高效地处理和训练批量数据,这对于可以加载到内存中的较小数据集特别有用。另一方面,fit generator() 方法可以动态加载和处理批量数据,更适合无法一次性加载到内存中的较大数据集。

Keras 基础知识

如今,技术在各个方面都得到了改进。因此,在这个技术和未来的先进环境中,Keras 已成为著名的 Python 库之一。它主要用于创建、评估和训练深度神经网络。这些深度神经网络模仿了人类大脑的结构和运作,是一种机器学习算法。图像识别、自然语言处理、语音识别等是它的一些活动。

fit() 方法

这是 Keras 用于模型训练的首选方法,它适用于中小型数据集。如果您的数据集太大而无法放入内存,则 fit() 函数需要您在训练之前将其完全放入内存中。无论如何,使用 fit() 技术很简单。只需输入您的训练数据、标签、时期数和批次大小。然后,Keras 通过迭代您的数据集来训练您的模型,迭代次数和批次大小已定义。fit() 方法非常适合基础训练,但它有局限性。

fit() 的局限性

Keras 的 fit() 函数通常用于训练深度神经网络 (DNN)。但是,它有明显的局限性,可能会限制其实用性。fit() 最严重的问题之一是处理大型数据集时。尽管 fit() 是一种强大且多功能的 DNN 训练工具,但大型数据集可能会导致 fit() 函数需要很长时间才能处理,从而导致项目延迟。内存使用是 fit() 的另一个限制。当您的内存有限时,这可能是一个严重的困难。它在定制方面也不是特别灵活。

fit_generator() 方法

fit_generator() 方法与 fit() 方法一样,在数据集上训练神经网络。唯一的变化是数据处理方式。虽然 fit() 会一次将整个数据集加载到内存中,但 fit_generator() 会分批处理数据。这种细微的区别可能看起来并不重要,但它提供了许多独特的好处。首先,它使您能够处理大得多的数据集。在训练过程中不会再出现内存不足的情况!此外,它还允许您以更复杂的方式自定义数据处理。

语法

fit() −

model.fit(x=x_train, y=y_train, batch_size=batch_size, epochs=epochs, validation_data=(x_val, y_val))

fit_generator −

model.fit_generator(generator=train_generator, steps_per_epoch=steps_per_epoch, epochs=epochs, validation_data=val_generator, validation_steps=val_steps)

解释

我们需要模型实例本身,它为训练过程奠定基础。接下来,您将需要输入数据 (x_train) 和标签 (y_train),它们将用于训练模型。

batch_size 选项指定在更新模型的内部参数之前将处理的样本数量。此值会影响训练过程的速度和效率。此外,epoch 数指定在训练期间将通过模型处理完整训练数据集的次数。

如果可用,您可以添加可选的 validation_data 来测试模型的性能并在整个训练过程中跟踪不同数据集上的损失。这允许您检查模型的泛化能力并进行任何必要的改进。

或者,您可以使用 train_generator,它可以动态生成训练数据批次。steps_per_epoch 选项指示生成器应为每个 epoch 生成多少个批次。类似地,val_generator 可以与 val_steps 参数一起使用,该参数指定验证生成器应为每个时期生成的批次数。

算法

  • 步骤 1 - 导入所有必要的库和模块。

  • 步骤 2 - 接下来请记住,加载或生成所有必需的训练和验证数据。

  • 步骤 3 - 必须使用 Keras API 来提供模型架构。

  • 步骤 4 - 设置损失函数、优化器和评估矩阵后编译模型

  • 步骤 5 - 要训练模型,请使用上述任何给定模型(即 fit() 或 fit_generator)

方法 1:使用 fit() 进行监督学习。

此代码指示计算机程序使用神经网络来学习数据中的模式。该程序有两层:一层寻找数据中的模式,另一层预测数据的类别。

示例

# 导入所需的库
import tensorflow as tf
from tensorflow import keras
import numpy as np
# 定义具有 2 层的 Sequential 模型
model = keras.Sequential([
    keras.layers.Dense(units=64,activation='relu',input_dim=100),
    keras.layers.Dense(units=10,activation='softmax')
])
# 使用所需配置编译模型
model.compile(loss='categorical_crossentropy',optimizer='sgd',metrics=['accuracy'])
# 创建虚拟数据集
x_train = np.random.random((1000, 100))
y_train = np.random.random((1000, 10))
# 训练模型
model.fit(x_train, y_train, epochs=20, batch_size=128)

输出

Epoch 1/20
8/8 [==============================] - 1s 3ms/step - loss: 12.2208 - accuracy: 0.1070
Epoch 2/20
8/8 [==============================] - 0s 3ms/step - loss: 12.6586 - accuracy: 0.1090
...
Epoch 20/20
8/8 [==============================] - 0s 2ms/step - loss: 35170420.0000 - accuracy: 0.1060
<keras.callbacks.History at 0x7f14d04b2c80>

方法 2:使用 Keras.fit_generator() 的示例

在此代码中,我们将使用 Keras 中的 ImageDataGenerator 类执行数据增强和重新缩放。数据生成器会即时生成批量数据,从而支持使用大规模数据集进行训练。

示例

import numpy as np
from keras.models import Sequential
from keras.layers import Dense
from keras.preprocessing.image import ImageDataGenerator
x_train = np.random.random((1000, 20))
y_train = np.random.randint(2, size=(1000, 1))
x_val = np.random.random((100, 20))
y_val = np.random.randint(2, size=(100, 1))
train_datagen = ImageDataGenerator(rescale=1./255)
val_datagen = ImageDataGenerator(rescale=1./255)
train_generator = train_datagen.flow(x_train, y_train, batch_size=32)
val_generator = val_datagen.flow(x_val, y_val, batch_size=32)
model = Sequential()
model.add(Dense(64, activation='relu', input_dim=20))
model.add(Dense(1, activation='sigmoid'))
model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['accuracy'])
model.fit_generator(generator=train_generator, steps_per_epoch=30, epochs=10, validation_data=val_generator, validation_steps=3)

输出

Epoch 1/10
30/30 [==============================] - 0s 5ms/step - loss: 0.7105 - accuracy: 0.4969 - val_loss: 0.6967 - val_accuracy: 0.4792
...
Epoch 10/10
30/30 [==============================] - 0s 2ms/step - loss: 0.6932 - accuracy: 0.5031 - val_loss: 0.6931 - val_accuracy: 0.4792

结论

请记住,fit() 方法非常适合小型数据集和简单模型,但它有其局限性。fit_generator() 方法为更大的数据集和更复杂的模型提供了更多的灵活性和自定义选项。根据您的特定需求明智选择。


相关文章


有用资源