如何加载预训练MalConv模型在自定义数据集上实现恶意软件预测?
解决MalConv预测结果转换与保存问题
首先,我先帮你梳理下当前代码里的核心问题,再一步步实现你要的「输出0/1标签+保存结果」的需求:
1. 先修正model.predict的错误用法
MalConv的输入是二进制文件的字节数据,不是直接传文件路径。你需要先读取文件的字节内容,转换成模型预期的输入格式——通常是0-255的整数数组,还要根据模型要求做截断或填充(MalConv默认输入长度是2000000字节)。
2. 把预测概率转成0/1标签
MalConv输出的是0-1之间的概率值(代表样本是恶意软件的概率),你可以用通用阈值0.5来划分:概率≥0.5标记为1(恶意),<0.5标记为0(良性)。
3. 把结果保存到数据文件
推荐用CSV格式保存,方便后续查看和分析,Python自带的csv模块就能轻松实现。
完整修正代码示例
import numpy as np from keras.models import load_model import csv # 可选:屏蔽TensorFlow的CPU指令警告(不影响运行,只是让输出更整洁) import os os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' # 加载预训练模型 model = load_model('malconv.h5') model.summary() # 定义二进制文件处理函数,适配MalConv的输入要求 def process_malconv_input(file_path, max_input_len=2000000): # 读取二进制文件 with open(file_path, 'rb') as f: byte_content = f.read() # 把字节转换成0-255的整数数组 int_array = np.array([byte for byte in byte_content], dtype=np.uint8) # 截断过长的样本,或给短样本补0到指定长度 if len(int_array) > max_input_len: int_array = int_array[:max_input_len] else: int_array = np.pad(int_array, (0, max_input_len - len(int_array)), mode='constant') # 添加batch维度(model.predict要求输入是批量格式) return int_array.reshape(1, max_input_len) # 单文件预测示例 target_file = 'data/train/0014D73E9987A3FC3DA1055D912286B95929DC6D' processed_data = process_malconv_input(target_file) # 执行预测并解析结果 pred_prob = model.predict(processed_data)[0][0] # 取出单个样本的恶意概率 pred_label = 1 if pred_prob >= 0.5 else 0 # 转换为0/1标签 print(f"样本恶意概率:{pred_prob:.4f}") print(f"预测标签(1=恶意,0=良性):{pred_label}") # 保存结果到CSV文件 with open('malconv_predictions.csv', 'w', newline='') as csv_file: writer = csv.writer(csv_file) # 写入表头 writer.writerow(['文件路径', '恶意概率', '预测标签']) # 写入当前样本结果 writer.writerow([target_file, round(pred_prob, 4), pred_label]) # 批量处理多个文件的写法(如果需要) # file_list = ['path/to/file1', 'path/to/file2', 'path/to/file3'] # with open('malconv_predictions.csv', 'w', newline='') as csv_file: # writer = csv.writer(csv_file) # writer.writerow(['文件路径', '恶意概率', '预测标签']) # for file_path in file_list: # processed = process_malconv_input(file_path) # prob = model.predict(processed)[0][0] # label = 1 if prob >= 0.5 else 0 # writer.writerow([file_path, round(prob, 4), label])
关于CPU警告的说明
你看到的Your CPU supports instructions that this TensorFlow binary was not compiled to use只是一个非关键性警告,完全不会影响模型运行。如果觉得它碍眼,代码开头的os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'就能屏蔽这类提示。
内容的提问来源于stack exchange,提问作者Leo Dover
相关产品推荐
相关产品推荐

