基于GTSRB数据集的交通标志识别实验(Tensorflow)

2023-05-16

基于GTSRB的交通标志识别实验

  • 一、数据
    • 数据读取
  • 二、搭建网络
  • 三、模型预测
  • 四、附录
    • 模块导入
    • Code
  • 结语

一、数据

官网下载太慢,然后我找到了一个整理好的数据集
链接: GTSRB-德国交通标志识别图像数据 .
数据集很干净,直接用就好了,它把所有的数据信息单独列了一个csv文件。
数据集有43个大类 。
每个类按规律排列,需要将其打乱顺序。
在这里插入图片描述
训练集:
在这里插入图片描述
在这里插入图片描述

测试集:在这里插入图片描述
如图,虽然数据集要干净一些,但是读取测试集和训练集的方法不一样

数据读取

1、训练数据
因为训练集是按规律排列的,而且数据量很大,所以先打乱顺序,将其划分出一个训练集一个测试集。(原数据集里边的测试集不是按类别分的,读出来格式不太一样,就直接用这个了)

#%%
#划分训练集和测试集
import os
import random
import shutil
path = 'F:\GTSRB-德国交通标志识别图像数据\Train'
dirs = []
split_percentage = 0.2
for dirpath, dirnames, filenames in os.walk(path, topdown=False):
   for dirname in dirnames:
       fullpath = os.path.join(dirpath, dirname)
       fileCount = len([name for name in os.listdir(fullpath) if os.path.isfile(os.path.join(fullpath, name))])
       files = os.listdir(fullpath)
       for index in range((int)(split_percentage * fileCount)):
           newIndex = random.randint(0, fileCount - 1)
           fullFilePath = os.path.join(fullpath, files[newIndex])
           newFullFilePath = fullFilePath.replace('Train', 'Final_Validation')
           base_new_path = os.path.dirname(newFullFilePath)
           if not os.path.exists(base_new_path):
               os.makedirs(base_new_path)
           # move the file
           try:
               shutil.move(fullFilePath, newFullFilePath)
           except IOError as error:
               print('skip moving from %s => %s' % (fullFilePath, newFullFilePath))

然后就可以对数据开始处理准备训练:

#%%
import shutil
import os
import matplotlib.pyplot as plt

train_set_base_dir = 'F:\GTSRB-德国交通标志识别图像数据\Train'
validation_set_base_dir = 'F:\GTSRB-德国交通标志识别图像数据\Final_Validation'

# 数据处理
from keras.preprocessing.image import ImageDataGenerator

train_datagen = ImageDataGenerator(
    rescale=1. / 255
)
train_data_generator = train_datagen.flow_from_directory(
    directory=train_set_base_dir,
    target_size=(48, 48),
    batch_size=32,
    class_mode='categorical')


validation_datagen = ImageDataGenerator(
    rescale=1. /255
)

validation_data_generator = validation_datagen.flow_from_directory(
    directory=validation_set_base_dir,
    target_size=(48, 48),
    batch_size=32,
    class_mode='categorical'
)

2、验证数据:
因为老是奇奇怪怪的报错,所以干脆用它给出来的Test文件夹里的测试集验证预测了。

#%%

path = 'F:\GTSRB-德国交通标志识别图像数据'

csv_files = []
for dirpath, dirnames, filenames in os.walk(path, topdown=False):
    for filename in filenames:
        if filename.endswith('.csv'):
            csv_files.append(os.path.join(dirpath, filename))
            

#%%
import matplotlib.image as mpimg
test_image=[]
test_lable=[]
x=''
csv=csv_files[1] #F:\GTSRB-德国交通标志识别图像数据\Test.csv
base_path = os.path.dirname(csv)
# read csv data
trafficSigns = []
with open(csv,'r',newline='') as file:
    header = file.readline()
    header = header.strip()
    header_list = header.split(',')

    print(header_list)
    #print(header_list[6])
    for row in file.readlines():
        row_data = row.split(',')
        x=row_data[7]
        x='F:/GTSRB-德国交通标志识别图像数据/'+x
        x=x.strip('\n')
        test_lable.append(row_data[6])
        test = Image.open(x)
        test = test.resize((48,48),Image.ANTIALIAS)
        test = np.array(test)
        test_image.append(test)
