深度学习基础:流行库介绍与卷积神经网络入门
立即解锁
发布时间: 2025-09-01 00:54:17 阅读量: 4 订阅数: 32 AIGC 

# 深度学习基础:流行库介绍与卷积神经网络入门
## 1. 流行深度学习库介绍
### 1.1 深度学习库的共同特点
大多数深度学习库都有以下共同特点:
- **使用Python**:所有库都以Python为编程语言。
- **数据基本存储单元为张量**:张量在数学上定义复杂,但在深度学习库中,它是多维(任意轴数)的基础值数组。
- **神经网络表示为计算图**:图的节点代表操作(如加权和、激活函数等),边代表数据流动,操作的输入和输出(包括网络的输入输出)都是张量。
- **包含自动微分**:只需定义网络架构和激活函数,库会自动计算反向传播训练所需的所有导数。
- **依赖NVIDIA GPU**:绝大多数深度学习项目使用NVIDIA GPU,这些库通过CUDA Toolkit和cuDNN库实现GPU操作。
### 1.2 PyTorch和Keras简介
PyTorch是独立的库,而Keras构建在TensorFlow(TF)之上,作为用户友好的TF接口。下面通过MNIST数据集的数字分类示例来介绍这两个库的使用。
## 2. 使用Keras进行数字分类
### 2.1 准备工作
Keras可以作为独立库(以TF为后端),也可以作为TF的子组件使用。若将Keras作为TF的一部分,只需安装TF,然后使用以下导入语句:
```python
import tensorflow.keras
```
若使用独立的Keras,支持除TF外的其他后端,如Theano,安装Keras后使用以下导入语句:
```python
import keras
```
这里推荐将Keras作为TF的组件使用。
### 2.2 实现步骤
1. **导入数据集**:Keras可以自动下载MNIST数据集。
```python
import tensorflow as tf
(X_train, Y_train), (X_validation, Y_validation) = tf.keras.datasets.mnist.load_data()
```
2. **数据预处理**:将图像数据从28×28的二维矩阵重塑为784维的一维数组,并将其归一化到[0, 1]范围。
```python
X_train = X_train.reshape(60000, 784) / 255
X_validation = X_validation.reshape(10000, 784) / 255
```
3. **标签处理**:将标签转换为10维的one-hot编码向量。
```python
classes = 10
Y_train = tf.keras.utils.to_categorical(Y_train, classes)
Y_validation = tf.keras.utils.to_categorical(Y_validation, classes)
```
4. **定义神经网络**:使用Sequential模型,构建一个具有一个隐藏层的简单MLP。
```python
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, BatchNormalization, Activation
input_size = 784
hidden_units = 100
model = Sequential([
Dense(hidden_units, input_dim=input_size),
BatchNormalization(),
Activation('relu'),
Dense(classes),
Activation('softmax')
])
```
5. **定义梯度下降参数**:使用Adam优化器和分类交叉熵损失函数。
```python
model.compile(
loss='categorical_crossentropy',
metrics=['accuracy'],
optimizer='adam'
)
```
6. **模型训练**:使用fit方法进行20个epoch的训练,批次大小为100。
```python
model.fit(X_train, Y_train, batch_size=100, epochs=20, verbose=1)
```
7. **模型评估**:评估模型在测试数据上的准确率。
```python
score = model.evaluate(X_validation, Y_validation, verbose=1)
print('Validation accuracy:', score[1])
```
该模型的验证准确率约为97.7%。
### 2.3 可视化隐藏层权重
可以通过以下代码获取并可视化隐藏层的权重:
```python
weights = model.layers[0].get_weights()
import matplotlib.pyplot as plt
import matplotlib.cm as cm
import numpy
fig = plt.figure()
w = weights[0].T
for unit in range(hidden_units):
ax = fig.add_subplot(10, 10, unit + 1)
ax.axis("off")
ax.imshow(numpy.reshape(w[unit], (28, 28)), cmap=cm.Greys_r)
plt.show()
```
## 3. 使用PyTorch进行数字分类
### 3.1 选择设备
优先选择GPU进行训练,若GPU不可用则使用CPU:
```python
import torch
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
```
### 3.2 加载数据集
PyTorch支持直接加载MNIST数据集,并进行预处理:
```python
from torchvision import datasets
from torchvision.transforms import ToTensor, Lambda, Compose
train_data = datasets.MNIST(
root='data',
train=True,
transform=Compose([ToTensor(), Lambda(lambda x: torch.flatten(x))]),
download=True
)
validation_data = datasets.MNIST(
root='data',
train=False,
transform=Compose([ToTensor(), Lambda(lambda x: torch.flatten(x))])
)
```
### 3.3 封装数据集
使用DataLoader将数据集封装成可迭代的对象,自动创建小批量并随机打乱数据:
```python
from torch.utils.data import DataLoader
train_loader = DataLoader(
dataset=train_data,
batch_size=100,
shuffle=True
)
validation_loader = DataLoader(
dataset=validation_data,
batch_size=100,
shuffle=True
)
```
### 3.4 定义神经网络模型
使用与Keras示例相同的单隐藏层MLP:
```python
torch.manual_seed(1234)
hidden_units = 100
classes = 10
model = torch.nn.Sequential(
torch.nn.Linear(28 * 28, hidden_units),
torch.nn.BatchNorm1d(hidden_units),
torch.nn.ReLU(),
torch.nn.Linear(hidden_units, classes)
)
```
### 3.5 定义损失函数和优化器
使用交叉熵损失函数和Adam优化器:
```python
cost_func = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters())
```
### 3.6 定义训练和测试函数
```python
def train_model(model, cost_function, optimizer, data_loader):
model.to(device)
model.train()
current_loss = 0.0
current_acc = 0
for i, (inputs, labels) in enumerat
```
0
0
复制全文
相关推荐










