机器学习——图像分类

2023-05-16

1 图像分类的概念

1.1 什么是图像分类?

图像分类,根据图像信息中所反映出来的不同特征,把不同类别的目标区分开来的图像处理方法

1.2 图像分类的难度

●任何拍摄情 况的改变都将提升分类的难度

 1.3 CNN如何进行图像分类

        ●数据驱动型方法通用流程
                1.收集图像以及对应的标签,形成数据集
               2.使用机器学习训练一个分类器
                3.在新的图像.上测试这个分类器

 ​​​

 1.4 图像分类指标

精确率:查得准不准?        
召回率:查得全不全?        

 True positives (TP):飞机的图片被正确的识别成了飞机
True negatives (TN): 大雁的图片没有被识别出来,系统正确地认为它们是大雁
False positives (FP):大雁的图片被错误地识别成了飞机
False negatives (FN):飞机的图片没有被识别出来,系统错误地认为它们是大雁

 True negatives (TN): 4,四个大雁                        False negatives (FN): 2,二个飞机

True positives (TP): 3,绿框.                                False positives (FP): 1,红框,

percision=\frac{TP}{TP+FP}=\frac{3}{3+1}=0.75        recall=\frac{TP}{TP+FN}=\frac{3}{3+2}=0.6

准确率:        ACC=\frac{TP+TN}{TP+TN+FP+FN}

平均精确度( Average Precision,AP) :PR曲线下的面积,这里的average,等于是对precision进行取平均。

 1.5 经典CNN网络性能演化

2 GoogleNet   

2.1 深度网络有什么好处?

1.丰富了低、中、高等级的特征
边缘、纹理、形状、颜色.....高纬度的人类无法理解的特征
2.越深、越宽的网络具有越强的表达能力

  • 日有学者证明,一个宽度为K、深度为H的网络,能够产生至少K^{H}条线段
  • 线段越多,拟合得越准确
  • 因此,网络加宽、加深可以提升性能,并且加深效果比加宽好:

2.2 如何设计一个卷积层?

        ●选择什么样的层(Layer ) ?
                3x3卷积核
                5X5卷积核
                池化层( Pooling Layer )

2.2.1 感受层

         在卷积神经网络中,感受野( Receptive Field )的定义是卷积神经网络每- -层输出的特征图.上的像素点在输入图片.上映射的区域大小。换句话说,感受野是特征图上的一个点对应输入图上的区域。

  • 假设两个卷积层的卷积核尺寸都为2x2,步长都为1,输入为4x4
  • 经过两次卷积后,特征图的尺寸分别为3x3和2x2
  • 对于特征图2的左上角像素点,它在特征图1上的感受范围为左上方的2x2区域,而此区域在输入。上的感受范围是左,上方的3x3区域,因此,感受野尺寸为3x3。
     

  •   日越深层的特征图, 感受野越大
  • 对同层而言,卷积核尺寸越大,感受野越大
  • 大的感受野对大的物体更敏感,反之,小的感受野对小的物体更敏感

 猫可以在图片里有大有小,可以在图片的局部,也可以整张图片都是;对一张图片而言,至少有RGB三个通道,如果这几多个卷积核则会导致计算量过大。 

2.2.2 如何降低计算量——1x1卷积核

1 x 1卷积做了什么?

它在深度( Depth). 上进行了融合深度为D的输入经过一-个1 x 1卷积核,得到深度为1的输出(S=1, P=0);同理,尺寸为DxHxW的输入,经过D/2个1 X 1卷积核,将会得到D/2xHxW的输出(S=1,P=0);最终,在不损失太多信息的情况下,对输入进行了降维。

 小结:1X1的卷积是--个非常优秀的结构它可以跨通道组织信息提高网络的表达能力,同时可以对输出通道升维和降维。[想象一下:两片面包压缩成一-片的宽度又或者加点膨化剂,膨胀成4片的宽度]

2.3 Inception模块

  • 在1x1卷积后,添加不同的卷积分支
  • 实现同一卷积层的多尺度特征提取与融合

2.4 整体网络结构

  •  一个潜在的问题

        ➢在较深的网络中进行反向传播可能会出现“梯度消失”,导致训练无法继续进行

  • 一种解决方案

        ➢网络的中间层具有很高的判别能力
        ➢在这些中间层增加辅助分类器
        ➢在训练中,这些中间层分类器得到的L .oss以0.3的权重加到最终Loss