test_data = np.array(test_image)

注:关于Test文件夹里的数据,因为读出来不是generator格式,所以最开始使用训练集抽取出来的20%作为测试集的,最后用test文件预测时出现了这个问题:
训练集:
在这里插入图片描述
模型评估的分非常高,然后预测时就变成了这样
在这里插入图片描述
准确率直接掉到了6%
关于用test文件夹里的数据做评估时,最开始分别输入数据和标签老是报错,最后找到原因是,label数据不能自动进行one-hot编码,所以需要手动进行。
所以我重新做了一下数据处理,干脆将其转换成generator对象。

二、搭建网络

#%%
import tensorflow as tf
from keras.models import Sequential
from keras.layers import Conv2D, MaxPool2D, Flatten, Dense, Dropout

#模型使用简单四层卷积,加flatten和dense层作为分类器,对其进行分类
model = Sequential()

# layers.conv2D
#此处选择四层二维卷积,并做全局池化
model.add(Conv2D(filters=32, kernel_size=(3, 3), activation='relu', input_shape=(48, 48, 3)))
model.add(MaxPool2D(pool_size=(2, 2), padding='valid'))

model.add(Conv2D(filters=64, kernel_size=(3, 3), activation='relu'))
model.add(MaxPool2D(pool_size=(2, 2), padding='valid'))

model.add(Conv2D(filters=128, kernel_size=(3, 3), activation='relu'))
model.add(MaxPool2D(pool_size=(2, 2), padding='valid'))

model.add(Conv2D(filters=128, kernel_size=(3, 3), activation='relu'))
model.add(MaxPool2D(pool_size=(2, 2), padding='valid'))

#分类器
model.add(Flatten())
# dropOut layer
model.add(Dropout(0.2))
model.add(Dense(units=512, activation='relu'))
model.add(Dense(units=43, activation='softmax'))

#编译
#多分类单标签问题,loss选择的'categorical_crossentropy'
model.compile(loss='categorical_crossentropy', optimizer='rmsprop', metrics=['acc'])

# 打印模型
model.summary()
json_str = model.to_json()
print(json_str)
#%%

# fit_generator to fill in the dataset
#设置训练次数为30
history = model.fit_generator(
    generator=train_data_generator,
    steps_per_epoch=100,
    epochs=27,#在训练30次的过程中可以发现,在第27次时就已经过拟合
    validation_data=validation_data_generator,
    validation_steps=50)

#保存模型
model.save('F:/MLCourse/model27epoch.h5')

#%%
#绘制训练情况
acc = history.history['acc']
val_acc = history.history['val_acc']
loss = history.history['loss']
val_loss = history.history['val_loss']

epochs = range(1, len(acc) + 1)
plt.plot(epochs, acc, 'bo', label='Training acc')
plt.plot(epochs, val_acc, 'b', label='Validation acc')
plt.title('Training and validation accuracy')
plt.legend()

plt.figure()

plt.plot(epochs, loss, 'bo', label='Training loss')
plt.plot(epochs, val_loss, 'b', label='Validation loss')
plt.title('Training and validation loss')
plt.legend()

plt.show()

这里只是在测试写的程序,模型就用的普通的卷积层,验证效果并不好,建议下载一些预训练模型。
这里最开始训练了30次:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

可以看出来27次就过拟合了,训练精度还是蛮高的,可能是数据比较规律。

三、模型预测

因为一直在整数据,不想太麻烦,就把模型单独训练的。在这里加了一层softmax层做概率输出。

