1.神经网络搭建步骤
选择神经网络的各层需要根据具体问题和数据集的特点进行调整,一般可以通过以下步骤来进行:
1.确定输入数据的维度和特征数量,这有助于确定网络的输入层的节点数。
2.根据任务类型和输出数据的形式,确定输出层的节点数和激活函数。
3.针对中间的隐藏层,可以先使用较少的层数和节点数进行试验,逐步增加并观察效果。也可以参考已有的经验或文献推荐的架构进行选择。
4.对于某些特殊的任务,如图像分类或序列预测,可以采用常见的卷积神经网络或循环神经网络。
2.常见的层详解及其用途
在使用Keras搭建神经网络时,选择添加的层主要取决于你的具体任务和数据集。下面是几个常见的层类型及其用途:
-
input层:输入层,是神经网络中的第一层,它接收来自输入数据的信息并将其传递到下一层。
input层通常由多个神经元组成,每个神经元对应输入数据的一个特征或维度。在图像识别任务中,例如,input层可能会接收图像像素的值,每个神经元对应于图像的一个像素。在文本分类任务中,input层可能会接收单词的编号或向量表示,每个神经元对应于一个单词或向量的维度。对于每个输入数据,input层将计算它们的加权和,并应用一个非线性激活函数,例如sigmoid或ReLU,以产生下一层的输出。 -
Dense层:全连接层,用于将输入数据与权重矩阵相乘并加上偏置项,输出一个固定大小的向量。
Dense层是深度学习中最常用的网络层之一,它也被称为全连接层。在Dense层中,每个神经元都与前一层的所有神经元相连。因此,Dense层的参数数量随着输入和输出大小的增加而增加。
Dense层可以执行线性变换和非线性变换,通常使用激活函数(如ReLU)来实现非线性变换。在训练过程中,Dense层的参数会根据损失函数的梯度进行更新,以使模型逐渐优化并减小误差。
在实际应用中,Dense层通常作为神经网络的中间层或输出层。中间层的Dense层可以提取输入数据中的特征,而输出层的Dense层则可以将这些特征映射到目标变量上。 -
Convolutional层:卷积层,主要用于图像、语音等数据的特征提取。
它基于卷积运算原理,通过滑动卷积核在输入数据上进行计算,得到输出特征图。Convolutional层通常包括多个卷积核,每个卷积核都有自己的权重参数,可以学习不同的特征。Convolutional层还会对输出进行非线性变换,常用的激活函数包括ReLU、sigmoid和tanh等。Convolutional层一般还会采用池化操作来降低输出特征图的大小,减少模型的参数量,同时也可以增强模型的鲁棒性。 -
Pooling层:池化层,通过减少特征图的维度来降低模型的复杂度和计算量。
它的作用是在输入数据上滑动固定大小的窗口,并将每个窗口内的值进行池化操作,通常为取最大值或平均值,从而得到一个更小的输出。Pooling层可以帮助网络对平移、旋转等变换具有一定的不变性,提高模型的鲁棒性。常见的Pooling层包括Max Pooling和Average Pooling。 - Dropout层:随机失活层,用于防止过拟合,随机丢弃一些神经元,强制网络学习更加鲁棒的特征。
-
Activation层:激活函数层,用于对输入数据进行非线性变换。其作用是引入非线性因素,增强神经网络的表达能力,从而提高模型的预测性能。
常见的Activation函数包括sigmoid、tanh、ReLU等,它们在不同场景下有不同的使用效果。例如,sigmoid适用于二分类任务,tanh适用于多分类任务,ReLU适用于深度神经网络。
Activation层通常作为神经网络的中间层来使用,用于处理前一层输出的特征向量。在训练过程中,Activation层会根据损失函数对其参数进行优化,以获得更好的预测性能。 - Flatten层:扁平化层,用于将多维的输入数据展开成一维向量,方便输入到后面的全连接层中。
- MaxPooling层:最大池化层,通过选择一个局部区域内的最大值来降低数据维度和计算量。
- BatchNormalization层:批归一化层,对每个小批量数据进行标准化处理,加速训练过程。
- Embedding层:嵌入层,将离散型数据转换为连续型向量表示。
-
LSTM层:长短时记忆网络层,是一种常见的循环神经网络层,它可以有效地处理序列数据,并在长期依赖关系的情况下避免梯度消失/爆炸问题。
LSTM层由一系列细胞组成,每个细胞包含一个输入门、遗忘门、输出门和一个记忆单元。输入门控制哪些信息需要进入记忆单元,遗忘门控制哪些信息需要从记忆单元删除,而输出门控制从记忆单元中读取哪些信息并输出到下一层或输出层。记忆单元是一个存储状态的向量,可以存储历史信息并在必要时进行更新。。 - Concatenate层:连接层,将两个或多个张量连接在一起。
3.常见神经网络
1.循环神经网络(Recurrent Neural Network,RNN)是一种神经网络结构,它可以通过时间序列(或其他有序序列)中的先前信息来改进预测和分类的效果。RNN 的一个关键特点是其具有 “记忆性” ,即它可以保留过去的状态,并将其传递到当前的状态中,从而帮助模型更好地理解输入序列的上下文和依赖关系。
2.卷积神经网络(Convolutional Neural Network,CNN)是一种深度学习算法,通常用于图像识别和计算机视觉任务。它利用卷积层和池化层对输入的图像进行特征提取和降维,再通过全连接层进行分类或回归等任务。
3.GAT(Graph Attention Network)是一种图神经网络模型,通过注意力机制来对图数据进行建模和预测。它能够自适应地学习每个节点与其邻居节点之间的重要性,并考虑全局信息来提高模型的表现。文章来源:https://www.toymoban.com/news/detail-464280.html
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)
总之,选择神经网络各层需要结合实际情况进行灵活调整,并进行反复试验和优化来提高模型性能。文章来源地址https://www.toymoban.com/news/detail-464280.html
到了这里,关于如何使用Keras选择添加的层并搭建神经网络?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!