深度学习基础代码学习

学习网址
博主推荐理论学习网址(李宏毅)

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)
posted @ 2025-03-12 17:37  archer2333  阅读(121)  评论(0)    收藏  举报