基于机器学习的代码自动批阅系统的设计与研究
朱颖
浙江经贸职业技术学院 浙江 杭州 310018
摘要:基于机器学习的代码自动批阅系统利用卷积神经网络进行训练设计。该系统通过构建CNN模型,实现对代码图像特征的自动提取和学习,从而实现对代码的自动批阅。该系统能高效识别代码中的错误与不足,提升代码审查效率与质量,为高校计算机相关专业教师的代码批阅带来高效率。
关键词:机器学习;自动批阅;卷积神经网络;CNN模型;
高校里,计算机相关的学生在进行程序编程提交作业后,教师需要对代码进行评估批阅,人工手动的批阅非常耗时耗力,而且对于错误的代码不能马上发现错误并提出错误,学生获得的也就是一个通过或不通过的评价,对于他们的提升来说,是有限的。本文研究的基于机器学习的代码自动批阅系统是一个相对复杂但比较有用的项目,它可以帮助教师自动评估学生的编程作业,给出批阅结果,包括分数,错误位置,修改意见等。
1 系统设计
本系统设计时,结合系统的底层逻辑,设置五个层次来实现,分别是输入层、预处理层、特征提取层、机器学习模型层以及输出层。
(1)输入层:用于接收学生提交的代码文件,包含当前各种主流的编程语言,如Java、C、Python和C++等。对于其他的代码,需要在后期中进行训练以完成批阅处理。
(2)预处理层:对于学生提交的代码进行预处理,主要包括语法分析、代码格式化、去除注释等,以便后续的特征提取。这里还是要求学生提交的代码要基本格式正确,不能有明显的语法错误,譬如单词与单词之间没有空格,这样在预处理的时候会造成无法正确识别。
(3)特征提取层:系统能够从预处理后的代码中提取出有意义的特征,这些特征可以包括语法特征、语义特征、编程风格特征等。譬如,同样的输出语句,在Java中提取system.out,在C中提取printf,在C++中提取cout,在python中提取print,这样可以大致判断提交的代码是什么,然后进行定位等。
(4)机器学习模型层:等特征提取后,使用深度机器学习,运用卷积神经网络对提取的特征进行学习,建立CNN模型来评估代码质量。
(5)输出层:最后输出代码评估结果,包括分数、错误提示、改进建议等。
2 实现步骤
数据收集:收集大量的编程作业数据,包括学生的代码、对应的分数以及可能的错误提示或改进建议。这些数据将用于训练机器学习模型。
预处理和特征提取:开发代码预处理和特征提取的算法或工具。这可能涉及到编译器或解释器的使用,以及自然语言处理(NLP)技术的应用。
模型训练:使用收集的数据训练机器学习模型。在这个过程中,可能需要进行特征选择、模型调优等步骤,以提高模型的评估准确性。
系统集成和测试:将各个部分集成到一个系统中,并进行全面的测试,以确保系统的稳定性和准确性。
用户反馈和迭代:收集用户的反馈,对系统进行持续改进和优化。
3 技术难点
本系统的代码理解有一定的深度,机器学习模型需要深入理解代码的语义和逻辑,这通常比处理自然语言文本更为复杂。如何从代码中提取出有意义的特征直接影响到模型的评估准确性。由于编程作业的多样性和复杂性,模型需要具备良好的泛化能力,以应对各种可能的代码输入,模型的泛化能力有待提升。
4 系统实现
(1) 数据收集与分类
前期工作是收集大量的学生代码样本,包括正确和错误的代码,并对代码进行分类整理,,主要按照语言种类分,错误和正确分等。
(2)标注数据
对分类后的代码进行标注,明确哪些是正确的,哪些是错误的,以及错误的类型和位置。
(3)数据预处理
使用编译器或解释器将代码转换为抽象语法树(AST)或其他中间表示形式,以便更容易地提取特征。从解析后的代码中提取有意义的特征,例如语法特征、控制流特征、函数调用模式等。去除无关信息,如注释、空格等,并确保数据的标准化和一致性。
(4) 选择合适的机器学习算法
根据问题的性质,选择一个或多个适合分类任务的机器学习算法,如决策树、随机森林、支持向量机(SVM)或深度学习模型(如卷积神经网络CNN或循环神经网络RNN)。本文使用卷积神经网络CNN。
(5)模型训练与评估
将标注好的数据划分为训练集、验证集和测试集。将预处理后的代码图像作为输入,通过CNN模型进行前向传播。计算模型的输出与真实标签之间的损失。使用优化器更新模型的权重和偏置,以最小化损失。重复上述步骤,直到达到预设的训练轮数或满足收敛条件。使用训练集训练机器学习模型,调整模型参数以优化性能。使用验证集和测试集评估模型的性能,包括准确率、召回率、F1分数等指标。实例部分代码如下。
import tensorflow as tf
from tensorflow.keras import layers, models, datasets, losses, optimizers, metrics
from tensorflow.keras.preprocessing.image import ImageDataGenerator
# 数据生成器
train_datagen = ImageDataGenerator(rescale=1./255)
validation_datagen = ImageDataGenerator(rescale=1./255)
# 从目录读取图像数据
train_generator = train_datagen.flow_from_directory(
'train', # 训练数据目录
target_size=(img_height, img_width), # 图像大小
batch_size=32, # 批次大小
class_mode='categorical') # 因为是多分类问题,所以使用'categorical'
validation_generator = validation_datagen.flow_from_directory(
'validation',
target_size=(img_height, img_width),
batch_size=32,
class_mode='categorical')
# 构建CNN模型
model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(img_height, img_width, 3)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(train_generator.num_classes, activation='softmax'))
# 编译模型
model.compile(optimizer='adam'
loss=losses.categorical_crossentropy,
metrics=[metrics.Accuracy()])
# 训练模型
history = model.fit(train_generator,steps_per_epoch=train_generator.samplesepochs=10,validation_data=validation_generator,validation_steps=validation_generator.samples
# 保存模型
model.save('code_recognition_model.h5')
(6)模型优化与部署
根据评估结果调整模型结构、参数或特征选择,以提高模型的性能。将训练好的模型部署到一个可用的系统中,以便对学生提交的代码进行实时评估。
(7)用户界面与反馈
开发用户界面:为学生和教师提供一个友好的界面,用于上传代码、查看评估结果和接收反馈。本系统前端使用vue3.0开发,后端使用SpringBoot框架。
5 系统测试和调整
在模型训练中平衡常见错误和调整的方法如下。
(1)数据多样化 。确保训练数据集的多样性,多样化的数据能够减少特定偏差对模型训练的影响。
(2)数据清洗和筛选 。彻底清洗和筛选训练数据,去除可能引入偏差的错误或不准确数据。
(3)平衡数据集 。在构建训练数据集时,要确保各类别或观点的样本数目相对平衡,以减少特定偏差的影响。
(4)使用验证集 。使用验证集来评估模型的性能,并根据评估结果调整模型的结构、参数或优化策略。
(5)调整模型复杂度 。选择和设计适合任务的模型,避免模型过于简单或复杂,以防止过拟合或欠拟合现象的发生