3 GoogleNet的keras实现

3.0 猫狗大战

本次实战采用的数据集来自kaggle . 上的一一个竞赛: Dogs Vs. Cats

 

 3.1 图像读取一图像增 强-图像生成器

 数据增强策略
        ●翻转变换(lip):沿着水平或者垂直方向翻转图像;
        ●缩放变换(zoom):按照一定的比例放大或者缩小图像;
        ●平移变换(shift):在图像平面上对图像以一定方式进行平移;
        ●可以采用随机或人为定义的方式指定平移范围和平移步长,沿水平或竖直方向进行平移.图像内容的位置
        ●尺度变换(scale):对图像按照指定的尺度因子,进行放大或缩小;或者参照SIFT特征提取思想,利用指定的尺度因子对图像滤波构造尺度空间.改变图像内容的大小或模糊程度;
        ●对比度变换(contrast):在图像的HSV颜色空间,改变饱和度S和V亮度分量,保持色调H不变.对每个像素的S和V分量进行指数运算(指数因子在0.25到4之间),增加光照变化;
        ●噪声扰动(noise):对图像的每个像素RGB进行随机扰动,常用的噪声模式是椒盐噪声和高斯噪声;

代码如下:

import numpy as np
from keras.preprocessing.image import ImageDataGenerator
from PIL import Image
import matplotlib.pyplot as plt
%matplotlib inline
train_dir="train" #训练集路径
test_dir="test"
#测试集路径
IM_WIDTH=224 #图像宽度
IM_HEIGHT=224 #图像高度
batch_size=32
#定义训练和测试的图像生成器
#train and val data
train_val_datagen = ImageDataGenerator (rotation_range=30,
                                        width_shift_range=0.2,
                                        height_shift_range=0.2,
                                        shear_range=0.2,
                                        z0om_range=0.2,
                                        horizontal_flip=True,
                                        validation__split=0.1)   #划分出验证集
#test data
test_datagen=ImageDataGenerator()   #测试集就不用数据增强了

#训练集图像生成器
train_generator=train_val_datagen.flow_from_directory(train_dir,
                                                       target_size=(IM_WIDTH,IM_HEIGHT),    #将目标图片缩放多大的尺寸
                                                       batch_size=batch_size,   #分批次抽取
                                                       subset='training')
#验证集图像生成器
vaild_generator=train_val_datagen.flow_from_directory(train_dir,
                                                      target_size=(IM_WIDTH,IM_HEIGHT),
                                                      batch_size=batch_size,
                                                      subset='validation')
#测试集图像生成器
test_generator=test_datagen.flow_from_directory(test_dir,
                                                target__size=(IM_WIDTH,IM_HEIGHT),
                                                batch_size=batch_size,)
#验证图片生成器的效果,选取生成器的下一个图片并打印出来
samples_batch=train_generator.next()
print(samples_batch[0].shape)#第0位保存的是图像
print(samples_batch[1].shape)#第1位保存的是标签

#显示一张图片
fig1=samples_batch[0][0]
r=Image.fromarray(fig1[:,:,0]).convert('L')#读第0个通道内的值,转为灰度值
g=Image.fromarray(fig1[:,:,1]).convert('L')
b=Image.fromarray(fig1[:,:,2]).convert('L')
image=Image.merge("RGB",(r,g,b))#RGB合并起来
plt.imshow(image)
plt.show()
print(samples_batch[1][0])#打印标签——热编码

运行结果:

3.2 自定义图像生成器

#自定义训练集生成器
def myTrainDataGenerator():
    while True:
        trainDataBatch=train_generator.next()   #取出一个批次的数据
        images=trainDataBatch[0]    #取图像
        labels= [trainDataBatch[1] , trainDataBatch[1] , trainDataBatch[1]]#取标签
        yield images, labels
#自定义验证集生成器
def myVaildDataGenerator():
    while True:
        vaildDataBatch=vaild_generator.next()   #取出一个批次的数据
        images=vaildDataBatch[0]    #取图像
        labels= [vaildDataBatch[1] , vaildDataBatch[1] , vaildDataBatch[1]]#取标签
        yield images, labels
