深度学习训练营之船类识别

news2024/11/26 2:37:46

深度学习训练营之船类识别

  • 原文链接
  • 环境介绍
  • 前言收获
  • 前置工作
    • 设置GPU
    • 导入图片
    • 数据预处理
  • 数据可视化
    • 配置数据集
    • 数据显示
  • 构建模型
  • 模型训练
    • 编译
    • 训练模型
  • 结果可视化(模型评估)
    • 损失值可视化
    • 混淆矩阵
    • 各项指标评估

原文链接

  • 🍨 本文为🔗365天深度学习训练营 中的学习记录博客
  • 🍦 参考文章:深度学习100例 | 第29天:船型识别
  • 🍖 原作者:K同学啊|接辅导、项目定制

环境介绍

  • 语言环境:Python3.9.12
  • 编译器:jupyter notebook
  • 深度学习环境:TensorFlow2

前言收获

这次主要是在结果可视化当中学习到了如何使用混淆矩阵来进行模型的评估,这次训练有点长,所以我之训练了十轮,所以结果不是很好请添加图片描述

前置工作

设置GPU

import tensorflow as tf
gpus=tf.config.list_physical_devices("GPU")

if gpus:
    gpu0=gpus[0];#选择第一个GPU
    tf.config.experimental.set_memory_growth(gpu0,True)
    tf.config.set_visible_devices([gpu0],"GPU")
    
import plotly.io as pio
pio.renderers.default="notebook_connected"
import matplotlib.pyplot as plt
import os,PIL,pathlib
import numpy as np
import pandas as pd
import warnings
from tensorflow  import keras#开源人工神经网络库

warnings.filterwarnings("ignore")#忽视警告报错消息
plt.rcParams['font.sans-serif']=['SimHei']#显示中文标签
plt.rcParams['axes.unicode_minus']=False

注:这里有一部分是加了

import plotly.io as pio
pio.renderers.default=“notebook_connected”

这是因为在图片显示的时候我显示的结果是没有图片,是一段乱码的,我想可能是运行或者是文件名等问题,所以后面简单改了一下

导入图片

import pathlib

data_dir = "./29-data/"
data_dir = pathlib.Path(data_dir)
image_count = len(list(data_dir.glob('*/*')))
print("图片总数为:",image_count)

图片总数为: 1462

将图片大小设置为一样

batch_size = 16#批量大小
img_height = 224
img_width  = 224

数据预处理

将数据分成训练集和测试集

##在导入数据的过程当中打乱数据位置
train_ds=tf.keras.preprocessing.image_dataset_from_directory(
    data_dir,
    validation_split=0.2,
    subset="training",
    seed=24,#随机数种子
    image_size=(img_height,img_width),
    batch_size=batch_size
)

Found 1462 files belonging to 9 classes.
Using 1170 files for training.

##在导入数据的过程当中打乱数据位置
val_ds=tf.keras.preprocessing.image_dataset_from_directory(
    data_dir,
    validation_split=0.2,
    subset="validation",
    seed=24,#随机数种子
    image_size=(img_height,img_width),
    batch_size=batch_size
)

Found 1462 files belonging to 9 classes.
Using 292 files for validation.

这里我的随机数种子从12改成了24
切片大小改成了0.2

数据可视化

检查需要查看的类

class_names=train_ds.class_names
print("数据类型有:",class_names)
print("需要识别的船有%d类",len(class_names))

数据类型有: [‘buoy’, ‘cruise ship’, ‘ferry boat’, ‘freight boat’, ‘gondola’, ‘inflatable boat’, ‘kayak’, ‘paper boat’, ‘sailboat’]
需要识别的船有%d类 9

for image_batch,labels_batch in train_ds:
    print(image_batch.shape)
    print(labels_batch.shape)
    break

这里检测了图片的大小是否统一,是否按照上述的image.size进行了调整

(16, 224, 224, 3)
(16,)

配置数据集

AUTOTUNE = tf.data.AUTOTUNE

def train_preprocessing(image,label):
    return (image/255.0,label)

