如何使用Keras选择添加的层并搭建神经网络?


1.神经网络搭建步骤

选择神经网络的各层需要根据具体问题和数据集的特点进行调整,一般可以通过以下步骤来进行:

1.确定输入数据的维度和特征数量,这有助于确定网络的输入层的节点数。
2.根据任务类型和输出数据的形式确定输出层的节点数和激活函数
3.针对中间的隐藏层,可以先使用较少的层数和节点数进行试验,逐步增加并观察效果。也可以参考已有的经验文献推荐的架构进行选择。
4.对于某些特殊的任务,如图像分类或序列预测,可以采用常见的卷积神经网络或循环神经网络

2.常见的层详解及其用途

在使用Keras搭建神经网络时,选择添加的层主要取决于你的具体任务和数据集。下面是几个常见的层类型及其用途:

  1. input层:输入层,是神经网络中的第一层,它接收来自输入数据的信息并将其传递到下一层
    input层通常由多个神经元组成,每个神经元对应输入数据的一个特征或维度。在图像识别任务中,例如,input层可能会接收图像像素的值,每个神经元对应于图像的一个像素。在文本分类任务中,input层可能会接收单词的编号或向量表示,每个神经元对应于一个单词或向量的维度。对于每个输入数据,input层将计算它们的加权和,并应用一个非线性激活函数,例如sigmoid或ReLU,以产生下一层的输出。
  2. Dense层:全连接层,用于将输入数据与权重矩阵相乘并加上偏置项,输出一个固定大小的向量。
    Dense层是深度学习中最常用的网络层之一,它也被称为全连接层。在Dense层中,每个神经元都与前一层的所有神经元相连。因此,Dense层的参数数量随着输入和输出大小的增加而增加。
    Dense层可以执行线性变换和非线性变换,通常使用激活函数(如ReLU)来实现非线性变换。在训练过程中,Dense层的参数会根据损失函数的梯度进行更新,以使模型逐渐优化并减小误差。
    在实际应用中,Dense层通常作为神经网络的中间层或输出层。中间层的Dense层可以提取输入数据中的特征,而输出层的Dense层则可以将这些特征映射到目标变量上。
  3. Convolutional层:卷积层,主要用于图像、语音等数据的特征提取
    它基于卷积运算原理,通过滑动卷积核在输入数据上进行计算,得到输出特征图。Convolutional层通常包括多个卷积核,每个卷积核都有自己的权重参数,可以学习不同的特征。Convolutional层还会对输出进行非线性变换,常用的激活函数包括ReLU、sigmoid和tanh等。Convolutional层一般还会采用池化操作来降低输出特征图的大小,减少模型的参数量,同时也可以增强模型的鲁棒性。
  4. Pooling层:池化层,通过减少特征图的维度来降低模型的复杂度和计算量
    它的作用是在输入数据上滑动固定大小的窗口,并将每个窗口内的值进行池化操作,通常为取最大值或平均值,从而得到一个更小的输出。Pooling层可以帮助网络对平移、旋转等变换具有一定的不变性,提高模型的鲁棒性。常见的Pooling层包括Max Pooling和Average Pooling。
  5. Dropout层:随机失活层,用于防止过拟合,随机丢弃一些神经元,强制网络学习更加鲁棒的特征。
  6. Activation层:激活函数层,用于对输入数据进行非线性变换。其作用是引入非线性因素,增强神经网络的表达能力,从而提高模型的预测性能
    常见的Activation函数包括sigmoid、tanh、ReLU等,它们在不同场景下有不同的使用效果。例如,sigmoid适用于二分类任务,tanh适用于多分类任务,ReLU适用于深度神经网络。
    Activation层通常作为神经网络的中间层来使用,用于处理前一层输出的特征向量。在训练过程中,Activation层会根据损失函数对其参数进行优化,以获得更好的预测性能。
  7. Flatten层:扁平化层,用于将多维的输入数据展开成一维向量,方便输入到后面的全连接层中。
  8. MaxPooling层:最大池化层,通过选择一个局部区域内的最大值来降低数据维度和计算量。
  9. BatchNormalization层:批归一化层,对每个小批量数据进行标准化处理,加速训练过程。
  10. Embedding层:嵌入层,将离散型数据转换为连续型向量表示。
  11. LSTM层:长短时记忆网络层,是一种常见的循环神经网络层,它可以有效地处理序列数据,并在长期依赖关系的情况下避免梯度消失/爆炸问题
    LSTM层由一系列细胞组成,每个细胞包含一个输入门、遗忘门、输出门和一个记忆单元。输入门控制哪些信息需要进入记忆单元,遗忘门控制哪些信息需要从记忆单元删除,而输出门控制从记忆单元中读取哪些信息并输出到下一层或输出层。记忆单元是一个存储状态的向量,可以存储历史信息并在必要时进行更新。。
  12. Concatenate层:连接层,将两个或多个张量连接在一起。

3.常见神经网络

1.循环神经网络(Recurrent Neural Network,RNN)是一种神经网络结构,它可以通过时间序列(或其他有序序列)中的先前信息来改进预测和分类的效果。RNN 的一个关键特点是其具有 “记忆性” ,即它可以保留过去的状态,并将其传递到当前的状态中,从而帮助模型更好地理解输入序列的上下文和依赖关系。

2.卷积神经网络(Convolutional Neural Network,CNN)是一种深度学习算法,通常用于图像识别和计算机视觉任务。它利用卷积层和池化层对输入的图像进行特征提取和降维,再通过全连接层进行分类或回归等任务。

3.GAT(Graph Attention Network)是一种图神经网络模型,通过注意力机制来对图数据进行建模和预测。它能够自适应地学习每个节点与其邻居节点之间的重要性,并考虑全局信息来提高模型的表现。

4.代码示例

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)

总之,选择神经网络各层需要结合实际情况进行灵活调整,并进行反复试验和优化来提高模型性能。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>