#自定义测试集生成器
def myTestDataGenerator():
    while True:
        testDataBatch=test_generator.next()   #取出一个批次的数据
        images=testDataBatch[0]    #取图像
        labels= [testDataBatch[1] , testDataBatch[1] , testDataBatch[1]]#取标签
        yield images, labels

my_train_generator=myTrainDataGenerator()
my_vaild_generator=myVaildDataGenerator()
my_test_generator=myTestDataGenerator()

a=my_train_generator.__next__()
#显示一张图片
fig1=a[0][0]
r=Image.fromarray(fig1[:,:,0]).convert('L')#读第0个通道内的值,转为灰度值
g=Image.fromarray(fig1[:,:,1]).convert('L')
b=Image.fromarray(fig1[:,:,2]).convert('L')
image=Image.merge("RGB",(r,g,b))#RGB合并起来
plt.imshow(image)
plt.show()
print(samples_batch[1][0][0])

3.3 模型实现

#导入需要使用的包
from keras.models import Model
from keras.layers import Input , Dense, Dropout , BatchNormalization, Conv2D , MaxPool2D , AveragePooling2D, concatenate, Flatten
from keras.layers.convolutional import Conv2D ,MaxPooling2D, AveragePooling2D
from keras.callbacks import ReduceLROnPlateau,ModelCheckpoint , EarlyStopping
from keras.preprocessing.image import ImageDataGenerator
from keras.models import load_model
from keras.preprocessing.image import ImageDataGenerator
from PIL import Image
#若需要复现,可以把随机数固定下来
seed=42
np.random.seed(seed)

#卷积+BN
def Conv2d_BN(prev_layer,   #卷积前一层网络
              filters,  #卷积核数量
              kernel_size,  #卷积核大小
              padding='same',   #‘sanme'指卷积填充是大小保持不小
              strides=(1,1) , #步长
              name=None #名字
              ):
    if name is not None:
        bn_name = name+'_bn'
        conv_name = name +'_conv'
    else:
        bn_name = None
        conv_name = None
    x = Conv2D(filters, kernel_size, padding=padding,strides=strides , activation='relu',name=conv_name) (prev_layer)     #2D图像卷积参数
    x = BatchNormalization(axis=3, name=bn_name)(x) #批次归一化,- -种标准化操作,防止过拟合的手段
    return x


#inception模块
def inception_block(prev_layer, num_filters, name, use_whistle = False, numclasses = -1):
#num_filters: [b0,(b11, b12)。(b21,b22)。 b3] 代表不同分支的通道数,即卷积核个数
#use_ whistle:是否要输出辅助分类器
    #1x1卷积分支
    branch0=Conv2d_BN(prev_layer=prev_layer,filters=num_filters[0],kernel_size=(1,1),name=name+'-br0-1x1')
    #3x3卷积分支,1x1-3x3
    branch1=Conv2d_BN(prev_layer=prev_layer,filters=num_filters[1][0],kernel__size=(1,1),name=name+'-br1-1x1')
    branch1=Conv2d_BN(prev__layer=branch1,filters=num_filters[1][1],kernel_size=(3,3),name=name+'-br1-3x3')
    #5x5卷积分支,1x1-5x5
    branch2=Conv2d_BN(prev__layer=prev_layer,filters=num_filters[2][0],kernel_size=(1,1),name=name+'-br2-1x1')
    branch2=Conv2d_BN(prev_layer=branch2,filters=num_filters[2][1],kernelsize=(5,5),name=name+'-br2-5x5')
    #池化分支
    branch3=MaxPool2D(pool_size=(3,3),strides=(1,1),padding='same',name=name+'-br3-pooL')(prev_layer)
    branch3=Conv2d_BN(branch3,filters=num_filters[3],kernel__size=(1,1),name=name+'-br3-1x1')
    #融合
    x = concatenate([branch0, branch1, branch2, branch3], axis = 3,name = name)
    #是否输出辅助分类器
    if(use_whistle):
        out = aux_whistle(prev_layer, numclasses = numclasses, name = name + '-whistle')
        return x,out
    return x