#%%
#下载训练好的模型
#import keras
new_model = keras.models.load_model('F:/MLCourse/model27epoch.h5')
#test_loss, test_acc = new_model.evaluate(test_image, test_lable)
#print('\nTest accuracy:', test_acc)
#附加一个 softmax 层,将 logits 转换成更容易理解的概率
probability_model = tf.keras.Sequential([new_model, 
                                         tf.keras.layers.Softmax()])
#%%
#预测测试集中所有模型的标签
predictions = probability_model.predict(test_data)

然后,我就发现差不多只预测对了很少qaq|。所以过了一天我突然想改一改,所以上面重新处理了一下测试集数据,将其进行one-hot编码之后,转化成generator对象。然后重新训练了一次。
然后我又训练了一次,无论是将混乱的测试集作为训练输入,还是将比较规律的测试集作为输入,最后评估效果都很差,所以我决定重新设计网络。使用VGG16进行预训练。
然后训练完之后,如果用test里的文件和Train里的文件一个验证一个训练的话,验证精度依旧上不去。所以我就混合了一下,做了交叉验证。
然后验证精度就变成了:
在这里插入图片描述

四、附录

模块导入

因为怕麻烦,所以分开了很多文件搞的,搞了个大集合

#%%
import shutil
import os
import matplotlib.pyplot as plt
import keras
import tensorflow as tf
from PIL import Image
import numpy as np
from keras.preprocessing.image import ImageDataGenerator
from keras.preprocessing import image
import sys
import numpy as np
from tensorflow.keras import datasets, layers, models
from keras.models import Sequential
from keras.layers import Conv2D, MaxPool2D, Flatten, Dense, Dropout

Code

#%%Train文件划分后的数据处理
train_set_base_dir = 'F:\GTSRB-德国交通标志识别图像数据\Train'
validation_set_base_dir = 'F:\GTSRB-德国交通标志识别图像数据\Final_Validation'
#%%
train_datagen = ImageDataGenerator(
    rescale=1. / 255
)
train_data_generator = train_datagen.flow_from_directory(
    directory=train_set_base_dir,
    target_size=(48, 48),
    batch_size=32,
    class_mode='categorical')
#%%

validation_datagen = ImageDataGenerator(
    rescale=1. /255
)

validation_data_generator = validation_datagen.flow_from_directory(
    directory=validation_set_base_dir,
    target_size=(48, 48),
    batch_size=32,
    class_mode='categorical'
)





#%%Test文件数据处理

path = 'F:\GTSRB-德国交通标志识别图像数据'

csv_files = []
for dirpath, dirnames, filenames in os.walk(path, topdown=False):
    for filename in filenames:
        if filename.endswith('.csv'):
            csv_files.append(os.path.join(dirpath, filename))
            

#%%
import matplotlib.image as mpimg
test_image=[]
test_lable=[]
x=''
csv=csv_files[1] #F:\GTSRB-德国交通标志识别图像数据\Test.csv
base_path = os.path.dirname(csv)
# read csv data
trafficSigns = []
with open(csv,'r',newline='') as file:
    header = file.readline()
    header = header.strip()
    header_list = header.split(',')

    print(header_list)
    #print(header_list[6])
    for row in file.readlines():
        row_data = row.split(',')
        x=row_data[7]
        x='F:/GTSRB-德国交通标志识别图像数据/'+x
        x=x.strip('\n')
        m=row_data[6]
        test_lable.append(int(row_data[6]))
        test = Image.open(x)
        test = test.resize((48,48),Image.ANTIALIAS)
        test = np.array(test)
        test_image.append(test)

#%%
test_data = np.array(test_image)
#%%
test_lable = np.array(test_lable)
#%%
#标签进行one-hot编码
labels = test_lable
one_hot_labels = tf.one_hot(indices=labels,depth=43, on_value=1, off_value=0, axis=-1, dtype=tf.int32, name="one-hot")
#%%
#print(one_hot_labels.shape)
test_datagen = ImageDataGenerator(
    rescale=1. /255
)

