tensorflow2学习(三):双卷积神经网络(CNN3D)高光谱图像分类

参考文章双卷积池化结构的3D-CNN高光谱遥感影像分类方法,将双卷积神经网络(CNN3D)应用与高光谱图像HSI分类,记录有亲自实现的Python源代码,环境:TF2+Python3+cuda10.1+CuDNN7.6 .

tensorflow2学习(三):双卷积神经网络(CNN3D)高光谱图像分类

一、参考资料

1. Conv3D参数
2. Keras的网络层介绍
3. keras使用入门及3D卷积神经网络资源
4 .Keras源码实例
5. 双卷积池化结构的3D-CNN高光谱遥感影像分类方法

二、网络结构

在这里插入图片描述在这里插入图片描述

针对数据集Indian-Pines数据集设计的网络部分结构(Chanel_Last):

InputN * 200 * 19 * 19 * 1
Conv3DN * 40 * 17 * 17 * 16
Conv3D(16, kernel_size=(3, 3, 3), input_shape=(200, 19, 19, 1), strides=(5, 1, 1))
Conv3DN * 40 * 17 * 17 * 16
Conv3D(16, kernel_size=(3, 3, 3), padding=‘same’)
MaxPoolingN * 20 * 8 * 8 * 16
MaxPooling3D(pool_size=2)
Conv3DN * 20 * 8 * 8 * 32
Conv3D(32, kernel_size=(3, 3, 3), padding=‘same’))
Conv3DN * 20 * 8 * 8 * 32
Conv3D(32, kernel_size=(3, 3, 3), padding=‘same’)
MaxPoolingN * 10 * 4 * 4 * 32
MaxPooling3D(pool_size=2)
Conv3DN * 10 * 4 * 4 * 64
Conv3D(64, kernel_size=(3, 3, 3), padding=‘same’))
Conv3DN * 10 * 4 * 4 * 64
Conv3D(64, kernel_size=(3, 3, 3), padding=‘same’)
MaxPoolingN * 5 * 2 * 2 * 64
MaxPooling3D(pool_size=2)

详细结构可以参考代码部分。

三、代码

import os
from tensorflow.keras.layers import Conv3D, MaxPooling3D, Dropout, Dense, Flatten, Activation, BatchNormalization
import tensorflow as tf

from DataLoad import loadData

path_image = 'Indian-pines/Indian_pines_corrected.mat'
path_label = 'Indian-pines/Indian_pines_gt.mat'
key_image = 'indian_pines_corrected'
key_label = 'indian_pines_gt'
window_size = 19
input_size = 200
X_train_new, X_val_new, y_train_new, y_val_new, train_samples = loadData(path_image, path_label, key_image, key_label)
batch_size = 16
model = tf.keras.Sequential([
    Conv3D(16, kernel_size=(3, 3, 3), input_shape=(200, 19, 19, 1), strides=(5, 1, 1)),  # 17
    BatchNormalization(),
    Activation(tf.nn.relu),
    Conv3D(16, kernel_size=(3, 3, 3), padding='same'),
    BatchNormalization(),
    Activation(tf.nn.relu),
    MaxPooling3D(pool_size=2),  # 8
    Conv3D(32, kernel_size=(3, 3, 3), padding='same'),
    BatchNormalization(),
    Activation(tf.nn.relu),
    Conv3D(32, kernel_size=(3, 3, 3), padding='same'),
    BatchNormalization(),
    Activation(tf.nn.relu),
    MaxPooling3D(pool_size=2),  # 4
    Conv3D(64, kernel_size=(3, 3, 3), padding='same'),
    BatchNormalization(),
    Activation(tf.nn.relu),
    Conv3D(64, kernel_size=(3, 3, 3), padding='same'),
    BatchNormalization(),
    Activation(tf.nn.relu),
    MaxPooling3D(pool_size=2),  # 2
    Flatten(),
    Dense(128),
    BatchNormalization(),
    Activation(tf.nn.relu),
    Dropout(0.5),
    Dense(16, activation=tf.nn.softmax)]
)
epoch = 100
tf.keras.backend.set_learning_phase(True)
model.compile(
    optimizer=tf.keras.optimizers.RMSprop(0.0003),
    loss=tf.keras.losses.categorical_crossentropy,
    metrics=[tf.keras.metrics.categorical_accuracy])
