利用LeNet卷积神经网络对遥感影像进行分类处理代码实现
时间: 2023-08-11 14:03:43 浏览: 53
以下是一个基于LeNet卷积神经网络的遥感影像分类处理的代码实现,其中使用了Tensorflow框架:
```python
import tensorflow as tf
import numpy as np
import os
from PIL import Image
# 数据路径
data_path = './data/'
# 训练集、验证集、测试集的比例
train_percent = 0.8
val_percent = 0.1
test_percent = 0.1
# 图像大小
image_width = 28
image_height = 28
image_channels = 3
# 分类数
num_classes = 6
# LeNet-5模型
def LeNet5(x, num_classes):
# 第一个卷积层
conv1 = tf.layers.conv2d(x, filters=6, kernel_size=[5, 5], strides=1, padding='same', activation=tf.nn.relu)
# 第一个池化层
pool1 = tf.layers.max_pooling2d(conv1, pool_size=[2, 2], strides=2)
# 第二个卷积层
conv2 = tf.layers.conv2d(pool1, filters=16, kernel_size=[5, 5], strides=1, padding='valid', activation=tf.nn.relu)
# 第二个池化层
pool2 = tf.layers.max_pooling2d(conv2, pool_size=[2, 2], strides=2)
# 将特征图变成向量
flatten = tf.reshape(pool2, shape=[-1, 5 * 5 * 16])
# 第一个全连接层
fc1 = tf.layers.dense(flatten, units=120, activation=tf.nn.relu)
# 第二个全连接层
fc2 = tf.layers.dense(fc1, units=84, activation=tf.nn.relu)
# 输出层
logits = tf.layers.dense(fc2, units=num_classes)
return logits
# 加载数据
def load_data():
x_data = []
y_data = []
for label, name in enumerate(os.listdir(data_path)):
dir_path = os.path.join(data_path, name)
for file_name in os.listdir(dir_path):
file_path = os.path.join(dir_path, file_name)
# 读取图像并缩放到指定大小
image = Image.open(file_path).resize((image_width, image_height))
# 将图像转换成numpy数组
image_data = np.array(image)
# 将图像的像素值归一化到0-1之间
image_data = image_data / 255.0
# 将图像和标签加入数据集
x_data.append(image_data)
y_data.append(label)
# 将数据集转换成numpy数组
x_data = np.array(x_data)
y_data = np.array(y_data)
# 将标签转换成one-hot编码
y_data_one_hot = np.eye(num_classes)[y_data]
# 将数据集打乱顺序
perm = np.random.permutation(len(x_data))
x_data = x_data[perm]
y_data_one_hot = y_data_one_hot[perm]
# 将数据集分成训练集、验证集、测试集
train_size = int(train_percent * len(x_data))
val_size = int(val_percent * len(x_data))
test_size = len(x_data) - train_size - val_size
x_train = x_data[:train_size]
y_train = y_data_one_hot[:train_size]
x_val = x_data[train_size:train_size+val_size]
y_val = y_data_one_hot[train_size:train_size+val_size]
x_test = x_data[-test_size:]
y_test = y_data_one_hot[-test_size:]
return x_train, y_train, x_val, y_val, x_test, y_test
# 训练模型
def train_model():
# 加载数据
x_train, y_train, x_val, y_val, x_test, y_test = load_data()
# 创建占位符
x = tf.placeholder(tf.float32, [None, image_width, image_height, image_channels])
y = tf.placeholder(tf.float32, [None, num_classes])
# 创建模型
logits = LeNet5(x, num_classes)
# 定义损失函数和优化器
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(logits=logits, labels=y))
optimizer = tf.train.AdamOptimizer().minimize(loss)
# 定义评估指标
correct_prediction = tf.equal(tf.argmax(logits, 1), tf.argmax(y, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
# 创建会话并开始训练
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for epoch in range(10):
for i in range(len(x_train) // 100):
batch_x = x_train[i*100:(i+1)*100]
batch_y = y_train[i*100:(i+1)*100]
sess.run(optimizer, feed_dict={x: batch_x, y: batch_y})
train_acc = sess.run(accuracy, feed_dict={x: x_train, y: y_train})
val_acc = sess.run(accuracy, feed_dict={x: x_val, y: y_val})
print('epoch %d, train accuracy %g, validation accuracy %g' % (epoch+1, train_acc, val_acc))
test_acc = sess.run(accuracy, feed_dict={x: x_test, y: y_test})
print('test accuracy %g' % test_acc)
if __name__ == '__main__':
train_model()
```
这个代码实现了一个基于LeNet-5卷积神经网络的遥感影像分类处理,其中使用了一个包含6个类别的数据集。代码中使用了Tensorflow框架,并将数据集分成了训练集、验证集和测试集。训练过程中使用了Adam优化器和交叉熵损失函数,并在每个epoch结束时计算了训练集和验证集的准确率。最终在测试集上计算了模型的准确率。