学习网址
1. 单个神经元
技术要点
- 单个神经元即线性单元,对输入进行加权求和并通过激活函数进行处理。
- 用于模拟简单线性关系,验证基础神经元的工作原理。
代码示例
import numpy as np
from keras.models import Sequential
from keras.layers import Dense# 构造训练数据:y = 2x + 1
X = np.array([[0], [1], [2], [3], [4]])
y = 2 * X + 1# 建立单神经元模型(使用线性激活函数)
model = Sequential()
model.add(Dense(1, input_dim=1, activation='linear'))model.compile(optimizer='sgd', loss='mse')
model.summary()# 训练模型
model.fit(X, y, epochs=100, verbose=0)# 获取预测结果
predictions = model.predict(X)
print("预测结果:", predictions.flatten())
2. 深度神经网络
技术要点
- 通过增加隐藏层构建深层神经网络,从而捕捉数据中的复杂非线性关系。
- 使用 ReLU 激活函数和多层结构来提高模型拟合能力。
代码示例
import numpy as np
from keras.models import Sequential
from keras.layers import Dense# 构造示例数据:目标函数 y = x^2
X = np.linspace(-1, 1, 100).reshape(-1, 1)
y = X**2# 构建深层神经网络模型
model = Sequential()
model.add(Dense(64, input_dim=1, activation='relu'))
model.add(Dense(32, activation='relu'))
model.add(Dense(1, activation='linear'))model.compile(optimizer='adam', loss='mse')
model.summary()# 训练模型
model.fit(X, y, epochs=200, verbose=0)# 获取预测结果
predictions = model.predict(X)
print("预测结果(前10个):", predictions[:10].flatten())
3. 随机梯度下降 (SGD)
技术要点
- 利用随机梯度下降(SGD)对模型参数进行迭代更新。
- 观察使用 SGD 训练单神经元模型时参数的调整效果。
代码示例
import numpy as np
from keras.models import Sequential
from keras.layers import Dense
from keras.optimizers import SGD# 构造训练数据:y = 3x + 2
X = np.array([[0], [1], [2], [3], [4]])
y = 3 * X + 2# 建立单神经元模型
model = Sequential()
model.add(Dense(1, input_dim=1, activation='linear'))# 配置 SGD 优化器
sgd = SGD(learning_rate=0.01)
model.compile(optimizer=sgd, loss='mse')
model.summary()# 训练模型
model.fit(X, y, epochs=100, verbose=0)# 获取预测结果
predictions = model.predict(X)
print("SGD 训练后的预测结果:", predictions.flatten())
4. 过拟合与欠拟合
技术要点
- 识别模型在训练过程中的过拟合和欠拟合问题。
- 使用早停(Early Stopping)技术防止模型过拟合。
代码示例
import numpy as np
from keras.models import Sequential
from keras.layers import Dense
from keras.callbacks import EarlyStopping# 构造示例数据:目标函数 y = x^3,加上随机噪声
X = np.linspace(-1, 1, 100).reshape(-1, 1)
y = X**3 + np.random.normal(0, 0.05, X.shape)# 构建模型(高容量模型,容易过拟合)
model = Sequential()
model.add(Dense(128, input_dim=1, activation='relu'))
model.add(Dense(64, activation='relu'))
model.add(Dense(1, activation='linear'))model.compile(optimizer='adam', loss='mse')
model.summary()# 设置早停回调,监控损失值,耐心值为 10
early_stop = EarlyStopping(monitor='loss', patience=10)# 训练模型
history = model.fit(X, y, epochs=500, verbose=0, callbacks=[early_stop])
print("训练结束时的轮次数:", len(history.history['loss']))# 获取预测结果
predictions = model.predict(X)
print("预测结果(前10个):", predictions[:10].flatten())
5. Dropout 与 Batch Normalization
技术要点
- 使用 Dropout 层随机丢弃部分神经元,降低模型复杂度并防止过拟合。
- 利用 Batch Normalization 层稳定训练过程,加速模型收敛。
代码示例
import numpy as np
from keras.models import Sequential
from keras.layers import Dense, Dropout, BatchNormalization# 构造示例数据:目标函数 y = sin(2πx),加上噪声
X = np.linspace(-1, 1, 200).reshape(-1, 1)
y = np.sin(2 * np.pi * X) + np.random.normal(0, 0.1, X.shape)# 构建带有 Dropout 与 Batch Normalization 的模型
model = Sequential()
model.add(Dense(64, input_dim=1, activation='relu'))
model.add(BatchNormalization())
model.add(Dropout(0.5))
model.add(Dense(32, activation='relu'))
model.add(BatchNormalization())
model.add(Dropout(0.5))
model.add(Dense(1, activation='linear'))model.compile(optimizer='adam', loss='mse')
model.summary()# 训练模型
model.fit(X, y, epochs=200, verbose=0)# 获取预测结果
predictions = model.predict(X)
print("添加 Dropout 与 Batch Normalization 后预测结果(前10个):", predictions[:10].flatten())
6. 二分类问题
技术要点
- 构建二分类模型,采用 Sigmoid 激活函数和二元交叉熵损失函数。
- 对生成的数据进行训练,并评估模型在测试集上的表现。
代码示例
import numpy as np
from keras.models import Sequential
from keras.layers import Dense
from sklearn.model_selection import train_test_split# 构造二分类示例数据:生成随机数据并依据简单规则划分类别
np.random.seed(42)
X = np.random.randn(1000, 20)
y = (np.sum(X, axis=1) > 0).astype(int)# 划分训练集与测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 构建二分类模型
model = Sequential()
model.add(Dense(64, input_dim=20, activation='relu'))
model.add(Dense(32, activation='relu'))
model.add(Dense(1, activation='sigmoid'))model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
model.summary()# 训练模型
model.fit(X_train, y_train, epochs=50, batch_size=32, verbose=0)# 模型评估
loss, accuracy = model.evaluate(X_test, y_test, verbose=0)
print("二分类模型测试集准确率:", accuracy)