#辅助分类器
def aux_whistle(prev_layer,numclasses,name):
    aux_clf=AveragePooling2D(pool_size=(5,5),strides=(3,3),name=name+'-averagePool')(prev_layer)    #池化
    aux_clf=Conv2d_BN(aux_clf,filters=128,kernel__size=(1,1),name=name+'-1x1conv')  #卷积
    aux_clf=Flatten(name=name+'-flatten')(aux_clf)
    aux_clf=Dense(1024,activation='relu')(aux_clf)  #全连接
    aux_clf=Dropout(0.3,name=name+'-dropout')(aux_clf)
    aux_clf=Dense(num_classes,activation='softmax',name=name+'-predictions')(aux_clf)
    return aux_clf

def inceptionNet(input_shape,numclasses):
    inp=Input(shape=input_shape)
    #「卷积+池化」x2
    x=Conv2d_BN(inp,filters=64,kernel_size=(7,7),strides=(2,2),name='2a')
    x=MaxPool2D(poolsize=(3,3),strides=(2,2),padding='same',name='2pool-1')(x)
    x=Conv2d_BN(x,filters=192,kernel_size=(3,3),name='2b')
    x=MaxPool2D(pool__size=(3,3),strides=(2,2),padding='same',name='2pool-2')(x)
    #第-Inception模块组,3a.3b
    x=inception_block(x,(64,(96,128),(16,32),32),name='inception3a')
    x=inception_block(x,(128,(128,192),(32,96),64),name='inception3b')
    x=MaxPoo12D(pool_size=(3,3),strides=(2,2),padding='same',name='3pool')(x)
    #第二Inception模块组,4a、4b(辅助)、4c.4d(辅助)、4e
    x=inception_block(x,(192,(96,208),(16,48),64),name='inception4a')
    x,whistle1=inception_block(x,(160,(112,224),(24,64),64),name='inception4b',use_whistle=True,numclasses=numclasses)
    x=inception_block(x,(128,(128,256),(24,64),64),name='inception4c')
    x,whistle2=inception_block(x,(112,(144,288),(32,64),64),name='inception4d',use_whistle=True,numclasses=numclasses)
    x=inception_block(x,(256,(160,320),(32,128),128),name='inception4e')
    x=MaxPool2D(poolsize=(3,3),strides=(2,2),padding='same',name='4pool')(x)
    #第三Inception模块组,5a.5b
    x=inception_block(x,(256,(160,320),(32,128),128),name='inception5a')
    x=inception_block(x,(384,(192,384),(48,128),128),name='inception5b')
    #全局平均池化
    x=AveragePooling2D(pool_size=(7,7),strides=(1,1),padding='valid',name='avg7x7')(x)
    #X=Dropout(0.4)(x)
    # FC+Softmax分类
    x = Flatten (name='flatten')(x)
    x = Dense(numclasses, activation= 'softmax',name= 'predictions')(x)
    model = Model( inp, [x, whistle1,whistle2] ,name=' inception_v1')
    return model

3.4 模型编译

num_classes=len(train_generator.classindices)   #获取类别数
model=inceptionNet(input_shape=(224,224,3),numclasses=num_classes)#获取model对象
model.compile(optimizer='adam', #优化器
              loss='categorical_crossentropy', #损失函数
              loss_weights=[1.0,0.3,0.3],    #损失函数权重
              metrics=['accuracy'])     #评价标准(错误率),如果要用top-k:['accuracy',metric.top_k__categorical_accuracy]
model.summary()#打印出模型概述信息

3.5 模型训练

EPOCH=10    #一个Epoch代表遍历- -次所有数据
batch_size=32 #一 个批次内的图片数量
modelfilepath='model.best.hdf5' #保存路劲
#无法更优则自动终止
earlyStop=EarlyStopping(monitor='val_predictions__acc',
                        patience=30,
                        verbose=1,
                        mode='auto')
#保存最好的模型
checkpoint=ModelCheckpoint(modelfilepath,
                           monitor='val_predictions__acc',
                           verbose=1,
                           save__best_only=True,
                           mode='max')
#根据不同阶段,降低学习率
reduce_Ir=ReduceLROnPlateau(monitor='val_predictions_loss',
                            factor=0.1,
                            patience=10,
                            verbose=1,
                            mode='auto',
                            min_delta=0.00001,
                            C0oldown=0,
                            min__lr=0)
