Keras深度学习模型训练中数据归一化的重要性

版权申诉
0 下载量 147 浏览量 更新于2024-10-30 收藏 47KB ZIP 举报
资源摘要信息:"tf.keras_分类模块数据归一化.ipynb_quietlyxoc_keras_归一化_lateory_tf.keras_源" 在深度学习模型中,数据预处理是一个重要的步骤,它可以影响到模型训练的效率和最终的性能。数据归一化是预处理中常见的一种技术,用于将输入数据缩放到一个特定的范围,通常是[0, 1]或者[-1, 1]。本篇资源以tf.keras框架下的分类模块数据归一化为主题,详细阐述了归一化在机器学习中的作用、必要性以及如何在tf.keras中进行数据归一化。 首先,归一化的作用是什么呢?在机器学习尤其是深度学习中,数据的规模往往对模型的收敛速度和稳定性有着直接的影响。若特征数据的数值范围差异较大,未归一化的数据会导致优化算法(如梯度下降法)难以收敛,因为梯度会随着数值的大小不等出现梯度爆炸或者梯度消失的问题。梯度爆炸是指梯度的值过大,导致权重更新幅度剧烈,从而使得模型无法正常学习。梯度消失则是指梯度的值过小,导致权重更新幅度微小,模型难以学习到数据的特征。通过归一化处理,可以将各特征数据缩放到相同的规模,这样有助于提升模型的训练效率和效果。 其次,在tf.keras框架下,数据归一化的实现通常有两种方法:一种是使用Keras自带的数据预处理层,另一种是使用tf提供的函数进行手动归一化。Keras提供了如`tf.keras.layers.Normalization`层,可以在模型构建时集成进去,它会自动归一化输入数据。手动归一化则需要使用`tf.range()`或`tf.constant()`等函数来手动计算每个特征的最小值和最大值,并通过减去最小值除以最大值减去最小值的方式,将特征值归一化到[0, 1]区间。 在描述中提到的“将训练数据归一化,归一化不但有用,作用还是很巨大的”,说明了归一化在机器学习中的重要性。归一化能够减少训练时间,提升模型的收敛速度,避免梯度问题导致的训练不稳定,增强模型的泛化能力。此外,归一化还可以帮助消除不同特征之间的尺度影响,使得模型更加注重于特征的模式而非数值大小,这对于分类任务尤其重要。 在实际应用中,归一化的方法也要根据具体情况选择。对于那些使用激活函数如sigmoid或tanh的网络,由于这些激活函数的输入范围限制在[-1, 1]或[0, 1],因此进行归一化是必要的。而对于使用ReLU激活函数的网络,则归一化的要求不是那么严格,尽管如此,适当的归一化仍然可以带来一些好处。 最后,归一化是深度学习模型训练前的一个关键步骤,与模型优化算法的选择、损失函数的设计以及超参数的调整同等重要。归一化技术的合理应用,能够使模型训练更加高效,有助于深度学习模型在各种任务中取得更好的性能。在tf.keras框架下,数据归一化操作的实现相对简便,可以更进一步提高机器学习的效率和效果。

import tensorflow as tf import pickle import pandas as pd from sklearn.model_selection import train_test_split from sklearn.preprocessing import MinMaxScaler import matplotlib.pyplot as plt # 从Excel文件中读取数据 data = pd.read_excel('D:\python-learn\data.xlsx', engine='openpyxl') input_data = data.iloc[:, :12].values #获取Excel文件中第1列到第12列的数据 output_data = data.iloc[:, 12:].values #获取Excel文件中第13列到最后一列的数据 # 数据归一化处理 scaler_input = MinMaxScaler() scaler_output = MinMaxScaler() input_data = scaler_input.fit_transform(input_data) output_data = scaler_output.fit_transform(output_data) # 划分训练集和验证集 X_train, X_val, y_train, y_val = train_test_split(input_data, output_data, test_size=0.1, random_state=42) # 定义神经网络模型 model = tf.keras.Sequential([ tf.keras.layers.Input(shape=(12,)), tf.keras.layers.Dense(10, activation=tf.keras.layers.LeakyReLU(alpha=0.1)), tf.keras.layers.Dense(10, activation=tf.keras.layers.LeakyReLU(alpha=0.1)), tf.keras.layers.Dense(10, activation=tf.keras.layers.LeakyReLU(alpha=0.1)), tf.keras.layers.Dense(8, activation='linear') ]) # 编译模型 model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.001), loss='mse') # 定义学习率衰减 def scheduler(epoch, lr): if epoch % 50 == 0 and epoch != 0: return lr * 0.1 else: return lr callback = tf.keras.callbacks.LearningRateScheduler(scheduler) # 训练模型 history = model.fit(X_train, y_train, validation_data=(X_val, y_val), epochs=200, batch_size=50, callbacks=[callback])文件中的数据是怎么样进行训练的

2023-06-08 上传

import tensorflow as tf import pandas as pd from sklearn.model_selection import train_test_split from sklearn.preprocessing import MinMaxScaler import matplotlib.pyplot as plt # 从Excel文件中读取数据 data = pd.read_excel('E:\学习\python\data2.xlsx', engine='openpyxl') input_data = data.iloc[:, :12].values #获取Excel文件中第1列到第12列的数据 output_data = data.iloc[:, 12:].values #获取Excel文件中第13列到最后一列的数据 # 数据归一化处理 scaler_input = MinMaxScaler() scaler_output = MinMaxScaler() input_data = scaler_input.fit_transform(input_data) output_data = scaler_output.fit_transform(output_data) # 划分训练集和验证集 X_train, X_val, y_train, y_val = train_test_split(input_data, output_data, test_size=0.1, random_state=42) # 定义神经网络模型 model = tf.keras.Sequential([ tf.keras.layers.Input(shape=(12,)), tf.keras.layers.Dense(10, activation=tf.keras.layers.LeakyReLU(alpha=0.1)), tf.keras.layers.Dense(10, activation=tf.keras.layers.LeakyReLU(alpha=0.1)), tf.keras.layers.Dense(10, activation=tf.keras.layers.LeakyReLU(alpha=0.1)), tf.keras.layers.Dense(8, activation='linear') ]) # 编译模型 model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.001), loss='mse') # 定义学习率衰减 def scheduler(epoch, lr): if epoch % 50 == 0 and epoch != 0: return lr * 0.1 else: return lr callback = tf.keras.callbacks.LearningRateScheduler(scheduler) # 训练模型 history = model.fit(X_train, y_train, validation_data=(X_val, y_val), epochs=200, batch_size=50, callbacks=[callback]) # 导出损失函数曲线 plt.plot(history.history['loss'], label='Training Loss') plt.plot(history.history['val_loss'], label='Validation Loss') plt.xlabel('Epoch') plt.ylabel('Loss') plt.legend() plt.savefig('loss_curve.png')

2023-06-06 上传