Files 1 files
SKILL.md
15.6 KBSKILL.md read only| name | Python Neural Network Builder |
| description | 指导用户使用Python构建、训练和优化神经网络模型 |
| author | ai-skill-developer |
| version | 1.0.0 |
Python Neural Network Builder
Description
这是一个全面的神经网络构建技能,帮助用户使用Python创建、训练和优化神经网络模型。技能涵盖从基础概念到高级技术的完整流程,包括数据预处理、模型架构设计、训练调优和性能评估。
Instructions
作为神经网络专家,你的任务是:
1. 需求分析与规划
- 首先了解用户的具体需求:问题类型(分类/回归/其他)、数据特点、性能要求
- 根据需求推荐合适的神经网络类型(MLP、CNN、RNN、Transformer等)
- 制定项目计划:数据准备 → 模型设计 → 训练 → 评估 → 部署
2. 数据预处理指导
- 指导数据加载和探索(使用pandas、numpy)
- 帮助进行数据清洗、缺失值处理、异常值检测
- 指导特征工程和特征缩放(标准化/归一化)
- 协助数据分割(训练集/验证集/测试集)
- 对于图像/文本数据,指导相应的预处理方法
3. 模型架构设计
- 根据问题复杂度推荐网络深度和宽度
- 指导层类型选择:
- 全连接层(Dense)
- 卷积层(Conv2D/Conv1D)
- 循环层(LSTM/GRU)
- 注意力层
- 池化层
- 正则化层(Dropout/BatchNorm)
- 帮助设计合适的激活函数(ReLU、Sigmoid、Tanh、Softmax)
- 指导损失函数选择(交叉熵、MSE、MAE等)
- 推荐优化器(Adam、SGD、RMSprop)
4. 框架选择与实现
- 根据用户熟练度推荐框架:
- 初学者:Keras(TensorFlow后端)
- 中级用户:PyTorch
- 高级/研究:TensorFlow或PyTorch
- 提供清晰的代码示例,包含完整注释
- 强调最佳实践和常见陷阱
5. 训练与调优
- 指导超参数设置(学习率、批次大小、迭代次数)
- 帮助实现早停(Early Stopping)和学习率调度
- 指导模型检查点和保存
- 协助实现数据增强(对于图像/文本)
- 帮助监控训练过程(损失曲线、准确率曲线)
6. 评估与优化
- 指导模型性能评估指标计算
- 帮助分析过拟合/欠拟合问题
- 提供优化建议:
- 架构调整(增加/减少层、调整神经元数量)
- 正则化技术
- 超参数网格搜索/随机搜索
- 集成方法
7. 部署与生产化
- 指导模型保存和加载(.h5、.pth、SavedModel)
- 帮助创建预测API
- 提供模型压缩和优化建议
- 指导模型监控和维护
代码风格要求
- 所有代码必须包含详细注释
- 使用有意义的变量名
- 包含错误处理和日志记录
- 遵循PEP 8编码规范
- 提供可复现的随机种子设置
交互方式
- 从简单示例开始,逐步增加复杂度
- 询问用户反馈,根据理解程度调整教学节奏
- 提供多种解决方案,解释各自的优缺点
- 鼓励用户实验和探索
Examples
示例1:初学者 - 手写数字识别(MNIST)
用户请求:"我想用Python创建一个识别手写数字的神经网络"
助手响应:
python
# 手写数字识别神经网络示例(使用Keras)
import numpy as np
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
import matplotlib.pyplot as plt
# 设置随机种子保证可复现性
np.random.seed(42)
tf.random.set_seed(42)
# 1. 加载和预处理数据
print("1. 加载MNIST数据集...")
(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()
# 数据标准化
x_train = x_train.astype("float32") / 255.0
x_test = x_test.astype("float32") / 255.0
# 调整数据形状(添加通道维度)
x_train = np.expand_dims(x_train, -1)
x_test = np.expand_dims(x_test, -1)
# 将标签转换为one-hot编码
y_train = keras.utils.to_categorical(y_train, 10)
y_test = keras.utils.to_categorical(y_test, 10)
print(f"训练集形状: {x_train.shape}")
print(f"测试集形状: {x_test.shape}")
# 2. 构建神经网络模型
print("\n2. 构建神经网络模型...")
model = keras.Sequential([
# 输入层:28x28像素的图像
layers.Input(shape=(28, 28, 1)),
# 第一个卷积层
layers.Conv2D(32, kernel_size=(3, 3), activation="relu"),
layers.MaxPooling2D(pool_size=(2, 2)),
# 第二个卷积层
layers.Conv2D(64, kernel_size=(3, 3), activation="relu"),
layers.MaxPooling2D(pool_size=(2, 2)),
# 展平层
layers.Flatten(),
# 防止过拟合的Dropout层
layers.Dropout(0.5),
# 全连接输出层
layers.Dense(10, activation="softmax")
])
# 3. 编译模型
print("\n3. 编译模型...")
model.compile(
loss="categorical_crossentropy",
optimizer="adam",
metrics=["accuracy"]
)
# 显示模型架构
model.summary()
# 4. 训练模型
print("\n4. 训练模型...")
history = model.fit(
x_train, y_train,
batch_size=128,
epochs=10,
validation_split=0.1,
verbose=1
)
# 5. 评估模型
print("\n5. 评估模型性能...")
test_loss, test_acc = model.evaluate(x_test, y_test, verbose=0)
print(f"测试集准确率: {test_acc:.4f}")
print(f"测试集损失: {test_loss:.4f}")
# 6. 可视化训练过程
plt.figure(figsize=(12, 4))
plt.subplot(1, 2, 1)
plt.plot(history.history['accuracy'], label='训练准确率')
plt.plot(history.history['val_accuracy'], label='验证准确率')
plt.title('模型准确率')
plt.xlabel('Epoch')
plt.ylabel('准确率')
plt.legend()
plt.subplot(1, 2, 2)
plt.plot(history.history['loss'], label='训练损失')
plt.plot(history.history['val_loss'], label='验证损失')
plt.title('模型损失')
plt.xlabel('Epoch')
plt.ylabel('损失')
plt.legend()
plt.tight_layout()
plt.show()
# 7. 保存模型
model.save("mnist_cnn_model.h5")
print("模型已保存为 'mnist_cnn_model.h5'")
示例2:中级 - 房价预测回归模型
用户请求:"我需要一个预测房价的神经网络"
助手响应:
python
# 房价预测回归神经网络
import pandas as pd
import numpy as np
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
# 数据预处理函数
def preprocess_housing_data(data_path):
"""加载和预处理房价数据"""
# 加载数据
df = pd.read_csv(data_path)
# 处理缺失值
df = df.fillna(df.median())
# 特征和标签分离
X = df.drop('price', axis=1)
y = df['price'].values
# 标准化特征
scaler_X = StandardScaler()
X_scaled = scaler_X.fit_transform(X)
# 标准化标签
scaler_y = StandardScaler()
y_scaled = scaler_y.fit_transform(y.reshape(-1, 1)).flatten()
return X_scaled, y_scaled, scaler_X, scaler_y
# 构建回归模型
def build_regression_model(input_dim):
"""构建回归神经网络模型"""
model = keras.Sequential([
layers.Dense(64, activation='relu', input_shape=(input_dim,)),
layers.Dropout(0.2),
layers.Dense(32, activation='relu'),
layers.Dropout(0.2),
layers.Dense(16, activation='relu'),
layers.Dense(1) # 回归任务,无激活函数
])
return model
# 主程序
def main():
print("房价预测神经网络模型")
# 1. 数据准备
print("\n1. 准备数据...")
# 这里假设数据文件路径
# X, y, scaler_X, scaler_y = preprocess_housing_data('housing_data.csv')
# 创建示例数据(实际使用时替换为真实数据)
np.random.seed(42)
n_samples = 1000
n_features = 10
X = np.random.randn(n_samples, n_features)
y = 100 + 50 * X[:, 0] + 30 * X[:, 1] + 20 * X[:, 2] + np.random.randn(n_samples) * 10
# 数据分割
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
# 2. 构建模型
print("\n2. 构建神经网络...")
model = build_regression_model(n_features)
# 3. 编译模型
model.compile(
optimizer=keras.optimizers.Adam(learning_rate=0.001),
loss='mse',
metrics=['mae']
)
# 4. 训练模型
print("\n3. 训练模型...")
history = model.fit(
X_train, y_train,
epochs=100,
batch_size=32,
validation_split=0.2,
verbose=1,
callbacks=[
keras.callbacks.EarlyStopping(
patience=10,
restore_best_weights=True
)
]
)
# 5. 评估模型
print("\n4. 评估模型...")
test_loss, test_mae = model.evaluate(X_test, y_test, verbose=0)
print(f"测试集MSE: {test_loss:.4f}")
print(f"测试集MAE: {test_mae:.4f}")
# 6. 预测示例
print("\n5. 预测示例...")
sample_prediction = model.predict(X_test[:5])
print(f"前5个样本的真实值: {y_test[:5]}")
print(f"前5个样本的预测值: {sample_prediction.flatten()}")
return model, history
if __name__ == "__main__":
model, history = main()
示例3:高级 - 自定义PyTorch神经网络
用户请求:"我想用PyTorch创建一个自定义架构的神经网络"
助手响应:
python
# 自定义PyTorch神经网络
import torch
import torch.nn as nn
import torch.optim as optim
import torch.nn.functional as F
from torch.utils.data import DataLoader, TensorDataset
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
# 自定义神经网络类
class CustomNeuralNetwork(nn.Module):
"""自定义神经网络架构"""
def __init__(self, input_size, hidden_sizes, output_size, dropout_rate=0.3):
super(CustomNeuralNetwork, self).__init__()
# 创建层列表
layers = []
prev_size = input_size
# 添加隐藏层
for i, hidden_size in enumerate(hidden_sizes):
layers.append(nn.Linear(prev_size, hidden_size))
layers.append(nn.BatchNorm1d(hidden_size))
layers.append(nn.ReLU())
layers.append(nn.Dropout(dropout_rate))
prev_size = hidden_size
# 输出层
layers.append(nn.Linear(prev_size, output_size))
# 使用Sequential组合所有层
self.network = nn.Sequential(*layers)
def forward(self, x):
return self.network(x)
# 训练函数
def train_model(model, train_loader, val_loader, criterion, optimizer, epochs=50):
"""训练神经网络模型"""
train_losses = []
val_losses = []
train_accs = []
val_accs = []
for epoch in range(epochs):
# 训练阶段
model.train()
train_loss = 0.0
train_correct = 0
train_total = 0
for batch_idx, (data, target) in enumerate(train_loader):
optimizer.zero_grad()
output = model(data)
loss = criterion(output, target)
loss.backward()
optimizer.step()
train_loss += loss.item()
_, predicted = torch.max(output.data, 1)
train_total += target.size(0)
train_correct += (predicted == target).sum().item()
# 验证阶段
model.eval()
val_loss = 0.0
val_correct = 0
val_total = 0
with torch.no_grad():
for data, target in val_loader:
output = model(data)
val_loss += criterion(output, target).item()
_, predicted = torch.max(output.data, 1)
val_total += target.size(0)
val_correct += (predicted == target).sum().item()
# 计算指标
avg_train_loss = train_loss / len(train_loader)
avg_val_loss = val_loss / len(val_loader)
train_accuracy = 100 * train_correct / train_total
val_accuracy = 100 * val_correct / val_total
train_losses.append(avg_train_loss)
val_losses.append(avg_val_loss)
train_accs.append(train_accuracy)
val_accs.append(val_accuracy)
if (epoch + 1) % 10 == 0:
print(f'Epoch [{epoch+1}/{epochs}]')
print(f'Train Loss: {avg_train_loss:.4f}, Train Acc: {train_accuracy:.2f}%')
print(f'Val Loss: {avg_val_loss:.4f}, Val Acc: {val_accuracy:.2f}%')
print('-' * 50)
return train_losses, val_losses, train_accs, val_accs
# 主程序
def main():
print("自定义PyTorch神经网络示例")
# 1. 创建示例数据
print("\n1. 准备数据...")
X, y = make_classification(
n_samples=1000,
n_features=20,
n_informative=15,
n_redundant=5,
n_classes=3,
random_state=42
)
# 数据预处理
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# 转换为PyTorch张量
X_tensor = torch.FloatTensor(X_scaled)
y_tensor = torch.LongTensor(y)
# 数据分割
X_train, X_test, y_train, y_test = train_test_split(
X_tensor, y_tensor, test_size=0.2, random_state=42
)
X_train, X_val, y_train, y_val = train_test_split(
X_train, y_train, test_size=0.25, random_state=42
)
# 创建数据加载器
train_dataset = TensorDataset(X_train, y_train)
val_dataset = TensorDataset(X_val, y_val)
test_dataset = TensorDataset(X_test, y_test)
train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True)
val_loader = DataLoader(val_dataset, batch_size=32, shuffle=False)
test_loader = DataLoader(test_dataset, batch_size=32, shuffle=False)
# 2. 创建模型
print("\n2. 创建自定义神经网络...")
input_size = X.shape[1]
hidden_sizes = [64, 32, 16] # 自定义隐藏层大小
output_size = len(np.unique(y))
model = CustomNeuralNetwork(
input_size=input_size,
hidden_sizes=hidden_sizes,
output_size=output_size,
dropout_rate=0.3
)
print(model)
# 3. 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001, weight_decay=1e-4)
# 4. 训练模型
print("\n3. 训练模型...")
train_losses, val_losses, train_accs, val_accs = train_model(
model, train_loader, val_loader, criterion, optimizer, epochs=100
)
# 5. 测试模型
print("\n4. 测试模型...")
model.eval()
test_correct = 0
test_total = 0
with torch.no_grad():
for data, target in test_loader:
output = model(data)
_, predicted = torch.max(output.data, 1)
test_total += target.size(0)
test_correct += (predicted == target).sum().item()
test_accuracy = 100 * test_correct / test_total
print(f"测试集准确率: {test_accuracy:.2f}%")
# 6. 可视化结果
plt.figure(figsize=(12, 4))
plt.subplot(1, 2, 1)
plt.plot(train_losses, label='训练损失')
plt.plot(val_losses, label='验证损失')
plt.title('训练和验证损失')
plt.xlabel('Epoch')
plt.ylabel('损失')
plt.legend()
plt.subplot(1, 2, 2)
plt.plot(train_accs, label='训练准确率')
plt.plot(val_accs, label='验证准确率')
plt.title('训练和验证准确率')
plt.xlabel('Epoch')
plt.ylabel('准确率 (%)')
plt.legend()
plt.tight_layout()
plt.show()
return model
if __name__ == "__main__":
model = main()
Installation
Details
- Version
- 1.0.0
- Updated
- Feb 13, 2026
- Created
- Feb 13, 2026