Numpy批次训练

文章介绍了在PyTorch中使用全部数据训练与批次训练神经网络的区别,指出批次训练可以提高训练速度且保持较高测试准确性。作者还提供了两种批次训练函数实现方式并进行了时间对比。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

  在上一章《Pytorch神经网络》中说过,我们将探究优化器。但是,在进入优化器章节之前,我们还需要聊聊批次训练。代码中出现的starknn是来自《Numpy神经网络》中的代码。

import numpy as np
import time
from sklearn.datasets import make_moons
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
import starknn#导入自己写的模块
#初始化模型参数
nn_cfg = [{"in_features": 2,  "out_features": 25, "activation": "relu"},#(2,25)
          {"in_features": 25,  "out_features": 50, "activation": "relu"},#(25,50)
          {"in_features": 50,  "out_features": 50, "activation": "relu"},#(50,50)
          {"in_features": 50,  "out_features": 25, "activation": "relu"},#(50,25)
          {"in_features": 25,  "out_features": 2, "activation": "sigmoid"}]#(25,2)
#准备数据
X, y = make_moons(n_samples = 1000, noise=0.3)#数据和标签
x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0.1, random_state=42)#拆分数据集,训练集:测试集=9:1
y_train = starknn.idx2onehot(y_train)#标签转化,独热编码

一、全部数据训练

start = time.time()
params, acc_history, cost_history = starknn.train(x_train, y_train, nn_cfg, 10000, 0.01)
end = time.time()
print('The full data time is {:.2f} second.'.format(end-start))
#测试
y_hat, _ = starknn.forward_full_layer(x_test, params, nn_cfg)
test_accuracy = starknn.calc_accuracy(y_hat, y_test, train=False)
print('The accuracy of this test dataset is {}%.'.format(test_accuracy * 100))
The full data time is 48.71 second.
The accuracy of this test dataset is 93.0%.

  上面的训练方法是,一次性把所有的数据都拿给神经网络训练,其实不太利于模型对数据的学习。熟话说得好啊,饭吃七分饱,话说三分满,所以我们尝试使用批次训练。

batch_size = 32#批次大小

二、批次训练(1)

#批次数据训练
def batch_train(X, Y, nn_cfg, epochs, learning_rate, batch_size, train=True):
    params = starknn.init_layers(nn_cfg, 2)
    num_batch = X.shape[0] // batch_size#数据数量整除批次大小
    acc_history = []
    cost_history = []
    for i in range(epochs):
        offset_idx = i % num_batch#一批次训练
        X_batch = X[offset_idx: (offset_idx + 1) * batch_size, :]
        Y_batch = Y[offset_idx: (offset_idx + 1) * batch_size, :]
        #前向传播
        Y_hat, memory = starknn.forward_full_layer(X_batch, params, nn_cfg)
        #计算准确率
        accuracy = starknn.calc_accuracy(Y_hat, Y_batch, train=train)
        #计算损失
        cost = starknn.calc_cost(Y_hat, Y_batch)
        acc_history.append(accuracy)
        cost_history.append(cost)
        #反向传播
        grads = starknn.full_backward_propagation(Y_hat, Y_batch, memory, params, nn_cfg)
        #更新参数
        params = starknn.update(params, grads, nn_cfg, learning_rate)    
    return params, acc_history, cost_history
start = time.time()
params, acc_history, cost_history = batch_train(x_train, y_train, nn_cfg, 10000, 0.01, batch_size)
end = time.time()
print('The mini batch data time is {:.2f} second.'.format(end-start))
#测试
y_hat, _ = starknn.forward_full_layer(x_test, params, nn_cfg)
test_accuracy = starknn.calc_accuracy(y_hat, y_test, train=False)
print('The accuracy of this test dataset is {}%.'.format(test_accuracy * 100))
The mini batch data time is 32.16 second.
The accuracy of this test dataset is 91.0%.

三、批次训练(2)

def another_batch(X, Y, nn_cfg, epochs, learning_rate, batch_size, train=True):
    params = starknn.init_layers(nn_cfg, 2)
    num_batch = X.shape[0] // batch_size#数据数量整除批次大小
    acc_history = []
    cost_history = []
    for epoch in range(epochs):
        for offset_idx in range(num_batch):
            X_batch = X[offset_idx: (offset_idx + 1) * batch_size, :]
            Y_batch = Y[offset_idx: (offset_idx + 1) * batch_size, :]
            #前向传播
            Y_hat, memory = starknn.forward_full_layer(X_batch, params, nn_cfg)
            #计算准确率
            accuracy = starknn.calc_accuracy(Y_hat, Y_batch, train=train)
            #计算损失
            cost = starknn.calc_cost(Y_hat, Y_batch)
            acc_history.append(accuracy)
            cost_history.append(cost)
            #反向传播
            grads = starknn.full_backward_propagation(Y_hat, Y_batch, memory, params, nn_cfg)
            #更新参数
            params = starknn.update(params, grads, nn_cfg, learning_rate)  
    return params, acc_history, cost_history
