目录
前言
📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过和节省时间与精力投入到更重要的就业和考试中去,学长分享优质的选题经验和毕设项目与技术思路。
🚀对毕设有任何疑问都可以问学长哦!
选题指导:
大家好,这里是海浪学长毕设专题,本次分享的课题是
🎯基于改进的生成对抗网络的垃圾邮件分类系统
设计思路
一、课题背景与意义
现有的垃圾邮件分类算法,包括朴素贝叶斯算法在内,通常依赖于大量的垃圾邮件样本来进行训练和分类。然而,在邮件系统建立初期,往往无法收集到足够数量的垃圾邮件样本。通过引入生成对抗网络的相关理论,提出了一种新的垃圾邮件分类算法,以解决在邮件系统建立初期缺乏足够垃圾邮件样本的问题。该算法结合了词嵌入和生成对抗网络的技术,通过词嵌入获取邮件特征,并利用生成对抗网络训练辨别器和生成器,从而扩大样本数据集并提高分类效率。
二、算法理论原理
2.1 词嵌入
词嵌入是将文本中的单词转化为向量表示的过程。词嵌入方法定义了一个映射函数,将每个单词映射为唯一的向量,并且保留了原始单词之间的相对关系。通过词嵌入映射后,文本数据可以借助更多的数学工具进行处理,例如通过比较词向量之间的欧几里得距离来衡量单词之间的相似性。
根据生成的向量类型,词向量可以分为独热表示和分布式表示。传统的词嵌入方法主要采用独热表示。然而,引入神经网络的方法在词嵌入领域取得了重大突破。CBOW模型和Skip-Gram模型等神经网络模型的提出极大地提升了词嵌入的性能。这些基于神经网络的词嵌入模型通常通过计算两个单词同时出现的概率来确定词向量中的具体数值。
2.2 生成对抗网络
生成对抗网络(GAN)是一种新型的生成模型,主要应用于图像生成、文字图像转换等领域。GAN可以从训练样本中学习并生成新的样本,而无需进行繁琐的标记工作,因此在无监督学习问题中具有重要的作用。
GAN由生成器和辨别器组成。生成器根据输入的噪音数据生成样本数据,而辨别器则负责判断输入的样本是来自生成器还是原始数据集。通过对生成器和辨别器的训练,可以提高生成器生成样本与原始数据集样本的相似度,同时也增强辨别器的分辨能力,将无监督学习问题转化为监督学习问题。相较于传统方法,GAN的主要优点是能够将学习从无监督学习转化为监督学习,从而在无监督学习和半监督学习领域具有更大的应用潜力。
def build_generator(latent_dim):
model = tf.keras.Sequential()
model.add(layers.Dense(256, input_dim=latent_dim, activation='relu'))
model.add(layers.Dense(512, activation='relu'))
model.add(layers.Dense(1024, activation='relu'))
model.add(layers.Dense(784, activation='tanh'))
model.add(layers.Reshape((28, 28, 1)))
return model
def build_discriminator():
model = tf.keras.Sequential()
model.add(layers.Flatten(input_shape=(28, 28, 1)))
model.add(layers.Dense(512, activation='relu'))
model.add(layers.Dense(256, activation='relu'))
model.add(layers.Dense(1, activation='sigmoid'))
return model
当训练数据量较大时,生成模型可以模拟这些数据的高维分布。而当缺乏足够的训练数据时,生成模型能够通过添加噪声的方式生成数据,从而提高数据的数量。研究发现,生成模型生成的样本往往会被分类到与原样本不同的类别中,而它们之间的差异常常是人眼无法察觉的。这表明生成模型生成的样本与原样本存在一定的差别,因此生成模型更适合于样本数量较少的应用。在垃圾邮件过滤等领域,由于某些新兴类型的垃圾邮件样本数据较少,生成模型正好可以应用于此类情况,因此将GAN引入垃圾邮件处理具有现实意义。
def build_gan(generator, discriminator):
discriminator.trainable = False
model = tf.keras.Sequential([generator, discriminator])
return model
def train_gan(generator, discriminator, gan, epochs, batch_size, latent_dim, real_samples):
for epoch in range(epochs):
for batch in range(real_samples // batch_size):
real_images = X_train[batch * batch_size : (batch + 1) * batch_size]
noise = tf.random.normal(shape=(batch_size, latent_dim))
fake_images = generator.predict(noise)
X = tf.concat([real_images, fake_images], axis=0)
y = tf.concat([tf.ones((batch_size, 1)), tf.zeros((batch_size, 1))], axis=0)
discriminator_loss = discriminator.train_on_batch(X, y)
noise = tf.random.normal(shape=(batch_size, latent_dim))
y = tf.ones((batch_size, 1))
generator_loss = gan.train_on_batch(noise, y)
print(f"Epoch {epoch+1}/{epochs}, Generator Loss: {generator_loss}, Discriminator Loss: {discriminator_loss}")
latent_dim = 100
batch_size = 64
epochs = 10000
(X_train, _), (_, _) = tf.keras.datasets.mnist.load_data()
X_train = X_train.reshape((X_train.shape[0], 28, 28, 1)).astype('float32')
X_train = (X_train - 127.5) / 127.5
generator = build_generator(latent_dim)
discriminator = build_discriminator()
2.3 算法框架
算法的框架包括训练任务和分类任务两个主要部分:
在训练任务中,首先设计一个合适的词嵌入模型,用于将离散的文本数据(邮件内容)向量化,以便能够输入到生成对抗网络中进行处理。词嵌入模型可以将每个单词映射到一个连续的向量空间,捕捉单词之间的语义和语法关系。常用的词嵌入模型包括Word2Vec、GloVe和BERT等。通过使用词嵌入模型,可以将文本数据表示为低维的连续向量,从而提供了更好的特征表示。
选择一个合适的生成对抗网络模型来训练。生成对抗网络由生成器和辨别器组成。生成器接收随机噪声向量作为输入,并生成类似于真实邮件的向量化文本伪造数据。辨别器则负责将生成的伪造数据与真实数据进行区分。通过训练生成对抗网络,生成器不断改进生成的伪造数据的质量,而辨别器则学习更好地区分真实数据和伪造数据。
在训练任务完成后,进行分类任务。利用训练任务得到的辨别器模型,将待分类的邮件输入辨别器进行判断,将邮件分为垃圾邮件和正常邮件两类。辨别器在训练过程中已经学习到了区分真实数据和伪造数据的能力,因此可以应用于实际的垃圾邮件分类任务中。
垃圾邮件分类问题可以通过词嵌入技术将邮件转化为特征矩阵,并利用生成对抗网络进行分类。生成对抗网络的输入包括邮件的特征矩阵和对应的标签。在训练过程中,生成器根据噪声函数生成伪造样本,并将其标注为第三类(伪造邮件),与真实数据一起输入到辨别器进行训练。辨别器通过softmax函数将输入转换为概率分布向量,表示样本属于不同类别的概率。通过调整参数,辨别器可以获得更好的训练效果。同时,从样本中提取伪造样本的结果,可作为生成器参数调整的依据。
word_embeddings = create_word_embeddings(emails)
for epoch in range(num_epochs):
fake_samples = generator(noise_function(), labels="Fake")
combined_samples = concatenate(real_samples, fake_samples)
combined_labels = concatenate(real_labels, fake_labels)
discriminator.train_on_batch(combined_samples, combined_labels)
generator.train_on_batch(noise_function(), labels="Fake")
predictions = discriminator.predict(email_features)
三、检测的实现
3.1 数据集
由于网络上没有现有的合适的数据集,我决定自己去收集数据,制作一个全新的数据集,用于垃圾邮件过滤的研究。这个数据集将包含各种类型的邮件,包括垃圾邮件和正常邮件。通过收集真实的邮件数据,我可以捕捉到不同类型的邮件内容和特征,从而建立一个更准确、可靠的分类模型。我相信这个自制的数据集将为垃圾邮件过滤研究提供有力的支持,并对该领域的发展做出积极贡献。
3.2 实验环境搭建
使用硬件环境为CPU Intel i7 4600、8GB内存和1TB硬盘,操作系统为Windows 10,测试平台为Python 3.5和TensorFlow 1.1的情况下,进行垃圾邮件过滤的实验。使用Python 3.5和TensorFlow 1.1来实现垃圾邮件过滤算法,并根据数据集进行模型训练和评估。在实验中,可以使用交叉验证技术来验证算法的性能,并使用准确率、召回率、精确率和F1分数等评估指标来评估模型的效果。
3.3 实验及结果分析
在这项基于词嵌入与生成对抗网络的垃圾邮件分类算法的实验中,主要衡量指标为准确率和F1值。
-
准确率(Accuracy)是衡量分类算法分类效果的概率指标。它表示垃圾邮件被正确分类为垃圾邮件和正常邮件被正确分类为正常邮件的概率。准确率的计算公式为:
-
F1值是一种综合考虑准确率和召回率的指标,用于更全面地评估算法的性能。F1值的计算公式为:
通过实验结果的准确率和F1值,可以评估基于词嵌入与生成对抗网络的垃圾邮件分类算法的分类性能和实际情况。准确率反映了分类结果与预期相符合的概率,而F1值综合考虑了准确率和召回率,能更好地评估算法在更普遍情况下的性能。根据这两个指标,可以对算法的分类效果进行总结和评估。
通过构建生成对抗网络,在训练过程中,生成器和辨别器的参数矩阵初始化为介于-1到1之间的随机值。生成器的损失函数结果变化曲线显示,在训练早期,生成器的参数就优化到了一个可以使得损失函数结果较低的程度,说明生成器可以稳定地输出伪造样本。通过与辨别器的损失函数曲线对比,可以观察到在生成器稳定之后,辨别器经过一段时间的训练,也可以获得较好的分类效果。
相关代码示例:
cross_entropy = tf.keras.losses.BinaryCrossentropy(from_logits=True)
def generator_loss(fake_output):
# 生成器损失函数的计算,鼓励生成器生成更真实的伪造样本
return cross_entropy(tf.ones_like(fake_output), fake_output)
def discriminator_loss(real_output, fake_output):
# 辨别器损失函数的计算,鼓励辨别器正确分类真实样本和伪造样本
real_loss = cross_entropy(tf.ones_like(real_output), real_output)
fake_loss = cross_entropy(tf.zeros_like(fake_output), fake_output)
return real_loss + fake_loss
# 定义生成器和辨别器的优化器
generator_optimizer = tf.keras.optimizers.Adam(learning_rate=0.001)
discriminator_optimizer = tf.keras.optimizers.Adam(learning_rate=0.001)
# 定义训练过程
@tf.function
def train_step(emails):
with tf.GradientTape() as gen_tape:
generated_emails = generator(noise, training=True)
gen_loss = generator_loss(discriminator(generated_emails, training=True))
gradients_of_generator = gen_tape.gradient(gen_loss, generator.trainable_variables)
generator_optimizer.apply_gradients(zip(gradients_of_generator, generator.trainable_variables))
with tf.GradientTape() as disc_tape:
real_output = discriminator(emails, training=True)
fake_output = discriminator(generated_emails, training=True)
disc_loss = discriminator_loss(real_output, fake_output)
gradients_of_discriminator = disc_tape.gradient(disc_loss, discriminator.trainable_variables)
discriminator_optimizer.apply_gradients(zip(gradients_of_discriminator, discriminator.trainable_variables))
创作不易,欢迎点赞、关注、收藏。
毕设帮助,疑难解答,欢迎打扰!