history=model.fit_generator(my_train_generator,validation_data=my_vaild_generator,epochs=EPOCH,steps_per_epoch=train_generator.n/batch_size
,validation_steps=vaild_generator.n/batch_size,callbacks=[checkpoint,reduce_lr,earlyStop])

训练结果:

3.6 模型测试

#=====模型测试=========
testmodel=load_model (modelfilepath)
loss,predictions_loss,aux1_loss, aux2_loss, predictions_acc,aux1_acc, aux2_acc=testmodel. evaluate_generator(my_test_generator,steps=test_generator.n/batch_size)
#绘制训练&验证的准确率值
plt.plot(history.history['predictions_acc'])
plt.plot(history.history['val_predictions_acc'])
plt.title('Model accuracy')
plt.ylabel('Accuracy')
plt.xlabel('Epoch')
plt.legend(['Train','Val'],loc='upper left')
plt.show()
#绘制训练&验证的损失值
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('Model loss')
plt.ylabel('Loss')
plt.xlabel('Epoch')
plt.legend(['Train','Val'],loc='upper left')
plt.show()

测试结果:

 

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

机器学习——图像分类 的相关文章

  • 在php中使用redis cluster 集群

    目前我们用到的 php 的 redis 扩展 主要有2个 xff0c 第一个是最常用的 phpredis 它是用c写的php的高效扩展 xff1a https github com phpredis phpredis xff0c 还有1个是
  • csdn markdown帮助文档

    欢迎使用Markdown编辑器写博客 本Markdown编辑器使用 StackEdit 6 修改而来 xff0c 用它写博客 xff0c 将会带来全新的体验哦 xff1a Markdown和扩展Markdown简洁的语法 代码块高亮 图片链
  • Springboot+Thymeleaf配置与使用

    Springboot 43 Thymeleaf配置与使用 前言 Springboot默认是不支持JSP的 xff0c 默认使用thymeleaf模板引擎 所以这里介绍一下springboot使用Thymeleaf的实例以及遇到的问题 配置与
  • git 解决pull origin 错误 error: The following untracked working tree files would be overwritten by merge

    error The following untracked working tree files would be overwritten by merge bin AndroidManifest xml Please move or re
  • SpringBootTest单元测试组件

    SpringBootTest单元测试组件 一 SpringbootTest 使用Junit4开发 1 添加依赖 span class token tag span class token tag span class token punct
  • ICE C++ Hello World

    ICE C 43 43 Hello World实例教程 1 概述 本文演示了如何编写一个最简单的C 43 43 ICE Internet Communications Engine 应用程序 xff0c 包括必要环境的安装 该应用程序包含客
  • 华为工作的感悟

    参考 xff1a http www openlab net cn forums thread 1002986 1 p10035795 北邮北 xff0c 清华硕 xff0c 一年两个月的华为生活总结 xff0c 算了 xff0c 贴出来了
  • MRCP 媒体资源控制协议

    媒体资源控制协议 xff08 Media Resource Control Protocol MRCP xff09 是一种通讯协议 xff0c 用于语音服务器向客户端提供各种语音服务 如语音识别和语音合成 MRCP并不定义会话连接 xff0
  • Hadoop中VIntWritable编码方式解析

    最近因为实验室的云计算项目 xff0c 开始学习Hadoop xff0c 有时间就记录一下自己在学习过程中的一些小收获吧 Hadoop权威指南 在序列化这一节有个例子程序 xff0c 叫做TextPair xff0c 代码略长 xff0c
  • 测试分析报告

    测试分析报告 1 引言 1 1 1 编写目的 1 1 2 背景 1 1 3 定义 2 1 4 参考资料 2 2 测试概要 2 3 测试结果及发现 3 3 1 测试 1 xff08 normal xff09 3 3 2 测试 2 xff08
  • MapReduce中的二次排序

    在MapReduce操作时 xff0c 我们知道传递的 lt key value gt 会按照key的大小进行排序 xff0c 最后输出的结果是按照key排过序的 有的时候我们在key排序的基础上 xff0c 对value也进行排序 这种需
  • 基于哈夫曼编码的文件压缩解压

    这个程序是研一上学期的课程大作业 当时 xff0c 跨专业的我只有一点 C 语言和数据结构基础 xff0c 为此 xff0c 我查阅了不少资料 xff0c 再加上自己的思考和分析 xff0c 实现后不断调试 测试和完善 xff0c 耗时一周
  • Errors were encountered while processing 解决方法

    在执行更新或者安装软件命令时 sudo apt get upgrade sudo apt get install 遇到 xff1a Errors were encountered while processing 查看错误信息发现 xff1
  • JSON传list数据到springMVC后台并用对象接收

    在项目中经常获取前台table中的数据 然后拼接传向后台 之前一直按照JSON格式拼接 但是非常容易出问题 而且遇到了类似List lt beans gt list 这样的参数 springMVC转化为对象会报错 正确的做法是按下面这种做法
  • Java解析网络数(Json)运用CloseableHttpClient

    最近做用Java网络爬取数据的部分 xff0c 发现在使用Apache的httpclient的时候 xff0c 发现Idea提示DefaultHttpClient等常用的类已经不推荐使用了 现在运用 CloseableHttpClient
  • 【Linux】Ubuntu18.0.4安装wine 失败遇到的问题和解决的思路 尝试覆盖共享/usr/share/doc/ 处理时有错误 /tmp/apt-dpkg-install-6NvbtI/

    bug说明 xff1a dpkg 处理归档 var cache apt archives libattr1 1 2 4 47 2 amd64 deb unpack 时出错 xff1a 尝试覆盖共享的 usr share doc libatt
  • 算法模型---时间序列模型

    文章来源 时间序列 时间序列是时间间隔不变的情况下收集的不同时间点数据集合 xff0c 这些集合被分析用来了解长期发展趋势及为了预测未来 时间序列与常见的回归问题的不同点在于 1 时间序列是跟时间有关的 而线性回归模型的假设 xff1a 观
  • java: 找不到符号 符号: 类 BASE64Encoder 位置: 程序包 sun.misc

    1 问题 新项目编译报错如下 xff1a java 找不到符号 符号 类 BASE64Encoder 位置 程序包 sun misc 2 解决方案 依图如下 xff0c 修改jdk对应的版本即可
  • tar 打包隐藏文件

    前言 xff1a 先说一下遇到的场景 xff1a 前段时间在配合做 DevOps xff0c 组内有块代码是 php 的 xff0c 需要用 tar 命令打包归档上传到 nexus 库 xff0c 后来发现解压出来的包居然缺失了隐藏文件 x
  • The server selected protocol version TLS10 is not accepted by client preferences [TLS12] 报错处理

    一 问题描述 xff1a 项目工程需求要连接 SqlServer 服务器 xff0c 但是报错了 xff0c 完整错误如下 xff1a com microsoft sqlserver jdbc SQLServerException 驱动程序