train_ds = (
    train_ds.cache()
    .map(train_preprocessing)    # 这里可以设置预处理函数
    .prefetch(buffer_size=AUTOTUNE)
)

val_ds = (
    val_ds.cache()
    .map(train_preprocessing)    # 这里可以设置预处理函数
    .prefetch(buffer_size=AUTOTUNE)
)

数据显示

plt.figure(figsize=(10, 8))  # 图形的宽为10高为5
plt.suptitle("数据展示")

for images, labels in train_ds.take(1):
    for i in range(15):
        plt.subplot(4, 5, i + 1)
        plt.xticks([])
        plt.yticks([])
        plt.grid(False)

        # 显示图片
        plt.imshow(images[i])
        # 显示标签
        plt.xlabel(class_names[labels[i]-1])

plt.show()

请添加图片描述

构建模型

from tensorflow.keras import layers, models, Input
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Dense, Flatten, Dropout,BatchNormalization,Activation

# 加载预训练模型
base_model = keras.applications.ResNet50(weights='imagenet', include_top=False, input_shape=(img_width,img_height,3))

for layer in base_model.layers:
    layer.trainable = True
    
# Add layers at the end
X = base_model.output
X = Flatten()(X)

X = Dense(512, kernel_initializer='he_uniform')(X)
X = Dropout(0.5)(X)
X = BatchNormalization()(X)
X = Activation('relu')(X)

X = Dense(16, kernel_initializer='he_uniform')(X)
X = Dropout(0.5)(X)
X = BatchNormalization()(X)
X = Activation('relu')(X)

output = Dense(len(class_names), activation='softmax')(X)

model = Model(inputs=base_model.input, outputs=output)

模型训练

编译

optimizer = tf.keras.optimizers.Adam(lr=1e-4)

model.compile(optimizer=optimizer,
                loss='sparse_categorical_crossentropy',
                metrics=['accuracy'])

训练模型

from tensorflow.keras.callbacks import ModelCheckpoint, Callback, EarlyStopping, ReduceLROnPlateau, LearningRateScheduler

NO_EPOCHS = 10
PATIENCE  = 5
VERBOSE   = 1

# 设置动态学习率
# annealer = LearningRateScheduler(lambda x: 1e-3 * 0.99 ** (x+NO_EPOCHS))

# 设置早停
earlystopper = EarlyStopping(monitor='loss', patience=PATIENCE, verbose=VERBOSE)

# 
checkpointer = ModelCheckpoint('best_model.h5',
                                monitor='val_accuracy',
                                verbose=VERBOSE,
                                save_best_only=True,
                                save_weights_only=True)
train_model  = model.fit(train_ds,
                  epochs=NO_EPOCHS,
                  verbose=1,
                  validation_data=val_ds,
                  callbacks=[earlystopper, checkpointer])

结果可视化(模型评估)

本次模型评估学习到了如何使用混淆矩阵进行模型结果的评估

损失值可视化

acc=train_model.history['accracy']
val_acc=train_model.history['val_accuracy']

loss=train_model.history['loss']
val_loss=train_model.history['val_loss']

epochs_range=range(len(acc))

plt.figure(figsize=(12,4))
plt.subplot(1,2,1)

plt.plot(epochs_range,acc,label='Training Accuracy')
plt.plot(epochs_range,val_acc,label='Validation Accuracy')
plt.legend(loc='lower right')
plt.title('Training and Validation Accuracy')

plt.subplot(1,2,2)
plt.plot(epochs_range,loss,label='Traing loss训练误差')
plt.plot(epochs_range,val_loss,label='Validation loss预测误差')
plt.legend(loc='upper right')
plt.title('Training and Validation Loss')
plt.show()

请添加图片描述

混淆矩阵

from sklearn.metrics import confusion_matrix
import seaborn as sns
# import pandas as pd

def plot_cm(labels,predictions):
    #生成混淆矩阵
    conf_numpy=confusion_matrix(labels,predictions)
    conf_df=pd.DataFrame(conf_numpy,index=class_names,columns=class_names)
    plt.figure(figsize=(8,7))
    sns.heatmap(conf_df,annot=True,fmt="d",cmap="BuPu")
    
    plt.title('混淆矩阵',fontsize=15)
    plt.ylabel('True_value真实值',fontsize=14)
    plt.xlabel('val_value预测值',fontsize=14)

