CNN高光谱图像分类代码py
时间: 2025-05-26 17:39:38 浏览: 32
### CNN 高光谱图像分类的 Python 代码实现
以下是基于 TensorFlow 和 PyTorch 的两种不同框架下,使用卷积神经网络 (CNN) 进行高光谱图像分类的 Python 代码示例。
---
#### **TensorFlow 实现**
此部分展示了如何利用 TensorFlow 构建一个简单的三维卷积神经网络 (3D-CNN),用于高光谱图像分类任务。该代码适用于 TF2+Python3+cuda10.1+CuDNN7.6 环境[^1]。
```python
import tensorflow as tf
from tensorflow.keras import layers, models
def create_3d_cnn(input_shape, num_classes):
model = models.Sequential()
# 第一层卷积层
model.add(layers.Conv3D(filters=32, kernel_size=(3, 3, 3), activation='relu', input_shape=input_shape))
model.add(layers.MaxPooling3D(pool_size=(2, 2, 2)))
# 第二层卷积层
model.add(layers.Conv3D(filters=64, kernel_size=(3, 3, 3), activation='relu'))
model.add(layers.MaxPooling3D(pool_size=(2, 2, 2)))
# 展平层
model.add(layers.Flatten())
# 全连接层
model.add(layers.Dense(units=128, activation='relu'))
# 输出层
model.add(layers.Dense(units=num_classes, activation='softmax'))
return model
# 定义输入形状和类别数
input_shape = (10, 10, 10, 200) # 示例:10x10 空间分辨率,200 波段
num_classes = 16 # 假设有 16 类标签
model = create_3d_cnn(input_shape, num_classes)
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
model.summary()
```
---
#### **PyTorch 实现**
下面是一个基于 PyTorch 框架构建二维卷积神经网络 (2D-CNN) 的代码示例,适合处理高光谱图像的空间信息与光谱信息组合的任务[^2]。
```python
import torch
import torch.nn as nn
import torch.optim as optim
class Simple2DCNN(nn.Module):
def __init__(self, num_bands, num_classes):
super(Simple2DCNN, self).__init__()
# 卷积层
self.conv1 = nn.Conv2d(in_channels=num_bands, out_channels=64, kernel_size=3, padding=1)
self.pool = nn.MaxPool2d(kernel_size=2, stride=2)
# 全连接层
self.fc1 = nn.Linear(64 * 14 * 14, 128) # 输入大小需根据实际调整
self.fc2 = nn.Linear(128, num_classes)
def forward(self, x):
x = self.pool(torch.relu(self.conv1(x)))
x = x.view(-1, 64 * 14 * 14) # 调整尺寸以适应全连接层
x = torch.relu(self.fc1(x))
x = self.fc2(x)
return x
# 初始化模型参数
num_bands = 200 # 假设波段数量为 200
num_classes = 16 # 假设有 16 类标签
device = 'cuda' if torch.cuda.is_available() else 'cpu'
model = Simple2DCNN(num_bands, num_classes).to(device)
optimizer = optim.Adam(model.parameters(), lr=0.001)
loss_fn = nn.CrossEntropyLoss()
print(model)
```
---
#### **Indian Pines 数据集上的 CNN 应用实例**
以下是对 Indian Pines 数据集进行高光谱图像分类的具体实现案例[^3]:
```python
import numpy as np
from sklearn.model_selection import train_test_split
from keras.utils import to_categorical
# 加载数据(假设已预处理)
data = np.load('indian_pines_data.npy') # 形状为 (样本数, 行, 列, 波段)
labels = np.load('indian_pines_labels.npy')
# 数据划分
X_train, X_test, y_train, y_test = train_test_split(data, labels, test_size=0.2, random_state=42)
# 标签编码
y_train_encoded = to_categorical(y_train)
y_test_encoded = to_categorical(y_test)
# 创建模型
input_shape = X_train.shape[1:]
num_classes = y_train_encoded.shape[1]
model = create_3d_cnn(input_shape, num_classes)
model.fit(X_train, y_train_encoded, validation_data=(X_test, y_test_encoded), epochs=10, batch_size=32)
```
---
#### **图卷积神经网络 (GCN)**
如果希望进一步探索更复杂的结构,可以尝试基于图卷积神经网络的方法来完成高光谱图像分类任务[^4]。具体代码已在引用中提供,此处不再赘述。
---
### 总结
以上分别介绍了基于 TensorFlow 和 PyTorch 的 CNN 高光谱图像分类方法,并提供了针对 Indian Pines 数据集的应用实例。这些代码可以根据具体的实验需求灵活修改。
---
阅读全文
相关推荐



