test_data_generator = test_datagen.flow(
    x=test_data,
    y=one_hot_labels,
    #target_size=(48, 48),
    batch_size=32
    #class_mode='categorical'
)


#%%
print(test_lable)        


#%%训练
import tensorflow as tf
from keras.models import Sequential
from keras.layers import Conv2D, MaxPool2D, Flatten, Dense, Dropout

#模型使用简单四层卷积,加flatten和dense层作为分类器,对其进行分类
model = Sequential()

# layers.conv2D
#此处选择四层二维卷积,并做全局池化
model.add(Conv2D(filters=32, kernel_size=(3, 3), activation='relu', input_shape=(48, 48, 3)))
model.add(MaxPool2D(pool_size=(2, 2), padding='valid'))

model.add(Conv2D(filters=64, kernel_size=(3, 3), activation='relu'))
model.add(MaxPool2D(pool_size=(2, 2), padding='valid'))

model.add(Conv2D(filters=128, kernel_size=(3, 3), activation='relu'))
model.add(MaxPool2D(pool_size=(2, 2), padding='valid'))

model.add(Conv2D(filters=128, kernel_size=(3, 3), activation='relu'))
model.add(MaxPool2D(pool_size=(2, 2), padding='valid'))

#分类器
model.add(Flatten())
# dropOut layer
model.add(Dropout(0.2))
model.add(Dense(units=512, activation='relu'))
model.add(Dense(units=43, activation='softmax'))

#编译
#多分类单标签问题,loss选择的'categorical_crossentropy'
model.compile(loss='categorical_crossentropy', optimizer='rmsprop', metrics=['acc'])

# 打印模型
model.summary()
json_str = model.to_json()
print(json_str)

#%%

# fit_generator to fill in the dataset
#设置训练次数为30
history = model.fit_generator(
    generator=train_data_generator,
    steps_per_epoch=100,
    epochs=27,#在训练30次的过程中可以发现,在第27次时就已经过拟合
    validation_data=validation_data_generator,
    validation_steps=50)

#保存模型
model.save('F:/MLCourse/model27epoch.h5')

#%%
#绘制训练情况
acc = history.history['acc']
val_acc = history.history['val_acc']
loss = history.history['loss']
val_loss = history.history['val_loss']

epochs = range(1, len(acc) + 1)
plt.plot(epochs, acc, 'bo', label='Training acc')
plt.plot(epochs, val_acc, 'b', label='Validation acc')
plt.title('Training and validation accuracy')
plt.legend()

plt.figure()

plt.plot(epochs, loss, 'bo', label='Training loss')
plt.plot(epochs, val_loss, 'b', label='Validation loss')
plt.title('Training and validation loss')
plt.legend()

plt.show()

#%%

print(train_data_generator[0])



#%%
#下载训练好的模型
#import keras
new_model = keras.models.load_model('F:/MLCourse/model27epoch.h5')
#test_loss, test_acc = new_model.evaluate(test_image, test_lable)
#print('\nTest accuracy:', test_acc)
#附加一个 softmax 层,将 logits 转换成更容易理解的概率
probability_model = tf.keras.Sequential([new_model, 
                                         tf.keras.layers.Softmax()])

#%%
#test_loss, test_acc = new_model.evaluate_generator(validation_data_generator)
#print('\nTest accuracy:', test_acc)
new_model.compile(loss='categorical_crossentropy', optimizer='rmsprop', metrics=['acc'])
new_model.summary()
#%%
#划分出来的测试集评估
scores = new_model.evaluate(validation_data_generator)
print(scores)

#%%
#test评估
scores2 = new_model.evaluate(test_data,one_hot_labels, verbose=2)
print(scores2)



#%%
#预测测试集中所有模型的标签
predictions = probability_model.predict(test_data)

结语