随机推荐

  • 23种设计模式

    目录 创建型 1 Factory Method xff08 工厂方法 xff09 2 Abstract Factory xff08 抽象工厂 xff09 3 Builder xff08 建造者 xff09 4 Prototype xff08
  • SpringBoot开启异步多线程

    前言 xff1a SpringBoot 的异步多线程需要从 java 的多线程基础说起 xff0c 可以参考 java 多线程实现的三种方式区别 SpringBoot 在此基础上进行了多次封装 xff0c 所以使用起来非常方便 一 核心参数
  • 制作 java-sdk 的两种方式

    前言 xff1a 平时maven工程里 pom 中的引用的依赖就是别人开发好的 sdk 包 xff1b 工作中为了方便一些开发也需要自定义开发 sdk 包 xff0c 下面介绍下怎么开发 一 两种方式 我们平时引用 sdk 有两种方式 xf
  • SpringBoot 之 AOP

    前言 xff1a Spring 三大核心思想是啥 xff0c 还记得不 xff1f IOC xff08 控制反转 xff09 xff0c DI xff08 依赖注入 xff09 xff0c AOP xff08 面向切面编程 xff09 回顾
  • mongodb 的常用数据操作

    摘要 xff1a 主要记录一些常见 的mongodb 的增删改查 xff0c 方便以后查阅 1 增 基本格式 xff1a db test doc insert 或 db test doc save 样例 xff1a db test doc
  • Python键盘输入转换为列表

    Python输入字符串转列表是为了方便后续处理 xff0c 这种操作在考试的时候比较多见 1 在Python3 0以后 xff0c 键盘输入使用input函数 eg1 span class hljs prompt gt gt gt span
  • java.lang.NoSuchMethodError 原因和处理方案

    问题描述 工程中明明有该方法 xff0c 却提示 java lang NoSuchMethodError 错误 1 原因 java 的类加载机制是把所有不同名称的本类和引用类的包全部加载到内存 xff0c 这样就有一个问题 xff0c 如果
  • java:try...catch跳过异常继续处理循环

    问题描述 在代码循环体中 xff0c 抛出异常后代码会停止执行 xff0c 导致代码不能完整运行 解决方案很简单 xff0c 捕获异常并简单处理一下就可以 1 捕获异常继续执行代码 只贴核心样例代码 public void getTest
  • python去掉空格常用方式

    前言 xff1a 处理字符串时经常要定制化去掉无用的空格 xff0c python 中要么用存在的常规方法 xff0c 或者用正则处理 1 去掉左边空格 string 61 34 it is blank space test 34 prin
  • 20190226-LCD_GUI

    LCD GUI 这里需要先剃度填色 xff0c 然后再显示汉字 xff0c 最后在显示符号和数字 xff0c 否则会被覆盖 xff0c 显示不出来汉字或者数字符号
  • Arch安装

    从2021年4月起 xff0c Arch Linux安装镜像中已经包含了一个官方的简易安装程序archinstall 可以支持在连接网络后进行英文交互式安装 Arch Linux News Installation medium with
  • 存储过程懂不懂

    存储过程的官方定义是这么说的 xff1a 存储过程 xff08 Stored Procedure xff09 是一组为了完成特定功能的 SQL 语句集 xff0c 经编译后存储在数据库中 用户通过指定存储过程的名字并给出参数 xff08 如
  • ArchLinux的用户配置和KDE安装

    用户配置 建立用户 目标是新建一个普通用户 xff0c 这个普通用户可以使用sudo提权 以下默认使用username作为用户名 建立无密码用户并创立其默认用户组 useradd username 更改账户密码 passwd usernam
  • Zsh的简单配置

    Zsh 简体中文 ArchWiki archlinux org 本配置的目标是增加一些简单的功能以及一个能过得去的界面 安装 安装zsh xff08 本体 xff09 和zsh completions xff08 补全 xff09 两个包
  • Arch(KDE Plasma)中文化

    Localization 简体中文 Simplified Chinese 简体中文 ArchWiki 生成中文locale xff08 这一步在安装篇就有写 xff09 在 etc locale gen中取消中文的zh CN UTF 8 U
  • yay的安装与使用与Anbox的安装

    yay的安装 安装 首先安装所需软件包base devel和git pacman Syu base devel git 之后使用git clone下载代码 git clone URL FORM AUR 这里的 URL FROM AUR 指从
  • linux下利用C语言实现对文件的操作(创建、复制、修改权限、修改文件名)

    今天在ubuntu下编写一个了C程序实现如下功能 xff1a xff08 1 xff09 创建一个文本文件 xff0c 写入 Hello World xff01 xff08 2 xff09 获取该文件的所有权限 xff08 3 xff09
  • 设计模式案例分析与实现

    1 UML类图及Java实现 案例 xff1a 某基于C S的即时聊天系统登录模块功能描述如下 xff1a 用户通过登录界面 LoginForm 输入账号和密码 xff0c 系统将输入的账号和密码与存储在数据库 User 表中的用户信息进行
  • 决策树算法

    目录 1 概述 1 1 算法导入 1 2 决策树定义 1 3 决策树发展 1 4 结构 1 5 从树到规则 2 决策树的构建 2 1 基本原理 2 2 特征选择 2 3 实例分析 ID3 2 4 增益率 C4 5算法 2 5 基尼指数 CA
  • 机器学习——图像分类

    1 图像分类的概念 1 1 什么是图像分类 xff1f 图像分类 xff0c 根据图像信息中所反映出来的不同特征 xff0c 把不同类别的目标区分开来的图像处理方法 1 2 图像分类的难度 任何拍摄情 况的改变都将提升分类的难度 1 3 C