Python深度学习:从神经网络到循环神经网络
目录
- ✨ 神经网络基础
1.1 🔍 前向传播与反向传播 - 🎨 卷积神经网络(CNN)
2.1 🖼️ 图像分类任务的实现
2.2 🚀 常用架构(LeNet、VGG、ResNet) - 🔄 循环神经网络(RNN)
3.1 ⏳ 时间序列预测与NLP应用
1. ✨ 神经网络基础
1.1 🔍 前向传播与反向传播
神经网络的核心结构模拟了大脑的神经元工作机制,每一个神经元接收输入、执行计算并输出结果,多个神经元连接成网络,从而具备了复杂的学习能力。前向传播和反向传播作为神经网络的核心机制,保证了模型的训练过程。
前向传播是指数据从输入层通过网络,逐层向前传递,最终在输出层得出结果。模型中的每一层神经元都执行相同的基本操作:将输入进行加权求和,并通过激活函数进行非线性变换。以下是前向传播的实现示例:
import numpy as np# 初始化权重和偏置
weights = np.array([0.2, 0.8, -0.5])
bias = 0.1# 激活函数 - 使用Sigmoid
def sigmoid(x):return 1 / (1 + np.exp(-x))# 前向传播
def forward_propagation(inputs):linear_output = np.dot(inputs, weights) + bias # 线性计算activation_output = sigmoid(linear_output) # 应用激活函数return activation_outputinputs = np.array([0.5, -0.2, 0.1])
output = forward_propagation(inputs)
print(f"前向传播输出: {output}")
在这个简单的例子中,输入数据通过一个三节点的网络,应用了Sigmoid激活函数。这种操作能够有效处理输入的非线性关系。
反向传播是神经网络训练的关键步骤,它通过链式法则计算误差相对于每个权重的梯度。这个过程允许我们通过优化算法(如梯度下降)来更新权重,使模型逐步逼近最优解。反向传播的核心是通过误差的传递,计算每一层的权重对最终误差的影响。
# 定义损失函数 (均方误差)
def mean_squared_error(y_true, y_pred):return np.mean((y_true - y_pred) ** 2)# 反向传播
def backward_propagation(inputs, y_true, output, learning_rate=0.01):# 计算预测值和真实值之间的误差error = y_true - output# 计算Sigmoid导数sigmoid_derivative = output * (1 - output)# 计算梯度gradients = error * sigmoid_derivative# 更新权重和偏置global weights, biasweights += learning_rate * np.dot(inputs.T, gradients)bias += learning_rate * np.sum(gradients)# 示例反向传播
y_true = np.array([1])
backward_propagation(inputs, y_true, output)
这个代码通过均方误差(MSE)计算损失,并通过梯度下降的方式更新权重。通过不断迭代这个过程,神经网络能够在训练集上逐步逼近最优解。
2. 🎨 卷积神经网络(CNN)
2.1 🖼️ 图像分类任务的实现
卷积神经网络(CNN)是一种专门用于处理图像数据的神经网络架构。CNN的核心思想是通过卷积操作提取图像的局部特征,并逐层学习图像中的抽象信息。CNN网络通常由卷积层、池化层和全连接层组成。
在图像分类任务中,CNN通过卷积层捕捉图像中的局部模式(如边缘、纹理等),通过池化层下采样以减少计算复杂度,并通过全连接层将提取的特征映射到分类结果。
以下是使用Keras实现一个简单的CNN用于图像分类的示例:
import tensorflow as tf
from tensorflow.keras import layers, models# 创建卷积神经网络模型
def create_cnn_model(input_shape, num_classes):model = models.Sequential()# 第一个卷积层和池化层model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=input_shape))model.add(layers.MaxPooling2D((2, 2)))# 第二个卷积层和池化层model.add(layers.Conv2D(64, (3, 3), activation='relu'))model.add(layers.MaxPooling2D((2, 2)))# 第三个卷积层和池化层model.add(layers.Conv2D(64, (3, 3), activation='relu'))model.add(layers.MaxPooling2D((2, 2)))# 全连接层model.add(layers.Flatten())model.add(layers.Dense(64, activation='relu'))model.add(layers.Dense(num_classes, activation='softmax'))return model# 模型输入参数
input_shape = (64, 64, 3) # 输入为64x64的彩色图像
num_classes = 10 # 输出10个分类# 构建模型
cnn_model = create_cnn_model(input_shape, num_classes)
cnn_model.summary()
在这个代码中,首先构建了一个由三层卷积层组成的网络,每层卷积后接一个最大池化层,最后通过全连接层输出预测结果。这种结构在图像分类任务中表现良好,尤其适合大规模数据集的分类任务。
2.2 🚀 常用架构(LeNet、VGG、ResNet)
在卷积神经网络的发展过程中,出现了许多经典的架构,这些架构在解决复杂图像任务时取得了显著的成就。以下是几种常见的CNN架构:
LeNet是最早的卷积神经网络之一,广泛应用于手写数字识别任务。它由两层卷积层和两层全连接层组成,结构简单但有效。
def create_lenet(input_shape, num_classes):model = models.Sequential()model.add(layers.Conv2D(6, (5, 5), activation='tanh', input_shape=input_shape))model.add(layers.AveragePooling2D((2, 2)))model.add(layers.Conv2D(16, (5, 5), activation='tanh'))model.add(layers.AveragePooling2D((2, 2)))model.add(layers.Flatten())model.add(layers.Dense(120, activation='tanh'))model.add(layers.Dense(84, activation='tanh'))model.add(layers.Dense(num_classes, activation='softmax'))return model
VGG架构通过增加卷积层的深度来提升模型性能,VGG网络中的卷积层都是3x3卷积核,具有相同的结构,这种统一的设计使得网络易于扩展。
def create_vgg(input_shape, num_classes):model = models.Sequential()model.add(layers.Conv2D(64, (3, 3), activation='relu', padding='same', input_shape=input_shape))model.add(layers.Conv2D(64, (3, 3), activation='relu', padding='same'))model.add(layers.MaxPooling2D((2, 2)))# 重复卷积和池化操作# ...model.add(layers.Flatten())model.add(layers.Dense(4096, activation='relu'))model.add(layers.Dense(num_classes, activation='softmax'))return model
ResNet引入了残差连接(skip connection)以解决深度网络中的梯度消失问题,极大地提升了网络的学习能力。
from tensorflow.keras.applications import ResNet50# 使用预训练ResNet50模型
resnet_model = ResNet50(weights='imagenet', include_top=False, input_shape=input_shape)
resnet_model.summary()
每个架构都根据任务需求提供了不同的性能,研究者可以根据实际应用选择合适的模型。
3. 🔄 循环神经网络(RNN)
3.1 ⏳ 时间序列预测与NLP应用
循环神经网络(RNN)专门用于处理序列数据,在自然语言处理(NLP)和时间序列预测中表现优异。RNN的核心特点在于它能够保留前一时刻的信息,并将其传递到当前时刻,使得
网络具备了“记忆”能力。这种特性使RNN非常适合处理时间序列、文本等具有时序关系的数据。
RNN的主要变种包括LSTM(长短期记忆网络)和GRU(门控循环单元),它们通过特殊的结构来解决RNN中的长程依赖和梯度消失问题。
时间序列预测是RNN的重要应用之一。例如,使用RNN预测股票价格或天气变化等时间序列数据时,网络能够利用历史数据的模式进行预测。
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense# 创建LSTM模型
def create_lstm_model(input_shape):model = Sequential()model.add(LSTM(50, return_sequences=True, input_shape=input_shape))model.add(LSTM(50))model.add(Dense(1)) # 输出预测值return model# 模型输入参数
input_shape = (10, 1) # 输入为10个时间步的单变量数据
lstm_model = create_lstm_model(input_shape)
lstm_model.summary()
这个简单的LSTM网络可以用于时间序列预测,LSTM层通过记忆单元存储长时间的依赖关系,提升了模型对时序信息的理解。
在自然语言处理(NLP)中,RNN的应用十分广泛,特别是在文本生成、情感分析和机器翻译任务中,RNN能够通过学习上下文信息来捕捉文本中的深层含义。
以下是一个基于RNN的文本分类任务示例:
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences
from tensorflow.keras.layers import Embedding, SimpleRNN# 模拟数据
texts = ["我喜欢深度学习", "机器学习很有趣", "神经网络是强大的工具"]
labels = [1, 0, 1]# 文本预处理
tokenizer = Tokenizer(num_words=1000)
tokenizer.fit_on_texts(texts)
sequences = tokenizer.texts_to_sequences(texts)
padded_sequences = pad_sequences(sequences, maxlen=5)# 创建RNN模型
def create_rnn_model(input_length):model = Sequential()model.add(Embedding(input_dim=1000, output_dim=64, input_length=input_length))model.add(SimpleRNN(64))model.add(Dense(1, activation='sigmoid'))return modelinput_length = 5 # 文本序列长度
rnn_model = create_rnn_model(input_length)
rnn_model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
rnn_model.summary()
这个例子展示了如何使用RNN进行文本分类。RNN通过逐步处理文本中的单词序列,捕捉上下文之间的关系,并最终输出分类结果。
RNN及其变种在时间序列和文本数据的处理上展现了卓越的能力,通过调整网络结构,可以实现不同复杂度的任务需求。