选择神经网络的各层需要根据具体问题和数据集的特点进行调整,一般可以通过以下步骤来进行:
1.确定输入数据的维度和特征数量,这有助于确定网络的输入层的节点数。
2.根据任务类型和输出数据的形式,确定输出层的节点数和激活函数。
3.针对中间的隐藏层,可以先使用较少的层数和节点数进行试验,逐步增加并观察效果。也可以参考已有的经验或文献推荐的架构进行选择。
4.对于某些特殊的任务,如图像分类或序列预测,可以采用常见的卷积神经网络或循环神经网络。
在使用Keras搭建神经网络时,选择添加的层主要取决于你的具体任务和数据集。下面是几个常见的层类型及其用途:
1.循环神经网络(Recurrent Neural Network,RNN)是一种神经网络结构,它可以通过时间序列(或其他有序序列)中的先前信息来改进预测和分类的效果。RNN 的一个关键特点是其具有 “记忆性” ,即它可以保留过去的状态,并将其传递到当前的状态中,从而帮助模型更好地理解输入序列的上下文和依赖关系。
2.卷积神经网络(Convolutional Neural Network,CNN)是一种深度学习算法,通常用于图像识别和计算机视觉任务。它利用卷积层和池化层对输入的图像进行特征提取和降维,再通过全连接层进行分类或回归等任务。
3.GAT(Graph Attention Network)是一种图神经网络模型,通过注意力机制来对图数据进行建模和预测。它能够自适应地学习每个节点与其邻居节点之间的重要性,并考虑全局信息来提高模型的表现。
from tensorflow import keras
import tensorflow as tf
# 解码
def decodeExample(example):
feature_description = {
'x': tf.io.VarLenFeature(tf.float32),
'y': tf.io.FixedLenFeature([], tf.int64, default_value=0)
}
parsed = tf.io.parse_single_example(example, features=feature_description)
x = parsed['x']
x = tf.cast(x, dtype=tf.float64)
x = tf.sparse.to_dense(x, default_value=0)
# 补0的代码,统一数据长度
rawShape = tf.shape(
tf.transpose(
tf.stack(
# 分解成768行
tf.split(x, 768))))
paddingSize = tf.pad(
tf.reshape(tf.constant([128, 768]) - rawShape, [2, 1]), # [78, 768] 50, 0 [[50], [0]] [[0,50],[0,0]]
tf.constant([[0, 0], [1, 0]]))
x = tf.pad(
tf.reshape(x, rawShape),
paddingSize)
y = parsed['y']
return x, y
# 数据集路径及模型保存路径
dataPath = "E:/AI/dataFind/"
trainFile = dataPath + "trian.tfrecord"
testFile = dataPath + "test.tfrecord"
valFile = dataPath + "val.tfrecord"
checkpoint_filepath = dataPath + "model_AI"
'''解决数据集过大问题:调整batchSize大小'''
batchSize = 32 # 每批样品的数量,即表示一次性喂给神经网络多少数据,指定一次异步从缓存中读取数量
epoches = 50 # 神经网络的训练次数
# 读取数据
# 训练集
train_dataset = tf.data.TFRecordDataset(trainFile) # 读取TFrecord格式数据
train_dataset = train_dataset.map(decodeExample) # 解码操作
train_dataset = train_dataset.batch(batchSize) # 指定一次异步从缓存中读取数量
# 测试集
test_dataset = tf.data.TFRecordDataset(testFile)
test_dataset = test_dataset.map(decodeExample)
test_dataset = test_dataset.batch(batchSize)
# 验证集
val_dataset = tf.data.TFRecordDataset(valFile)
val_dataset = val_dataset.map(decodeExample)
val_dataset = val_dataset.batch(batchSize)
lstmSize = 128 # LSTM层的节点数
dropoutRate = 0.3 # 遗忘率
learningRate = 0.001 # 学习率
# 模型搭建,构建序列模型,一层一层线性添加堆叠网络层
model = keras.Sequential(
[keras.Input(shape=(128, 768)), # 输入层,指定输入数据的维数
keras.layers.Masking(), # 遮盖层,样本数据经过填充后具有了统一长度,告知模型忽略此填充
keras.layers.LSTM(lstmSize, kernel_regularizer=keras.regularizers.l2()), # LSTM层,指定节点数和正则化模式
keras.layers.Dropout(dropoutRate), # 遗忘层,遗忘率,设置训练期间的每一步将输入单位随机设置为0的概率
keras.layers.Dense(2, activation="softmax", kernel_regularizer=keras.regularizers.l2())
# 全连接层,指定神经元个数,激活函数,正则化模式
]
)
# 模型编译
model.compile(
optimizer=keras.optimizers.Adamax(learning_rate=learningRate), # 优化函数
loss=keras.losses.SparseCategoricalCrossentropy(), # 损失函数
metrics=[keras.metrics.SparseCategoricalAccuracy()] # 性能评估
)
'''实现早停(Early Stopping):在训练过程中指定回调函数callbacks实现早停,ModelCheckPoint中保存最佳模型'''
# 早停函数1:通过损失函数判断
callback = tf.keras.callbacks.EarlyStopping(monitor='loss', patience=3)
# 早停函数2:通过验证集性能指标判断
model_checkpoint_callback = tf.keras.callbacks.ModelCheckpoint(
filepath=checkpoint_filepath + str(n), # 保存最佳模型路径
save_weights_only=False, # 为True则只保存权重,False保存完整模型
monitor='val_sparse_categorical_accuracy', # 要监测的评估指标
mode='max', # 指定覆盖保存文件时的模式,在save_best_only=True下,是否覆盖保存文件的决定就取决于被监测数据的最大或者最小值。
save_best_only=True # 保存最佳模型,为True,则被监测数据的最佳模型就不会被覆盖
)
early_stopping_callback = tf.keras.callbacks.EarlyStopping(
monitor='val_sparse_categorical_accuracy', # 要监测的评估指标
mode='max', # 模式,性能指标是 max,而对于损失函数值是 min,auto下由被监测值的名字自动推断
patience=15, # 对设置的monitor多少个epoch内没有改进后将停止训练,patient不宜设置过小,防止因为前期抖动导致过早停止训练。也不宜设置过大,可能导致无法触发早停条件
restore_best_weights=True # 为True,则自动查找最优的monitor指标时的模型参数
)
# 模型训练
history = model.fit(train_dataset, # 训练集
epochs=epoches, # 神经网络的训练次数
validation_data=val_dataset, # 验证集:在每个epoch之后,或者每几个epoch,验证一次验证集,用来及早发现问题,比如过拟合,或者超参数设置有问题
callbacks=[model_checkpoint_callback, early_stopping_callback], # 使用早停函数2
verbose=1 # 模式0为静音,模式1在回调执行操作时显示消息
)
# 训练过程中的评价指标变化
loss_per = history.history['loss']
sparse_categorical_accuracy_per = history.history['sparse_categorical_accuracy']
val_loss_per = history.history['val_loss']
val_sparse_categorical_accuracy_per = history.history['val_sparse_categorical_accuracy']
# 模型预测
predictions = history.predict(test_dataset)
print(predictions)
总之,选择神经网络各层需要结合实际情况进行灵活调整,并进行反复试验和优化来提高模型性能。