model_dir = 'model/CNN6_IP2'
model_file = 'model_weights'
model_saved_path = model_dir + '/' + model_file
is_load_model = input('Would you like load the existed model weights if it exist ? y/n\n')
if is_load_model == 'y':
    model.load_weights(model_saved_path)
    print('An existed model_weight table has been gotten...')
else:
    print('A new model will be gotten...')
print('*****************************************')
epoch = int(input('Please input epoch : '))
if epoch < 0:
    epoch = 0
print('*****************************************')
if epoch != 0:
    hist = model.fit(
        X_train_new,
        y_train_new,
        batch_size=batch_size,
        epochs=epoch,
        shuffle=True
    )
loss, acc = model.evaluate(
    X_val_new,
    y_val_new,
    batch_size=batch_size
)
print('train: val', y_train_new.shape, y_val_new.shape)
print('acc:', acc)
if not os.path.exists(model_dir):
    os.mkdir(model_dir)
model.save_weights(model_saved_path)
print('model_weights have been saved at ' + model_saved_path)
print(model.summary())

import numpy as np
import tensorflow as tf
from scipy.io import loadmat
from sklearn.model_selection import train_test_split


def loadData(path_image='Indian-pines/Indian_pines_corrected.mat',
             path_label='Indian-pines/Indian_pines_gt.mat',
             key_image='indian_pines_corrected',
             key_label='indian_pines_gt',
             window_size=19, input_size=200):
    mat = loadmat(path_image)
    # print(mat.keys())
    features = mat[key_image]
    features_shape = features.shape

    mat_labels = loadmat(path_label)
    labels = mat_labels[key_label]
    labels = np.reshape(labels, (-1, 1))
    f2 = np.zeros((labels.shape[0], window_size, window_size, input_size), dtype='float32')

    parameter_b = np.array([i - window_size // 2 for i in range(window_size)])
    for i in range(features_shape[0]):
        for j in range(features_shape[1]):
            index = i * features_shape[1] + j
            for p in range(window_size):
                for q in range(window_size):
                    f2[index][p][q] = \
                        features[(i + parameter_b[p]) % features_shape[0]][(j + parameter_b[q]) % features_shape[1]]

    index = np.where(np.reshape(labels, (-1)) == 0)
    labels = np.delete(labels, index, axis=0)
    # print(np.unique(labels))
    tmp = np.unique(labels)
    for i in range(len(labels)):
        labels[i][0] = np.where(tmp == labels[i][0])[0][0]
    f2 = np.delete(f2, index, axis=0)
    labels = np.reshape(labels, (-1))
    dataset = [f2, labels]
    (X, Y) = (dataset[0], dataset[1])  # -1,19,19,200
    X = X.swapaxes(1, 3)
    print('X_shape: ', X.shape)
    train_set = X[:, :, :, :, np.newaxis]
    print('TrainSet_shape: ', train_set.shape)
    classes = 16
    Y = tf.keras.utils.to_categorical(Y, classes)
    train_set = train_set.astype('float32')
    train_set -= np.mean(train_set)
    train_set /= np.max(train_set)
    # Split the data
    X_train_new, X_val_new, y_train_new, y_val_new = train_test_split(train_set, Y, test_size=0.8, random_state=4)
    return X_train_new, X_val_new, y_train_new, y_val_new, labels.shape[0]

  • 8
    点赞
  • 109
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
### 回答1: 光谱图像处理是一项对光谱图像进行分析和处理的任务,卷积神经网络(Convolutional Neural Network, CNN)在该领域有着广泛的应用。 首先,在光谱图像处理中,卷积神经网络可以进行特征提取。由于光谱图像具有维度和大量的光谱信息,传统的处理方法往往难以有效提取其中的特征。而CNN可以通过卷积层和池化层的组合,利用局部连接和权值共享等特性,从输入的光谱图像中提取出有代表性的特征。 其次,卷积神经网络可以实现光谱图像分类和识别。通过训练一个具有多个卷积层和全连接层的神经网络,可以将光谱图像分为不同的类别,如植被、水体、建筑等。在训练过程中,CNN能够学习到不同类别之间的特征差异,并根据这些差异进行分类判别,从而实现光谱图像的自动分类和识别。 此外,卷积神经网络还可以进行光谱图像的超分辨率重建。光谱图像的分辨率常常受到传感器分辨率和采集条件等影响,导致图像细节模糊。通过使用CNN进行超分辨率重建,可以利用神经网络学习能力,将低分辨率图像转换为分辨率图像,提光谱图像的细节还原能力。 在MATLAB中,可以利用已有的深度学习框架(如TensorFlow、Keras)来实现卷积神经网络光谱图像处理。使用MATLAB的深度学习工具箱,可以方便地搭建和训练卷积神经网络,并应用于光谱图像分类、识别和超分辨率重建等任务。MATLAB还提供了一系列的图像处理函数和工具,可以辅助进行光谱图像的预处理和后处理。 综上所述,卷积神经网络光谱图像处理中具有重要的应用价值,能够有效提取特征、实现分类和识别、进行超分辨率重建等任务,并且借助MATLAB等工具,可以方便地进行效的光谱图像处理。 ### 回答2: 卷积神经网络是一种用于图像处理的深度学习模型,在光谱图像处理中也可以使用MATLAB进行实现。 光谱图像是通过不同波段的传感器获得的图像,包含大量的光谱信息。利用卷积神经网络处理光谱图像可以提取出图像中的特征信息,用于分类、分割和识别等任务。 在MATLAB中,可以使用深度学习工具箱来构建和训练卷积神经网络。首先,需要准备好光谱图像数据集,并将其划分为训练集和测试集。然后,可以选择合适的卷积神经网络结构进行构建,如VGG、ResNet等。 接下来,使用MATLAB提供的函数对网络进行训练。可以选择不同的优化算法和损失函数来优化网络的参数,使其能够更好地拟合训练数据。训练过程中,可以使用数据增强技术增加训练数据的多样性,提模型的泛化能力。 训练完成后,可以使用测试集对网络进行评估,计算模型的准确率、召回率等指标。若模型表现不佳,可以调整网络的超参数,如学习率、批大小等,重新进行训练。 最后,可以使用训练好的卷积神经网络对新的光谱图像进行预测。将输入图像输入到网络中,获取网络输出的预测结果,可以得到图像分类、分割或识别结果。 总之,使用MATLAB进行光谱图像处理的卷积神经网络实现,需要准备数据集、构建网络、训练网络和评估网络,并利用训练好的网络对新图像进行预测。这种方法能够有效提取光谱图像中的特征信息,提图像处理的准确性和效率。 ### 回答3: 卷积神经网络光谱图像处理中起着重要的作用,而MATLAB是一个非常适合进行图像处理和深度学习的工具。结合这两者,我们可以利用MATLAB中的卷积神经网络工具箱进行光谱图像的处理。 首先,使用MATLAB加载并预处理光谱图像数据。MATLAB提供了各种加载和预处理图像的函数,例如imread和imresize等,可以将光谱图像转换为适合输入到神经网络模型的格式。 然后,选择适合任务的卷积神经网络模型。MATLAB提供了许多预训练的卷积神经网络模型,例如AlexNet和VGG-16等。根据光谱图像处理的具体任务,可以选择合适的模型。 接下来,用加载的光谱图像数据训练选定的卷积神经网络模型。MATLAB中的卷积神经网络工具箱提供了训练函数,例如trainNetwork,可以根据自定义的训练集和标签进行网络的训练。 训练完成后,可以使用训练好的卷积神经网络模型对新的光谱图像进行处理和分类。MATLAB中的卷积神经网络工具箱提供了classify和predict等函数,可以使用训练好的模型对新的图像进行分类和预测。 最后,根据具体的任务需求对处理后的光谱图像结果进行分析和应用。可以使用MATLAB中的各种图像处理和分析函数,例如imwrite和imshow等,对图像进行显示、保存和进一步处理。 总之,利用MATLAB的卷积神经网络工具箱可以方便地进行光谱图像的处理。通过加载、预处理、选择模型、训练和应用等步骤,可以实现光谱图像分类、预测和分析等任务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值