设置两个空数组,然后一个两侧循环将结果填入

val_pre=[]
val_label=[]
for images,labels in val_ds:
    for image,label in zip(images,labels):
        #图片增加一个维度 
        img_array=tf.expand_dims(image,0)
        #使用模型预测图片当中的人物 
        prediction=model.predict(img_array)

        val_pre.append(class_names[np.argmax(prediction)])
        val_label.append(class_names[label])     
plot_cm(val_label,val_pre)

请添加图片描述

各项指标评估

from sklearn import metrics

def test_accuracy_report(model):
    print(metrics.classification_report(val_label,val.pre,target_names=class_names))
    score=model.evaluate(val.ds,verbose=0)
    print('loss function: %s,accracy:%s',score[0],score[1])
    
test_accuracy_report(model)

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/573995.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

腾讯云轻量应用服务器的端口怎么开通?

腾讯云轻量应用服务器怎么使用?端口在哪开启?在防火墙中可以开启端口号。 腾讯云轻量应用服务器端口怎么开通?在轻量服务器管理控制台的防火墙中开启端口,如果是CVM云服务器在安全组中开通,阿腾云以轻量应用服务器开通…

Python+Socket实现多人聊天室,功能:好友聊天、群聊、图片、表情、文件等

一、项目简介 本项目主要基于python实现的多人聊天室,主要的功能如下: 登录注册添加好友与好友进行私聊创建群聊邀请/申请加入群聊聊天发送图片聊天发送表情聊天发送文件聊天记录保存在本地中聊天过程中发送的文件保存本地 二、环境介绍 python3.8my…

浅谈 RISC-V 软件开发生态之 IDE

软件开发者是芯片公司非常重要的资产,CPU做出来是不够的,要让更多的软件开发者用这颗芯片才是成功。国际大厂们都有一只较大的软件团队,在做面向开发者的软件工具和SDK等。--张先轶博士:为什么RISC-V需要共建软件生态? 前言 目前…

VsCode终端无法使用conda切换环境的问题

一.问题描述: windows的cmd可以正常使用conda切换环境 为了方便想使用vscode的终端,但是报错: PS C:\Users\admin\Desktop\MyProject> conda activate objection1.8.4 CommandNotFoundError: Your shell has not been properly configured to use conda activate. invocati…

智能排班系统 【管理系统功能、操作说明——下篇】

文章目录 页面与功能展示排班日历月视图(按职位查询)月视图(按员工查询)周视图 排班任务管理创建排班计算任务设置任务的排班规则设置工作日客流量导入任务计算查看任务结果发布任务任务多算法计算 页面与功能展示 排班日历 在排…

vcruntime140.dll丢失的解决方法?教你如何修复好dll文件

Vcruntime140.dll文件是Windows操作系统中非常重要的一个动态链接库文件,用于支持使用Microsoft Visual C编译器创建的应用程序的运行。当Windows系统中的vcruntime140.dll文件丢失时,可能会导致某些应用程序无法正常启动。在尝试启动应用程序时&#xf…

Android HCE开发

我们来详细说明一下关于不同模式下的AID响应问题(前提:一个手机,手机上有A、B两个HCE APP,通过读卡器向手机发送APDU选择指令) 1、A和B的应用AID设置的都是payment模式, 只有手机当前选定的默认支付APP会响…

基于Faster rcnn pytorch的遥感图像检测

基于Faster rcnn pytorch的遥感图像检测 代码:https://github.com/jwyang/faster-rcnn.pytorch/tree/pytorch-1.0 数据集 使用RSOD遥感数据集,VOC的数据格式如下: RSOD是一个开放的目标检测数据集,用于遥感图像中的目标检测。…

图片类型转换,url,File,Base64,Blob