各种奇怪的报错姿势,小细节really重要。
PS.我去瞅了瞅测试集,有些图片都黑成一坨了,我都看不出来有东西。
PPS.本来考研好累,想搞搞这个放松放松,结果更自闭了.jpg
QAQ|、、、

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于GTSRB数据集的交通标志识别实验(Tensorflow) 的相关文章

  • vscode 同步gitee远程仓库

    一 首先在gitee端创建远程仓库 二 在vscode中配置git信息 git config global user name 34 your name 34 git config global user email 34 your ema
  • QGC地面站参数调节

    校准 xff1a 1 选择机架 xff1a 一般用DJI Flame Wheel F450机架 xff0c 选择之后点击 应用并重启 xff1b 2 传感器校准 xff1a 无人机会重新连接地面站 xff0c 依次校准 磁罗盘 陀螺仪 xf
  • PX4初级教程

    链接 xff1a https pan baidu com s 1VIQcOQt I5 evMx1jnV0ZQ 提取码 xff1a 8niq
  • Qt Creator编写无人机地面站系统

    用户登录界面 将用户注册的账户信息如实填写 xff0c 然后输入验证码 xff0c 点击 xff02 登录 xff02 即可进入无人机地面站管理系统 xff0e 地面站界面
  • Mavlink自定义协议

    参照本人博客 xff1a 博客直达 浏览密码 xff1a N414 这里不做描述 xff0c 详细过程请移步本人博客
  • 狼群算法资源总结

    狼群算法介绍 xff1a 狼群算法的优化 狼群算法三维路径规划 xff1a 狼群算法三维路径规划Matlab
  • html+css+php+mysql实现注册+登录+修改密码(附完整代码)

    注 xff1a 转载及使用源代码请注明来源 xff01 如疑问可私信 xff01 目的 xff1a 在利用QT软件进行登录软件开发时 xff0c 就想要实现点击按钮跳转到指定网页进行注册以及修改密码等操作 xff0c 就像QQ客户端那样可以
  • Qt嵌入外部EXE程序,并显示在主界面中!

    一 获取程序句柄以及类 打开Visual Studio 进行查询 二 QT调用程序 H文件 span class token macro property span class token directive keyword ifndef
  • Cmake软件编译opencv报错,CMake Warning at cmake/OpenCVDownload.cmake:193 (message): FFMPEG: Download...

    当执行如下操作时 xff1a 出现下面报错 xff0c 在链接ipaddress com查询raw githubusercontent com地址 xff0c 然后将ip添加至C Windows System32 drivers etc h
  • MOT:MOTchallenge任务评价方法

    GT介绍 span class token number 1 1 span 912 484 97 109 0 7 1 span class token number 2 1 span 912 484 97 109 0 7 1 span cl
  • /bin/sh^M: 坏的解释器: 没有那个文件或目录

    在windows上面notepad 43 43 写的shell文件 xff0c 复制带Linux上面提示错误 bin sh M 坏的解释器 没有那个文件或目录 在命令行执行下面语句 xff1a span class token commen
  • 相机内参矩阵、外参矩阵、畸变矩阵

    1 相机针孔模型 图中 xff0c X坐标系是针孔所在坐标系 xff0c Y坐标系为成像平面坐标系 xff0c P为空间一点 xff0c 小孔成像使得P点在图像平面上呈现了一个倒立的像 齐次形式 xff1a 在此 xff0c 我们先暂时舍弃
  • STM32—驱动GY85-IMU模块

    GY85是一个惯性测量模块 xff0c 内部集成了三轴加速度计 三轴陀螺仪 电子罗盘 气压传感器等芯片 xff0c 用于测量和报告设备速度 方向 重力 xff0c 模块可以将加速度计 陀螺仪 电子罗盘等传感器的数据进行综合 xff0c 在上
  • MPU6050原始数据分析——学习笔记

    MPU6050原始数据分析 学习笔记 个人学习笔记MPU6050简介 原始数据分析加速度计陀螺仪代码 个人学习笔记 用于记录自己学习的成果 xff0c 并且分享给大家一起看看 希望对看到这篇的朋友有所帮助 MPU6050简介 MPU 605
  • DAY15 异常捕获

    DAY15 异常捕获 一 文件操作细节问题 1 1 参数encoding open file mode 61 r encoding 61 None encoding 设置文本文件的编码或者解码方法 xff08 将数据写入到文件之前会自动编码
  • x86-从实模式到保护模式(总结)

    总结主要针对最后一章的内容 xff0c 最后一张的程序使用的是平坦模式 代码段和数据段都是从0x00000000到0xffffffff xff0c 能够访问4GB的地址空间 使用平坦模式的好处 xff1a 不用频繁的在段与段之间进行切换 代
  • Docker 部署 Prometheus & Grafana (监控主机进程)

    目录 1 环境介绍 xff1a 2 部署 主机进程 监控1 使用 Docker 部署 Grafana2 部署并启动 prometheus3 下载 process exporter4 创建并编辑文件 process name yaml5 在
  • 【Docker】报错:Got permission denied while trying to connect to the Docker daemon socket at unix:///var/

    报错原因 在VMWARE中安装的centos中查看容器Docker所安装的镜像命令时即执行 docker images 时虚拟机报错 xff0c 该用户没有此类权限 错误 xff1a Got permission denied while
  • linux ubuntu 彻底卸载包,清理linux软件卸载残留

    使用以下命令清理残留配置 xff0c 其实就是删除残留的 rc文件 dpkg span class token parameter variable l span span class token operator span span cl
  • list和array 访问不连续index

    python中内置数据类型list与numpy array都是常会用到的两种数据结构 二者在访问变量中不连续index时处理方式有所不同 array array访问不连续index的方式非常简单 xff0c 只需要用定义好的索引直接截取ar

