数据预处理的目的是使原始数据更适用于神经网络处理,包括向量化、标准化、处理缺失值和特征提取
神经网络的所有输入和目标都必须是浮点数张量(在特定情况下可以是正数张量),无论处理什么数据都必须首先将其转换为张量。(比如使用one-hot编码)
一般来说,将取值相对较大的数据或异质数据(一个数据的特征在0 ~ 1范围内,另一个特征在100 ~ 200)输入到神经网络是不安全的,输入数据应该具有以下特征:
(1)取值较小:大部分值都应该在0~1范围内
(2)同质性:所有特征的取值大概在相同的范围内
常用的标准化方法:
(1)将每个特征分别标准化,使其平均值为0
(2)将每个特征分别标准化,使其标准差为1
以简单的两层网络为例
from keras import models
from keras import layers
model = model.Squential()
model.add(layers.Dense(32, activation='relu',input_shape=(784,)))
model.add(layers.Dense(10, activation='softmax'))
用函数式API定义与上述相同模型
input_tensor = layers.Input(shape=(784,))
x = layers.Dense(32,activation = 'relu')(input_tensor)
output_tensor = layers.Dense(10,activation = 'softmax')(x)
model = models.Model(inputs=input_tensor, outputs=output_tensor )
model.compile(optimizer = ‘’, loss = ‘’, metrics = ‘’)
一旦模型构建完成了,使用的是Sequential还是函数式API就已经不重要了
输入为:
train_data
label_data
输入为:
generator: 训练数据生成器,输出为(inputs,target)的元组
steps_per_epoch:整数,当生成器返回steps_per_epoch次数据时计一个epoch结束,执行下一个epoch
epochs:数据的迭代轮次
validation_data: 验证数据生成器,输出为(inputs,target)的元组
validation_steps=当validation_data为生成器时,本参数指定验证集的生成器返回次数
callbacks:回调函数,比如可以回调ModelCheckpoint保存模型结构和参数,边训练边保存
verbose:0 = 安静模式, 1 = 进度条, 2 = 每轮一行
model.evaluate()输入为测试数据和标签,输出为损失值和自定的指标(比如精确度acc)
model.predict()输入为测试数据,输出为预测结果
详细见https://www.zhihu.com/question/313111229
model.save() 只能保存网络结构
model.save_weights() 只能保存网络权重
tf.keras.callbacks.ModelCheckpoint()则既能保存网络结构又能保存权重,可以在训练过程中保存模型
batch_size:深度学习模型不会同时处理整个数据集,而是将数据拆分成小批量。
epochs:1个epoch是所有训练样本的一轮正向传递和一轮反向传递,训练数据集总共有1000个样本。若batch_size=10,那么训练完全体样本集需要100次迭代即100步(steps_per_epoch),1次epoch。
steps_per_epoch:一轮epoch包含的步数(每一步是batch_size个数据送入)。若总共有100张训练图片,且batch_size批大小为50,则steps_per_epoch值为2。
下面给出的部分代码使用tf.keras离线搭建网络、编译、训练,并利用回调函数保存模型,然后在线上先加载模型进而利用测试数据集对模型进行评估。
input_bits = Input(shape=(payloadBits_per_OFDM * 2,))
temp = BatchNormalization()(input_bits)
temp = Dense(n_hidden_1, activation='relu')(input_bits)
temp = BatchNormalization()(temp)
temp = Dense(n_hidden_2, activation='relu')(temp)
temp = BatchNormalization()(temp)
temp = Dense(n_hidden_3, activation='relu')(temp)
temp = BatchNormalization()(temp)
out_put = Dense(n_output, activation='sigmoid')(temp)
model = Model(input_bits, out_put)
model.compile(optimizer='adam', loss='mse', metrics=[bit_err])
model.summary()
checkpoint = callbacks.ModelCheckpoint('./temp_trained_25.h5', monitor='val_bit_err',
verbose=0, save_best_only=True, mode='min', save_weights_only=True)
model.fit_generator(
training_gen(1000,25), # 生成器,生成训练数据
steps_per_epoch=50, # 每轮步数 说明一共分为了1000/50=20个小批量
epochs=100,
validation_data=validation_gen(1000, 25), # 生成器,生成验证数据
validation_steps=1,
callbacks=[checkpoint], # 利用回调函数中odelCheckpoint的将模型参数存起来,路径在checkpoint中
verbose=2) # 0 = 安静模式, 1 = 进度条, 2 = 每轮一行
########################## 离线 ##########################
model.load_weights('./temp_trained_25.h5')
y = model.evaluate(
validation_gen(1000),
steps=1
)
[1] https://blog.csdn.net/zhangphil/article/details/103438558
[2]https://blog.csdn.net/weixin_39274659/article/details/107748483
[3]Deep Learning with Python