本文是在人工神经网络学习算法-基础篇和工神经网络算法之参数调节两篇博文基础上的实战篇,帮我伙伴们从理解逐渐过渡到实践应用,达到学以致用的目的。
python:人工神经网络学习算法-基础篇,看这一篇就够啦-CSDN博客文章浏览阅读512次,点赞13次,收藏6次。本文介绍了神经网络的基本原理,阐述了神经网络的工作机制。文章指出,神经网络是在线性模型基础上增加了隐藏层,通过加权求和计算隐藏节点,并进行非线性处理(如ReLU或tanh),最终输出结果。文中强调,神经网络通过设置隐藏层节点数量或增加隐藏层层数来处理不同复杂度的问题。。https://blog.csdn.net/hlnzxl/article/details/149768102?spm=1001.2014.3001.5501python:人工神经网络算法之参数调节,实例感受参数变化之美,为应用人工神经网络算法做到心中有数-CSDN博客文章浏览阅读997次,点赞35次,收藏14次。本文介绍了使用Python的scikit-learn库实现人工神经网络的方法,重点探讨了不同参数设置对模型性能的影响。最后总结出四种关键调参方法:调节隐藏层节点数、层数、激活函数类型以及正则化程度,为神经网络应用提供了实用指导。
https://blog.csdn.net/hlnzxl/article/details/149795529?spm=1001.2014.3001.5501现在让我们开始学习吧。
目录
一功能介绍
我们以一个简单桥梁结构缺陷诊断为例。假设我们通过传感器收集了桥梁的一些特征数据(如振动频率、振幅等),然后根据这些特征,使用一个简单的前馈神经网络(多层感知机)来判断桥梁是否有缺陷(二分类问题:0表示无缺陷,1表示有缺陷)。
二、前馈神经网络算法定义与介绍
前馈神经网络(Feedforward Neural Network)是最简单的神经网络类型之一,信息从输入层经过隐藏层(可选)单向传递到输出层,没有反馈或循环连接。它由输入层、一个或多个隐藏层和输出层组成,并通过激活函数进行非线性变换。训练过程通常使用反向传播算法调整权重和偏置以最小化损失函数。
啥是反向传播算法呢?如下图,反向传播算法的核心思想是将输出误差以某种形式通过隐藏层向输入层逐层反转,逐级确定每个权重对最终预测误差的影响程度,并据此调整这些权重以减小误差。这也就是我们常说的BP神经网络算法。了解,知道怎么用就可以了,python里面有现成的库文件调用。
三、程序设计的流程
1. 导入必要的库(如numpy, pandas, sklearn等)
2. 准备数据:生成或加载数据集,进行预处理(归一化、划分训练集和测试集)
3. 构建神经网络模型:定义网络结构(输入层、隐藏层、输出层),初始化参数(权重和偏置)
4. 训练模型:使用前向传播计算输出,通过反向传播更新参数,重复多次(迭代)
5. 评估模型:在测试集上评估模型性能(如准确率)
6. 使用模型进行预测
四、人工神经网络算法应用注意事项
1. 数据预处理:确保数据归一化或标准化,避免不同特征量纲带来的问题。
2. 网络结构:根据问题复杂度选择合适的层数和每层的神经元数量,太复杂可能导致过拟合,太简单可能欠拟合。
3. 激活函数:隐藏层常用ReLU、Sigmoid或Tanh,输出层根据任务选择(二分类用Sigmoid,多分类用Softmax,回归用线性)。
4. 损失函数:分类问题常用交叉熵,回归问题常用均方误差。本文为了简化程序,使用均方误差。
5. 优化算法:如梯度下降、Adam等,注意学习率设置。
6. 迭代次数与批大小:合理设置训练轮数(epochs)和批大小(batch size),避免过拟合(可使用早停)。
7. 评估指标:选择适当的评估指标(如准确率、精确率、召回率等)。
五、python程序源代码
具体的python程序源代码如下。每条语句均有很清楚的功能注释,方便大家阅读。
# 导入所需库
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import confusion_matrix, accuracy_score, log_loss
from sklearn.neural_network import MLPClassifier
from pylab import *
mpl.rcParams['font.sans-serif'] = ['SimHei'] #解决中文不显示问题
# 在创建图形前设置字体
plt.rcParams['font.family'] = 'sans-serif' # 使用无衬线字体
#plt.rcParams['font.sans-serif'] = ['Arial', 'DejaVu Sans', 'SimHei'] # 备选字体列表
plt.rcParams['axes.unicode_minus'] = False # 解决负号显示问题
# 1. 创建模拟数据集
def generate_data(samples=1000):
"""
生成结构缺陷诊断模拟数据
特征1:振动频率 (Hz) - 正常结构范围 8-12,缺陷结构范围 5-15
特征2:振幅 (mm) - 正常结构范围 0.1-0.3,缺陷结构范围 0.2-0.5
标签:0=正常结构, 1=有缺陷结构
"""
np.random.seed(42)
# 正常结构数据 (标签0)
normal_freq = np.random.uniform(8, 12, samples//2)
normal_amp = np.random.uniform(0.1, 0.3, samples//2)
normal_labels = np.zeros(samples//2)
# 缺陷结构数据 (标签1)
defect_freq = np.random.uniform(5, 15, samples//2)
defect_amp = np.random.uniform(0.2, 0.5, samples//2)
defect_labels = np.ones(samples//2)
# 合并数据集
features = np.vstack((
np.column_stack((normal_freq, normal_amp)),
np.column_stack((defect_freq, defect_amp))
))
labels = np.concatenate((normal_labels, defect_labels))
return features, labels
# 2. 数据预处理
X, y = generate_data(samples=1000)
# 标准化特征 (均值0, 方差1)
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# 分割训练集/测试集 (80%/20%)
X_train, X_test, y_train, y_test = train_test_split(
X_scaled, y, test_size=0.2, random_state=42
)
# 3. 构建多层感知机模型
model = MLPClassifier(
hidden_layer_sizes=(4,), # 单个隐藏层,4个神经元
activation='relu', # ReLU激活函数
solver='adam', # Adam优化器
alpha=0.0001, # L2正则化系数
batch_size=8, # 小批量大小
learning_rate_init=0.001, # 学习率
max_iter=50, # 最大训练轮数
random_state=42, # 随机种子
early_stopping=True, # 使用早停法
validation_fraction=0.2 # 验证集比例
)
# 4. 训练模型
history = model.fit(X_train, y_train)
# 5. 模型评估
# 在测试集上评估
y_pred = model.predict(X_test)
test_acc = accuracy_score(y_test, y_pred)
print(f"\n测试集准确率: {test_acc:.2%}")
# 生成混淆矩阵
cm = confusion_matrix(y_test, y_pred)
print("混淆矩阵:")
print(cm)
# 6. 可视化训练过程
plt.figure(figsize=(12, 4))
# 绘制准确率曲线
plt.subplot(1, 2, 1)
plt.plot(history.validation_scores_, label='验证准确率')
plt.title('验证准确率变化')
plt.ylabel('准确率')
plt.xlabel('训练轮次')
plt.legend()
# 绘制损失曲线
plt.subplot(1, 2, 2)
plt.plot(history.loss_curve_, label='训练损失')
plt.title('训练损失变化')
plt.ylabel('二元交叉熵损失')
plt.xlabel('训练轮次')
plt.legend()
plt.tight_layout()
plt.show()
# 7. 新样本预测演示
def predict_defect(vibration_freq, amplitude):
"""预测结构是否缺陷"""
# 预处理输入
input_data = scaler.transform([[vibration_freq, amplitude]])
# 模型预测
prediction = model.predict_proba(input_data)[0][1]
# 输出结果
status = "缺陷结构" if prediction > 0.5 else "正常结构"
confidence = prediction if prediction > 0.5 else 1 - prediction
print(f"诊断结果: {status} | 置信度: {confidence:.2%}")
return prediction
# 测试预测
print("\n==== 结构健康诊断演示 ====")
predict_defect(10.5, 0.25) # 正常结构样本
predict_defect(7.0, 0.45) # 缺陷结构样本
这里我们重点在说一下训练损失变化: 训练损失变化是指模型在训练数据上的损失函数值(量化模型预测与真实标签之间的差距,比如交叉熵、均方误差等)随着训练轮次增加而变化的趋势。
好的训练损失变化有如下特征:
1.初始阶段:损失值较高(随机权重导致预测不准)
2.中期阶段:损失快速下降(模型快速学习数据模式)
3.后期阶段:损失趋于平稳(接近最小可能值)
异常训练顺势变化情况分析:
1.损失不下降原因分析:学习率过低;模型容量不足(层数/神经元太少);梯度消失问题
2.损失剧烈震荡原因分析:学习率过高;批量大小过小
3.先降后升原因分析:过拟合(模型过度记忆训练数据;需要正则化或早停
六、小结
前馈神经网络能学习特征间的非线性关系,适合模式识别。实际应用中我们可以进一步的添加更多传感器特征、使用更复杂网络结构、加入正则化技术等,一步优化性能以适应更复杂的实际场景。
以上就是本文的内容。希望大家有所收获。
请大家多多点赞、收藏与关注。