随机推荐

  • TVM Windows conda 安装

    TVM Windows 安装 简介 本篇博客主要目的是帮助大家在windows平台上安装好tvm xff0c 并且可以顺利使用 因为有项目需要使用tvm xff0c 同时自己需要用windows做一些测试 xff0c 因此想要在window
  • 探讨ros下的cmakelists文件的编写

    文章目录 cmakelists文件整体架构分块讲解1 CMake版本2 软件包名称3 查找相关的CMake包4 消息 服务 动作生成器 cmakelists文件整体架构 所需CMake版本 xff08 cmake minimum requi
  • git 克隆指定分支

    git clone b 分支名 仓库地址
  • 【NVIDIA】Jetson Xavier NX镜像烧录

    设备信息 我的设备是Jetson Xavier NX xff1b 准备工作 鼠标 键盘 显示器SD卡 32GB至少 网线 xff08 也可以wifi xff09 官方教程 xff1a https developer nvidia com e
  • Android GPS学习 (二) :GPS 服务启动以及初始化流程

    扫码关注 xff0c 一起学习 1 GPS 服务启动 SystemServer java的startOtherServices方法中添加LocationManagerService方法的代码如下 frameworks base servic
  • docker运行ubuntu22.04出现异常(转载)

    原文链接 xff1a https xyz uscwifi xyz post PRTc2ZYZx 参考 xff1a docker Why I cannot run 96 apt update 96 inside a fresh ubuntu
  • 为什么执行同一个程序每次输出的变量地址是不一样的

    首先看一下下面的代码 include lt stdio h gt int main int a 61 1 printf 34 p n 34 amp a return 0 然后我就很疑惑 xff0c 为什么每次的地址都是不一样的 为什么会有这
  • 中断的基本概念

    异常和中断 概念 xff1a 程序执行过程中CPU会遇到一些特殊情况 xff0c 是正在执行的程序被 中断 xff0c cpu中止原来正在执行的程序 xff0c 转到处理异常情况或特殊事件的程序去执行 xff0c 结束后再返回到原被中止的程
  • 8086CPU结构与功能

    微处理器的外部结构 微处理器的外部结构如下图所示 8086CPU片有40个管脚 微处理器通过这些引脚与外部的逻辑部件连接 完成信息的交换 CPU的这些引脚称为微处理器级的总线 功能 与存储器之间交换信息 指令及数据 与I O设备之间交换信息
  • 8086微处理器的寄存器组织

    8086CPU内部有14个16位的寄存器 按功能可以分为8个通用寄存器 4个段寄存器和两个控制寄存器 通用寄存器 通用寄存器可以分为两类 数据寄存器 AX BX CX DX 和地址寄存器 变址寄存器 SI DI SP BP 8086CPU有
  • python dict setdefault()方法

    描述 Python 字典 setdefault 函数和 get 方法 类似 如果键不存在于字典中 xff0c 将会添加键并将值设为默认值
  • CPU原生支持的任务切换方式

    CPU 厂商原本计划的一种任务切换方法 xff0c 并不是操作系统实例中任务切换的方法 未采用的原因是此方法效率不高 xff0c 现代操作系统很少用这种方法切换任务 为了支持多任务 xff0c CPU 厂商提供了 LDT TSS 这两种原生
  • linux内核2.6.16版本启动分析(1)

    电脑的启动流程详见这篇博文电脑开机过程 简述一下就是按下电源键后 cs ip置位到0xffff0的位置 而这个位置是固化的 上面都刻录好了BIOS程序 BIOS执行基本的硬件自检以及建立中断向量表 初始化BIOS中断等 接下来会把第一块磁盘
  • linux内核目录分析

    最近准备开始研读linux的内核了 今天在deepin内核版本为4 8 15上编译安装了内核4 19 6 本来是先装2 6 16版本的 但2 6 16版本的内核版本要求gcc的版本为4 6之下 装4 6版本的gcc的时候出了点问题 还没解决
  • AT&T语法

    在linux内核编写中 为了维持与gcc输出汇编程序的兼容性 as汇编器使用AT amp T系统的V的汇编语法 下面简称为AT amp T语法 这种语法与Intel汇编程序使用的语法 简称Intel语法 很不一样 他们之间的主要区别有以下几
  • eBPF入门

    BPF和eBPF是什么 简单来说 BPF提供了一种在和各种内核和应用程序事件发生时运行一段小程序的机制 BPF是一项灵活而高效的技术 由指令集 存储对象和辅助函数等几部分组成 由于它采用了虚拟指令集规范 因此也可将它视作一种虚拟机的实现 这
  • make详解

    Make 1 学习make的必要性 在Linux中 有一个用来维护程序模块关系和生成可执行程序的工具 xff0d make 他可以根据程序模块的修改情况重新编译链接生成中间代码或最终的可执行程序 执行make 命令 xff0c 需要一个名为
  • Linux:网络编程——UDP代码及其封装

    Linux xff1a 网络编程 UDP代码及其封装 UDP代码封装UDP 前面我们了解了 UDP的编程步骤为 xff1a 客户端 xff1a 创建套接字 接收消息 发送消息 接收消息 服务端 xff1a 创建套接字 绑定地址信息 接收消息
  • 卷积神经网络CNN笔记(Tensorflow)

    卷积神经网络学习笔记 一 卷积神经网络相关定义二 基本步骤三 数据增强1 基本原理2 keras实现3 卷积神经网络中的应用 四 常用代码五 实验代码六 使用预训练的卷积神经网络结语 一 卷积神经网络相关定义 卷积层 xff08 Convo
  • 基于GTSRB数据集的交通标志识别实验(Tensorflow)

    基于GTSRB的交通标志识别实验 一 数据数据读取 二 搭建网络三 模型预测四 附录模块导入Code 结语 一 数据 官网下载太慢 xff0c 然后我找到了一个整理好的数据集 链接 GTSRB 德国交通标志识别图像数据 数据集很干净 xff