start = time.time()
params, acc_history, cost_history = another_batch(x_train, y_train, nn_cfg, 10000//(x_train.shape[0]//batch_size), 0.01, batch_size)
end = time.time()
print('The another batch data time is {:.2f} second.'.format(end-start))
#测试
y_hat, _ = starknn.forward_full_layer(x_test, params, nn_cfg)
test_accuracy = starknn.calc_accuracy(y_hat, y_test, train=False)
print('The accuracy of this test dataset is {}%.'.format(test_accuracy * 100))
The another batch data time is 34.70 second.
The accuracy of this test dataset is 93.0%.

  (1)和(2)中的批次训练是一致的,只是换了一种写法。注意在(2)中传入的epochs就不再是10000,而是10000整除num_batch。在Pytorch中我一般采用第(2)种方式。

总结

  3种方法的结果都比较相近。批次训练的方法使用的时间要少一些,因为每次进行的矩阵(batch_size,2)要比全数据运算的矩阵(900, 2)计算量要小很多。每个epoch计算量较小,计算的速度就要快点。ok,准备就绪。下一章节就开始聊聊优化器,敬请期待。

<think>好的,我现在需要帮助用户了解如何使用TensorFlow加载NumPy数据并进行模型训练。首先,用户的问题明确提到需要教程式的指导,所以我得一步步来,确保结构清晰。根据用户提供的引用内容,特别是引用[1]中提到的将Pandas DataFrame转换为字典的方法,以及引用[2]中加载模型的代码,我需要将这些信息整合到回答中。 首先,我应该从数据准备开始。用户可能已经有一些NumPy数据,但需要知道如何正确加载到TensorFlow中。可能需要提到如何将NumPy数组转换为TensorFlow可以处理的格式,比如使用tf.data.Dataset,这在处理大数据集时效率更高。同时,引用[1]提到Keras模型不自动转换Pandas DataFrame,但这里用户用的是NumPy,所以可能不需要处理DataFrame,但或许可以提到类似的情况,比如如何组织多个特征,可能需要将数据转换为字典形式,如titanic_features_dict的例子。 接下来是构建模型。这里应该给出一个简单的模型示例,比如使用Keras的Sequential模型,添加几个层,比如Dense层,并选择合适的激活函数。这部需要确保代码正确,语法无误,符合用户要求的LaTeX格式,比如变量用$符号包裹。 然后是模型编译,需要解释优化器、损失函数和评估指标的选择。这里可能需要提到常用的Adam优化器和交叉熵损失函数,适用于类任务。 训练模型部需要展示model.fit()的用法,并说明参数如epochs和batch_size的作用。同时,根据引用[2]中的加载模型代码,可能需要在训练后保存模型,并给出保存和加载的示例代码,这样用户知道如何保存训练好的模型以便后续使用。 此外,用户可能关心数据预处理的步骤,比如归一化或标准化。这部需要补充,比如使用StandardScaler来处理数据,确保输入特征尺度一致,这对模型训练很重要。 验证和测试阶段也是关键,需要指导用户如何划数据集,使用validation_data参数,并解释训练过程中的输出,如loss和accuracy的变化。 最后,生成相关问题时要考虑用户可能的后续问题,比如处理大数据集、自定义模型、保存加载模型、数据预处理以及监控训练过程的方法。这些问题需要覆盖用户可能遇到的下一步挑战,确保他们能够进一步深入学习。 整个过程中,需要确保使用正确的中文表达,避免术语错误,代码示例要简洁有效,并且引用标记自然添加。同时,注意用户提供的引用内容,适当融入回答中,增强回答的可信度和相关性。需要检查是否有遗漏步骤,比如数据预处理或模型评估的细节,确保回答全面且易于理解。</think>以下是使用TensorFlow加载NumPy数据并进行模型训练的步骤说明: --- ### 一、数据准备 1. **加载NumPy数据** ```python import numpy as np # 假设已存在NumPy格式的特征和标签 features = np.random.rand(1000, 5) # 1000个样本,5个特征 labels = np.random.randint(0, 2, size=1000) # 二类标签 ``` 2. **转换为TensorFlow数据集** ```python import tensorflow as tf dataset = tf.data.Dataset.from_tensor_slices((features, labels)) dataset = dataset.shuffle(1000).batch(32) # 打乱数据并批次 ``` --- ### 二、构建模型 ```python model = tf.keras.Sequential([ tf.keras.layers.Dense(64, activation='relu', input_shape=(5,)), # 输入层对应5个特征 tf.keras.layers.Dense(32, activation='relu'), tf.keras.layers.Dense(1, activation='sigmoid') # 二类输出 ]) ``` --- ### 三、编译模型 ```python model.compile( optimizer='adam', # 优化器选择Adam loss='binary_crossentropy', # 二类交叉熵损失函数 metrics=['accuracy'] ) ``` --- ### 四、训练模型 ```python model.fit(dataset, epochs=10) # 训练10轮次 ``` - **参数说明**: - `epochs`: 数据遍历次数 - `batch_size`: 默认与数据集批次大小一致(此处已通过`.batch(32)`设置) --- ### 五、保存与加载模型(可选) ```python # 保存模型 model.save('my_model.h5') # 加载模型(引用[2]方法扩展) loaded_model = tf.keras.models.load_model('my_model.h5') ``` --- ### 六、补充说明 1. **数据预处理**: 若特征需归一化,可使用: ```python from sklearn.preprocessing import StandardScaler scaler = StandardScaler() features = scaler.fit_transform(features) ``` 2. **验证与测试**: 通过`validation_data`参数添加验证集: ```python model.fit(dataset, epochs=10, validation_data=val_dataset) ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值