admin管理员组

文章数量:1444920

深度学习 —— TensorFlow与卷积神经网络(识别船舶)

友友们,早上好呀。今天我们来继续充电,本次我们来了解下卷积神经网络。然后用使用TensorFlow实现神经网络构建,并且应用到识别船舶图片上。ok话不多说,直接开始吧。

先了解几个概念

1.卷积神经网络简单了解

简单来说它就是深度学习中一类专门用于处理具有网格结构数据(如图像)的神经网络。它们通过卷积层、池化层和全连接层等结构,能够高效地提取图像中的局部特征和空间层次关系。卷积神经网络(CNN)的核心在于其卷积操作,该操作通过滑动窗口的方式,在输入数据上应用多个卷积核(也称为滤波器),从而提取出不同的特征图。

关键组成:

卷积层(Convolutional Layer)卷积层是CNN的核心,它通过卷积操作对输入数据进行特征提取。每个卷积核都可以看作是一个特征检测器,能够学习到输入数据中的某种模式或特征。

池化层(Pooling Layer)池化层通常位于卷积层之后,用于对特征图进行下采样,以减少数据的维度和计算量,同时保留重要的特征信息。常用的池化操作有最大池化和平均池化。

全连接层(Fully Connected Layer)全连接层位于CNN的末尾,用于对提取的特征进行组合和分类。在全连接层中,每个神经元都与前一层的所有神经元相连,通过权重和偏置参数进行线性变换和非线性激活。

2.应用到船舶识别示例

数据准备:

首先为了训练CNN模型,我们需要一个标记好的数据集。在这个示例中,我们需要提前准备有一个包含船舶和非船舶图像的公开数据集,并将其分为训练集和测试集。

分别放到下面文件中

train/

-ships/(包含船舶图像)

-non_ships/(包含非船舶图像)

test/

-ships/

-non_ships/

接下来处理一下数据:

数据预处理:

  1. 加载和标签编码:加载图像数据,并为每张图像分配一个标签(比如船舶为1,非船舶为0)。
  2. 图像调整:将图像大小调整为固定尺寸(例如,64x64),以适应CNN的输入要求。
  3. 归一化:将图像像素值归一化到[0, 1]范围。
  4. 数据增强:为了增加数据的多样性,可以应用一些数据增强技术,如旋转、缩放和翻转。

构建CNN模型:

下面进行模型构建:

这里我使用的TensorFlow和Keras框架

代码语言:txt复制
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout
from tensorflow.keras.preprocessing.image import ImageDataGenerator

train_datagen = ImageDataGenerator(
    rescale=1./255,  
    shear_range=0.2,  
    zoom_range=0.2,  # 随机缩放
    horizontal_flip=True,  # 随机水平翻转
)

test_datagen = ImageDataGenerator(rescale=1./255)  

# 训练数据生成器
train_generator = train_datagen.flow_from_directory(
    'pa_dataset/train',    #这里用自己电脑的路径
    target_size=(64, 64),  # 图像大小
    batch_size=32,
    class_mode='binary'  # 二分类任务
)
test_generator = test_datagen.flow_from_directory(
    'pa_dataset/test',
    target_size=(64, 64),
    batch_size=32,
    class_mode='binary'
)
# 构建CNN模型
model = Sequential([
    Conv2D(32, (3, 3), activation='relu', input_shape=(64, 64, 3)),
    MaxPooling2D(pool_size=(2, 2)),
    Dropout(0.25),  # Dropout层用于减少过拟合
    Conv2D(64, (3, 3), activation='relu'),
    MaxPooling2D(pool_size=(2, 2)),
    Dropout(0.25),
    Flatten(),
    Dense(128, activation='relu'),
    Dropout(0.5),  
    Dense(1, activation='sigmoid')  
])

# 编译模型
modelpile(loss='binary_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])
# 训练模型
model.fit(train_generator,
          steps_per_epoch=train_generator.samples // train_generator.batch_size,
          validation_data=test_generator,
          validation_steps=test_generator.samples // test_generator.batch_size,
          epochs=10)

注意一下船舶数据集要具有代表性,最好包含各种船舶类型和非船舶场景。我们可以使用Dropout层、数据增强和正则化技术来减少过拟合。

最后我们可以对模型进行测试然后进行调整。

本文标签: 深度学习TensorFlow与卷积神经网络(识别船舶)