1.参考Python实战:BP神经网络_bp神经网络实战python-CSDN博客
2.实践
(1)运行环境
anocanda Powershell Prompt(anocanda3)
(2)创建虚拟环境,解决安装包的版本问题
*打开终端(Terminal)或命令提示符(Command Prompt):
在Windows上,可以通过搜索“cmd”来打开命令提示符。
*创建新的虚拟环境:
使用conda命令来创建虚拟环境。下面是一个基本的例子,其中myenv是你的环境名称,而python=3.8指定了你希望在这个环境中使用的Python版本。
conda create --name myenv python=3.8
*激活虚拟环境:
创建完成后,你需要通过以下命令激活这个环境:
对于Windows用户:
conda activate myenv
*安装所需要的包
(3)运行代码:
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 使用黑体字体
plt.rcParams['axes.unicode_minus'] = False # 解决负号 '-' 显示为方块的问题
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from sklearn.model_selection import train_test_split# 定义学生成绩数据集,这里为方便演示,手动创建示例数据
data = np.array([[80, 75],[85, 80],[70, 65],[90, 88],[75, 70],[88, 82],[65, 60],[92, 90]
])
final_scores = np.array([82, 88, 72, 92, 76, 86, 68, 95])# 划分训练集和测试集,按照8:2的比例划分,设置随机种子以保证每次划分结果可重复
X_train, X_test, y_train, y_test = train_test_split(data, final_scores, test_size=0.2, random_state=42)# 构建BP神经网络模型
model = Sequential()
# 输入层,有2个神经元,对应2个输入特征(作业成绩和小测验成绩),激活函数为ReLU
model.add(Dense(16, input_dim=2, activation='relu'))
# 隐藏层,16个神经元,激活函数为ReLU
model.add(Dense(16, activation='relu'))
# 输出层,1个神经元,对应期末考试成绩,激活函数为线性(因为是回归任务)
model.add(Dense(1, activation='linear'))# 编译模型,指定优化器、损失函数和评估指标
model.compile(optimizer='adam',loss='mean_squared_error',metrics=['mae']) # 平均绝对误差(MAE)作为评估指标# 训练模型,指定训练轮数、批量大小等参数
epochs = 100
batch_size = 2
history = model.fit(X_train, y_train, epochs=epochs, batch_size=batch_size,validation_data=(X_test, y_test), verbose=0)# 获取训练过程中的损失和验证损失历史数据
loss_history = history.history['loss']
val_loss_history = history.history['val_loss']# 可视化训练损失和验证损失曲线
plt.figure(figsize=(10, 6))
plt.plot(range(1, epochs + 1), loss_history, label='训练损失')
plt.plot(range(1, epochs + 1), val_loss_history, label='验证损失')
plt.xlabel('轮数')
plt.ylabel('损失值')
plt.title('BP神经网络训练损失曲线')
plt.legend()
plt.show()# 使用训练好的模型对测试集进行预测
y_pred = model.predict(X_test).flatten() # 将二维数组展平为一维数组# 可视化预测结果与实际结果(简单示例,以测试集为例)
plt.figure(figsize=(10, 6))
plt.scatter(range(len(y_test)), y_test, label='实际成绩', color='blue')
plt.scatter(range(len(y_pred)), y_pred, label='预测成绩', color='red')
plt.xlabel('样本索引')
plt.ylabel('期末考试成绩')
plt.title('BP神经网络预测学生成绩结果')
plt.legend()
plt.show()# 调试信息
print("y_test shape:", y_test.shape)
print("y_pred shape:", y_pred.shape)
print("y_test type:", type(y_test))
print("y_pred type:", type(y_pred))