一,图片url转化为文件 function urlToFile(url, imageName) {return new Promise((resolve, reject) > {var blob nullvar xhr new XMLHttpRequest()xhr.open(GET, url)xhr.setRequestHeader(Accept, image/png)xhr.responseType blobxhr.onload () > {b…

JVM内存模型和结构详解

JVM内存模型和Java内存模型都是面试的热点问题,名字看感觉都差不多,实际上他们之间差别还是挺大的。 通俗点说,JVM内存结构是与JVM的内部存储结构相关,而Java内存模型是与多线程编程相关mikechen。 什么是JVM JVM是Java Virtual …

Redis缓存雪崩及解决办法

缓存雪崩 1.缓存雪崩是指在同- -时段大量的缓存key同时失效或者Redis服务宕机,导致大量请求到 达数据库,带来巨大压力。 2.解决方案: ◆给不同的Key的TTL添加随机值 ◆利用Redis集群提高服务的可用性 ◆给缓存业务添加降级限流策略 降级可做为系统的保底…

java程序1补充:从键盘输入圆的半径,求圆的周长和面积(简易与交互两版)

编写一个java程序,从键盘输入圆的半径,求圆的周长和面积,并输出。 要求: (1)半径仅考虑int型正整数,并综合利用所学较好地处理异常输入,包括非法整数、负整数输入时的处理。输入半…

网络编程套接字基本概念认识

目录 认识端口号 认识TCP协议 认识UDP协议 网络字节序 socket编程接口 socket 常见API sockaddr结构 认识端口号 端口号(port)是传输层协议的内容 端口号是一个2字节16位的整数; 端口号用来标识一个进程, 告诉操作系统, 当前的这个数据要交给哪一个进程来处理; IP地址 …

数字电路仿真编译文件指定方式

目录 1 最基本的方式 2 指定多个文件 3. 使用filelist文件 4 指定整个目录中的所有指定后缀的文件 5 指定include文件的搜索路径 6 追加宏的定义 7 Verdi相关的选项 8 Vivado中的处理方式 1 最基本的方式 最基本的方式就是直接在命令行指定单个源文件,比如说…

VMware安装华为存储模拟器

实验需要的软件: VMware Workstation Pro ST00000000201812000*配套的license文件 Dorado5000 V3存储模拟器磁盘 存储模拟器磁盘和license文件资源,在本人主页发布的资源中去下载 安装步骤: 1. 点击 “文件->新建虚拟机”。 2. 在弹框…

MySQL高级篇(SQL优化、索引优化、锁机制、主从复制)

目录 0 存储引擎介绍1 SQL性能分析2 常见通用的JOIN查询SQL执行加载顺序七种JOIN写法 3 索引介绍3.1 索引是什么3.2 索引优劣势3.3 索引分类和建索引命令语句3.4 索引结构与检索原理3.5 哪些情况适合建索引3.6 哪些情况不适合建索引 4 性能分析4.1 性能分析前提知识4.2 Explain…

SQL Server数据库使用

文章目录 前言一、SQL Server 2008 R2 安装例:安装一台SQL Server 2008 R2服务器 二、SSMS管理工具简介1.SQL Server 2008 R2常用的工具2.连接到服务器 三、SQL Server数据库分类及管理1.SQL Server数据库分类2.SQL Server数据库文件类型3.SQL Server数据库管理例&a…

操作系统第五章——输入输出管理(中)

提示:若我会见到你,事隔经年,我如何向你招呼,以眼泪,以沉默 文章目录 5.2.1 IO核心子系统知识总览功能要在那个层次实现 5.2.2 假脱机技术(SPOOLing)知识总览什么是脱机技术假脱机技术——输入井…

Kafka锦集(二):三种不同方式,查看kafka是否已启动

前言 Kafka的启动之前,必不可少的三个操作: 1、启动Zookeeper服务,点击进入 bin/zookeeper-server-start.sh -daemon config/zookeeper.properties 2、 Kafka的下载和安装 3、修改Kafka安装目录下./config/server.properties文件里的监听窗…

考研C语言第三章

3.1 运算 #include <stdio.h>int main() {int result45*2-6/310%4;printf("%d\n",result);return 0; }C语言输出上每次都要带着数据类型&#xff0c;想念java 算术运算符与关系运算符 #include <stdio.h>int main() {int a;while(scanf("%d"…