caffe搭建squeezenet网络的整套工程

之前用pytorch构建了squeezenet,个人觉得pytorch是最好用的,但是有的工程就是需要caffe结构的,所以本篇也用caffe构建一个squeezenet网络。

数据处理

首先要对数据进行处理,跟pytorch不同,pytorch读取数据只需要给数据集所在目录即可直接从中读取数据,而caffe需要一个包含每张图片的绝对路径以及所在类别的txt文件,从中读取数据。写一个生成次txt文件的脚本:

import os
import random

folder = 'cotta'  # 数据集目录相对路径
names = os.listdir(folder)

f1 = open('/train_txt/train_cotta.txt', 'a')  # 生成的txt地址
f2 = open('/train_txt/test_water_workcloth.txt', 'a')

for name in names:
    imgnames = os.listdir(folder + '/' + name)
    random.shuffle(imgnames)
    numimg = len(imgnames)
    for i in range(numimg):
        f1.write('%s %s\n' % (folder + '/' + name + '/' + imgnames[i], name[0]))
        # if i < int(0.9*numimg):
        #     f1.write('%s %s\n'%(folder + '/' + name + '/' + imgnames[i], name[0]))
        # else:
        #     f2.write('%s %s\n'%(folder + '/' + name + '/' + imgnames[i], name[0]))
# f2.close()
f1.close()

数据集的目录也要跟pytorch的一致,一个类的数据放在一个目录中,目录名为类名。且脚本与该目录同级。
运行脚本后生成的txt内容如下:

/cotta/0_other/0_1_391_572_68_68.jpg 0
/cotta/1_longSleeves/9605_1_5_565_357_82_70.jpg 1
/cotta/2_cotta/713_0.99796_1_316_162_96_87.jpg 2
......
图片相对路径 图片所属类别

网络结构配置文件

trainval.prototxt

layer {
     name: "data"
     type: "ImageData"
     top: "data"
     top: "label"
     transform_param {
       mirror: true
       crop_size: 96
     }
    image_data_param {
       source: "/train_txt/train_cotta.txt"   # 生成的txt的相对路径
       root_folder: "/data/"   # 存放数据集目录的路径
       batch_size: 64
       shuffle: true
	   new_height: 96
	   new_width: 96
     }
   }
layer {
  name: "conv1"
  type: "Convolution"
  bottom: "data"
  top: "conv1"
  convolution_param {
    num_output: 96
    kernel_size: 3
    stride: 1
    pad: 1
    weight_filler {
      type: "xavier"
    }
  }
}

layer {  
  name: "BatchNorm1"  
  type: "BatchNorm" 
  bottom: "conv1"  
  top: "BatchNorm1"   
}

layer {
  name: "relu_conv1"
  type: "ReLU"
  bottom: "BatchNorm1"
  top: "BatchNorm1"
}
layer {
  name: "pool1"
  type: "Pooling"
  bottom: "BatchNorm1"
  top: "pool1"
  pooling_param {
    pool: MAX
    kernel_size: 2
    stride: 2
  }
}
layer {
  name: "fire2/squeeze1x1"
  type: "Convolution"
  bottom: "pool1"
  top: "fire2/squeeze1x1"
  convolution_param {
    num_output: 16
    kernel_size: 1
    weight_filler {
      type: "xavier"
    }
  }
}

layer {  
  name: "fire2/bn_squeeze1x1"  
  type: "BatchNorm" 
  bottom: "fire2/squeeze1x1"  
  top: "fire2/bn_squeeze1x1"   
}

layer {
  name: "fire2/relu_squeeze1x1"
  type: "ReLU"
  bottom: "fire2/bn_squeeze1x1"
  top: "fire2/bn_squeeze1x1"
}
layer {
  name: "fire2/expand1x1"
  type: "Convolution"
  bottom: "fire2/bn_squeeze1x1"
  top: "fire2/expand1x1"
  convolution_param {
    num_output: 64
    kernel_size: 1
    weight_filler {
      type: "xavier"
    }
  }
}

layer {  
  name: "fire2/bn_expand1x1"  
  type: "BatchNorm" 
  bottom: "fire2/expand1x1"  
  top: "fire2/bn_expand1x1"   
}

layer {
  name: "fire2/relu_expand1x1"
  type: "ReLU"
  bottom: "fire2/bn_expand1x1"
  top: "fire2/bn_expand1x1"
}
layer {
  name: "fire2/expand3x3"
  type: "Convolution"
  bottom: "fire2/bn_expand1x1"
  top: "fire2/expand3x3"
  convolution_param {
    num_output: 64
    pad: 1
    kernel_size: 3
    weight_filler {
      type: "xavier"
    }
  }
}

layer {  
  name: "fire2/bn_expand3x3"  
  type: "BatchNorm" 
  bottom: "fire2/expand3x3"  
  top: "fire2/bn_expand3x3"   
}

layer {
  name: "fire2/relu_expand3x3"
  type: "ReLU"
  bottom: "fire2/bn_expand3x3"
  top: "fire2/bn_expand3x3"
}
layer {
  name: "fire2/concat"
  type: "Concat"
  bottom: "fire2/bn_expand1x1"
  bottom: "fire2/bn_expand3x3"
  top: "fire2/concat"
}

#fire2 ends: 128 channels
layer {
  name: "fire3/squeeze1x1"
  type: "Convolution"
  bottom: "fire2/concat"
  top: "fire3/squeeze1x1"
  convolution_param {
    num_output: 16
    kernel_size: 1
    weight_filler {
      type: "xavier"
    }
  }
}

layer {  
  name: "fire3/bn_squeeze1x1"  
  type: "BatchNorm" 
  bottom: "fire3/squeeze1x1"  
  top: "fire3/bn_squeeze1x1"   
}

layer {
  name: "fire3/relu_squeeze1x1"
  type: "ReLU"
  bottom: "fire3/bn_squeeze1x1"
  top: "fire3/bn_squeeze1x1"
}
layer {
  name: "fire3/expand1x1"
  type: "Convolution"
  bottom: "fire3/bn_squeeze1x1"
  top: "fire3/expand1x1"
  convolution_param {
    num_output: 64
    kernel_size: 1
    weight_filler {
      type: "xavier"
    }
  }
}

layer {  
  name: "fire3/bn_expand1x1"  
  type: "BatchNorm" 
  bottom: "fire3/expand1x1"  
  top: "fire3/bn_expand1x1"   
}

layer {
  name: "fire3/relu_expand1x1"
  type: "ReLU"
  bottom: "fire3/bn_expand1x1"
  top: "fire3/bn_expand1x1"
}
layer {
  name: "fire3/expand3x3"
  type: "Convolution"
  bottom: "fire3/bn_expand1x1"
  top: "fire3/expand3x3"
  convolution_param {
    num_output: 64
    pad: 1
    kernel_size: 3
    weight_filler {
      type: "xavier"
    }
  }
}

layer {  
  name: "fire3/bn_expand3x3"  
  type: "BatchNorm" 
  bottom: "fire3/expand3x3"  
  top: "fire3/bn_expand3x3"   
}

layer {
  name: "fire3/relu_expand3x3"
  type: "ReLU"
  bottom: "fire3/bn_expand3x3"
  top: "fire3/bn_expand3x3"
}
layer {
  name: "fire3/concat"
  type: "Concat"
  bottom: "fire3/bn_expand1x1"
  bottom: "fire3/bn_expand3x3"
  top: "fire3/concat"
}

#fire3 ends: 128 channels

layer {
  name: "bypass_23"
  type: "Eltwise"
  bottom: "fire2/concat"
  bottom: "fire3/concat"
  top: "fire3_EltAdd"
}


layer {
  name: "fire4/squeeze1x1"
  type: "Convolution"
  bottom: "fire3_EltAdd"
  top: "fire4/squeeze1x1"
  convolution_param {
    num_output: 32
    kernel_size: 1
    weight_filler {
      type: "xavier"
    }
  }
}

layer {  
  name: "fire4/bn_squeeze1x1"  
  type: "BatchNorm" 
  bottom: "fire4/squeeze1x1"  
  top: "fire4/bn_squeeze1x1"   
}

layer {
  name: "fire4/relu_squeeze1x1"
  type: "ReLU"
  bottom: "fire4/bn_squeeze1x1"
  top: "fire4/bn_squeeze1x1"
}
layer {
  name: "fire4/expand1x1"
  type: "Convolution"
  bottom: "fire4/bn_squeeze1x1"
  top: "fire4/expand1x1"
  convolution_param {
    num_output: 128
    kernel_size: 1
    weight_filler {
      type: "xavier"
    }
  }
}

layer {  
  name: "fire4/bn_expand1x1"  
  type: "BatchNorm" 
  bottom: "fire4/expand1x1"  
  top: "fire4/bn_expand1x1"   
}

layer {
  name: "fire4/relu_expand1x1"
  type: "ReLU"
  bottom: "fire4/bn_expand1x1"
  top: "fire4/bn_expand1x1"
}
layer {
  name: "fire4/expand3x3"
  type: "Convolution"
  bottom: "fire4/bn_expand1x1"
  top: "fire4/expand3x3"
  convolution_param {
    num_output: 128
    pad: 1
    kernel_size: 3
    weight_filler {
      type: "xavier"
    }
  }
}

layer {  
  name: "fire4/bn_expand3x3"  
  type: "BatchNorm" 
  bottom: "fire4/expand3x3"  
  top: "fire4/bn_expand3x3"   
}

layer {
  name: "fire4/relu_expand3x3"
  type: "ReLU"
  bottom: "fire4/bn_expand3x3"
  top: "fire4/bn_expand3x3"
}
layer {
  name: "fire4/concat"
  type: "Concat"
  bottom: "fire4/bn_expand1x1"
  bottom: "fire4/bn_expand3x3"
  top: "fire4/concat"
}
#fire4 ends: 256 channels

layer {
  name: "pool4"
  type: "Pooling"
  bottom: "fire4/concat"
  top: "pool4"
  pooling_param {
    pool: MAX
    kernel_size: 2
    stride: 2
  }
}
#fire4 ends: 256 channels / pooled
layer {
  name: "fire5/squeeze1x1"
  type: "Convolution"
  bottom: "pool4"
  top: "fire5/squeeze1x1"
  convolution_param {
    num_output: 32
    kernel_size: 1
    weight_filler {
      type: "xavier"
    }
  }
}

layer {  
  name: "fire5/bn_squeeze1x1"  
  type: "BatchNorm" 
  bottom: "fire5/squeeze1x1"  
  top: "fire5/bn_squeeze1x1"   
}

layer {
  name: "fire5/relu_squeeze1x1"
  type: "ReLU"
  bottom: "fire5/bn_squeeze1x1"
  top: "fire5/bn_squeeze1x1"
}
layer {
  name: "fire5/expand1x1"
  type: "Convolution"
  bottom: "fire5/bn_squeeze1x1"
  top: "fire5/expand1x1"
  convolution_param {
    num_output: 128
    kernel_size: 1
    weight_filler {
      type: "xavier"
    }
  }
}

layer {  
  name: "fire5/bn_expand1x1"  
  type: "BatchNorm" 
  bottom: "fire5/expand1x1"  
  top: "fire5/bn_expand1x1"   
}

layer {
  name: "fire5/relu_expand1x1"
  type: "ReLU"
  bottom: "fire5/bn_expand1x1"
  top: "fire5/bn_expand1x1"
}
layer {
  name: "fire5/expand3x3"
  type: "Convolution"
  bottom: "fire5/bn_expand1x1"
  top: "fire5/expand3x3"
  convolution_param {
    num_output: 128
    pad: 1
    kernel_size: 3
    weight_filler {
      type: "xavier"
    }
  }
}

layer {  
  name: "fire5/bn_expand3x3"  
  type: "BatchNorm" 
  bottom: "fire5/expand3x3"  
  top: "fire5/bn_expand3x3"   
}

layer {
  name: "fire5/relu_expand3x3"
  type: "ReLU"
  bottom: "fire5/bn_expand3x3"
  top: "fire5/bn_expand3x3"
}
layer {
  name: "fire5/concat"
  type: "Concat"
  bottom: "fire5/bn_expand1x1"
  bottom: "fire5/bn_expand3x3"
  top: "fire5/concat"
}

#fire5 ends: 256 channels
layer {
  name: "bypass_45"
  type: "Eltwise"
  bottom: "pool4"
  bottom: "fire5/concat"
  top: "fire5_EltAdd"
}


layer {
  name: "fire6/squeeze1x1"
  type: "Convolution"
  bottom: "fire5_EltAdd"
  top: "fire6/squeeze1x1"
  convolution_param {
    num_output: 48
    kernel_size: 1
    weight_filler {
      type: "xavier"
    }
  }
}

layer {  
  name: "fire6/bn_squeeze1x1"  
  type: "BatchNorm" 
  bottom: "fire6/squeeze1x1"  
  top: "fire6/bn_squeeze1x1"   
}

layer {
  name: "fire6/relu_squeeze1x1"
  type: "ReLU"
  bottom: "fire6/bn_squeeze1x1"
  top: "fire6/bn_squeeze1x1"
}
layer {
  name: "fire6/expand1x1"
  type: "Convolution"
  bottom: "fire6/bn_squeeze1x1"
  top: "fire6/expand1x1"
  convolution_param {
    num_output: 192
    kernel_size: 1
    weight_filler {
      type: "xavier"
    }
  }
}

layer {  
  name: "fire6/bn_expand1x1"  
  type: "BatchNorm" 
  bottom: "fire6/expand1x1"  
  top: "fire6/bn_expand1x1"   
}

layer {
  name: "fire6/relu_expand1x1"
  type: "ReLU"
  bottom: "fire6/bn_expand1x1"
  top: "fire6/bn_expand1x1"
}
layer {
  name: "fire6/expand3x3"
  type: "Convolution"
  bottom: "fire6/bn_expand1x1"
  top: "fire6/expand3x3"
  convolution_param {
    num_output: 192
    pad: 1
    kernel_size: 3
    weight_filler {
      type: "xavier"
    }
  }
}

layer {  
  name: "fire6/bn_expand3x3"  
  type: "BatchNorm" 
  bottom: "fire6/expand3x3"  
  top: "fire6/bn_expand3x3"   
}

layer {
  name: "fire6/relu_expand3x3"
  type: "ReLU"
  bottom: "fire6/bn_expand3x3"
  top: "fire6/bn_expand3x3"
}
layer {
  name: "fire6/concat"
  type: "Concat"
  bottom: "fire6/bn_expand1x1"
  bottom: "fire6/bn_expand3x3"
  top: "fire6/concat"
}
#fire6 ends: 384 channels

layer {
  name: "fire7/squeeze1x1"
  type: "Convolution"
  bottom: "fire6/concat"
  top: "fire7/squeeze1x1"
  convolution_param {
    num_output: 48
    kernel_size: 1
    weight_filler {
      type: "xavier"
    }
  }
}

layer {  
  name: "fire7/bn_squeeze1x1"  
  type: "BatchNorm" 
  bottom: "fire7/squeeze1x1"  
  top: "fire7/bn_squeeze1x1"   
}

layer {
  name: "fire7/relu_squeeze1x1"
  type: "ReLU"
  bottom: "fire7/bn_squeeze1x1"
  top: "fire7/bn_squeeze1x1"
}
layer {
  name: "fire7/expand1x1"
  type: "Convolution"
  bottom: "fire7/bn_squeeze1x1"
  top: "fire7/expand1x1"
  convolution_param {
    num_output: 192
    kernel_size: 1
    weight_filler {
      type: "xavier"
    }
  }
}

layer {  
  name: "fire7/bn_expand1x1"  
  type: "BatchNorm" 
  bottom: "fire7/expand1x1"  
  top: "fire7/bn_expand1x1"   
}

layer {
  name: "fire7/relu_expand1x1"
  type: "ReLU"
  bottom: "fire7/bn_expand1x1"
  top: "fire7/bn_expand1x1"
}
layer {
  name: "fire7/expand3x3"
  type: "Convolution"
  bottom: "fire7/bn_expand1x1"
  top: "fire7/expand3x3"
  convolution_param {
    num_output: 192
    pad: 1
    kernel_size: 3
    weight_filler {
      type: "xavier"
    }
  }
}

layer {  
  name: "fire7/bn_expand3x3"  
  type: "BatchNorm" 
  bottom: "fire7/expand3x3"  
  top: "fire7/bn_expand3x3"   
}

layer {
  name: "fire7/relu_expand3x3"
  type: "ReLU"
  bottom: "fire7/bn_expand3x3"
  top: "fire7/bn_expand3x3"
}
layer {
  name: "fire7/concat"
  type: "Concat"
  bottom: "fire7/bn_expand1x1"
  bottom: "fire7/bn_expand3x3"
  top: "fire7/concat"
}
#fire7 ends: 384 channels
layer {
  name: "bypass_67"
  type: "Eltwise"
  bottom: "fire6/concat"
  bottom: "fire7/concat"
  top: "fire7_EltAdd"
}



layer {
  name: "fire8/squeeze1x1"
  type: "Convolution"
  bottom: "fire7_EltAdd"
  top: "fire8/squeeze1x1"
  convolution_param {
    num_output: 64
    kernel_size: 1
    weight_filler {
      type: "xavier"
    }
  }
}

layer {  
  name: "fire8/bn_squeeze1x1"  
  type: "BatchNorm" 
  bottom: "fire8/squeeze1x1"  
  top: "fire8/bn_squeeze1x1"   
}

layer {
  name: "fire8/relu_squeeze1x1"
  type: "ReLU"
  bottom: "fire8/bn_squeeze1x1"
  top: "fire8/bn_squeeze1x1"
}
layer {
  name: "fire8/expand1x1"
  type: "Convolution"
  bottom: "fire8/bn_squeeze1x1"
  top: "fire8/expand1x1"
  convolution_param {
    num_output: 256
    kernel_size: 1
    weight_filler {
      type: "xavier"
    }
  }
}

layer {  
  name: "fire8/bn_expand1x1"  
  type: "BatchNorm" 
  bottom: "fire8/expand1x1"  
  top: "fire8/bn_expand1x1"   
}

layer {
  name: "fire8/relu_expand1x1"
  type: "ReLU"
  bottom: "fire8/bn_expand1x1"
  top: "fire8/bn_expand1x1"
}
layer {
  name: "fire8/expand3x3"
  type: "Convolution"
  bottom: "fire8/bn_expand1x1"
  top: "fire8/expand3x3"
  convolution_param {
    num_output: 256
    pad: 1
    kernel_size: 3
    weight_filler {
      type: "xavier"
    }
  }
}

layer {  
  name: "fire8/bn_expand3x3"  
  type: "BatchNorm" 
  bottom: "fire8/expand3x3"  
  top: "fire8/bn_expand3x3"   
}

layer {
  name: "fire8/relu_expand3x3"
  type: "ReLU"
  bottom: "fire8/bn_expand3x3"
  top: "fire8/bn_expand3x3"
}
layer {
  name: "fire8/concat"
  type: "Concat"
  bottom: "fire8/bn_expand1x1"
  bottom: "fire8/bn_expand3x3"
  top: "fire8/concat"
}
#fire8 ends: 512 channels

layer {
  name: "pool8"
  type: "Pooling"
  bottom: "fire8/concat"
  top: "pool8"
  pooling_param {
    pool: MAX
    kernel_size: 2
    stride: 2
  }
}
#fire8 ends: 512 channels
layer {
  name: "fire9/squeeze1x1"
  type: "Convolution"
  bottom: "pool8"
  top: "fire9/squeeze1x1"
  convolution_param {
    num_output: 64
    kernel_size: 1
    weight_filler {
      type: "xavier"
    }
  }
}

layer {  
  name: "fire9/bn_squeeze1x1"  
  type: "BatchNorm" 
  bottom: "fire9/squeeze1x1"  
  top: "fire9/bn_squeeze1x1"   
}

layer {
  name: "fire9/relu_squeeze1x1"
  type: "ReLU"
  bottom: "fire9/bn_squeeze1x1"
  top: "fire9/bn_squeeze1x1"
}
layer {
  name: "fire9/expand1x1"
  type: "Convolution"
  bottom: "fire9/bn_squeeze1x1"
  top: "fire9/expand1x1"
  convolution_param {
    num_output: 256
    kernel_size: 1
    weight_filler {
      type: "xavier"
    }
  }
}

layer {  
  name: "fire9/bn_expand1x1"  
  type: "BatchNorm" 
  bottom: "fire9/expand1x1"  
  top: "fire9/bn_expand1x1"   
}

layer {
  name: "fire9/relu_expand1x1"
  type: "ReLU"
  bottom: "fire9/bn_expand1x1"
  top: "fire9/bn_expand1x1"
}
layer {
  name: "fire9/expand3x3"
  type: "Convolution"
  bottom: "fire9/bn_expand1x1"
  top: "fire9/expand3x3"
  convolution_param {
    num_output: 256
    pad: 1
    kernel_size: 3
    weight_filler {
      type: "xavier"
    }
  }
}

layer {  
  name: "fire9/bn_expand3x3"  
  type: "BatchNorm" 
  bottom: "fire9/expand3x3"  
  top: "fire9/bn_expand3x3"   
}

layer {
  name: "fire9/relu_expand3x3"
  type: "ReLU"
  bottom: "fire9/bn_expand3x3"
  top: "fire9/bn_expand3x3"
}
layer {
  name: "fire9/concat"
  type: "Concat"
  bottom: "fire9/bn_expand1x1"
  bottom: "fire9/bn_expand3x3"
  top: "fire9/concat"
}
#fire9 ends: 512 channels


layer {
  name: "conv10_new"
  type: "Convolution"
  bottom: "fire9/concat"
  top: "conv10"
  convolution_param {
    num_output: 3
    kernel_size: 1
    weight_filler {
      type: "gaussian"
      mean: 0.0
      std: 0.01
    }
  }
}

layer {
  name: "pool10"
  type: "Pooling"
  bottom: "conv10"
  top: "pool10"
  pooling_param {
    pool: AVE
    global_pooling: true
  }
}

# loss, top1, top5
layer {
  name: "loss"
  type: "SoftmaxWithLoss"
  bottom: "pool10"
  bottom: "label"
  top: "loss"
  include {
#    phase: TRAIN
  }
}
layer {
  name: "accuracy"
  type: "Accuracy"
  bottom: "pool10"
  bottom: "label"
  top: "accuracy"
  #include {
  #  phase: TEST
  #}
}

在最后一层卷积层conv10中的num_output修改类别数量。

模型超参配置文件

solver.prototxt

test_iter: 2000 #not subject to iter_size
test_interval: 1000000
# base_lr: 0.0001
base_lr: 0.005       # 学习率
display: 40
# max_iter: 600000
max_iter: 200000    # 迭代数
iter_size: 2 #global batch size = batch_size * iter_size
lr_policy: "poly"
power: 1.0 #linearly decrease LR
momentum: 0.9
weight_decay: 0.0002
snapshot: 10000     # 每多少次迭代保存一个模型
snapshot_prefix: "/data/zxc/classfication/model/model_cotta/cotta_"   # 模型保存路径
solver_mode: GPU
random_seed: 42
net: "./trainNets_drive/trainval.prototxt"   # 网络结构配置文件的路径 
test_initialization: false
average_loss: 40
  • max_iter:caffe用的是迭代数而不是pytorch的轮数。pytorch中训练完全部的训练集为一轮,而caffe中训练完一个batch_size的数据为一个迭代。如果想要等价与轮数的话,一轮就等于:len(train_data) / batch_size。如果有余数就要看pytorch里的dataloader里面设置舍去还是为一个batch,如果舍去就是向下取整,如果不舍去就是向上取整;
  • snapshot_prefix:最后一部分为每个保存模型的前缀,如图:
    在这里插入图片描述

运行命令

将运行命令写入bash文件中:
train.sh

/home/seg/anaconda3/envs/zxc/bin/caffe train -gpu 1 -solver ./solvers/solver_3.prototxt -weights=/data/classfication/model/model_cotta/cotta__iter_200000.caffemodel 2>&1 | tee log_3_4_class.txt 
  • -gpu:选择哪块卡,如果就一块就是0;
  • -solver:后面跟网络超参配置文件路径;
  • -weights:后面跟预训练模型,可以用官方给的squeezenet的caffe版本的预训练模型,我这里是训练中断从断点继续训练

编写完成后source activate 环境名称进入source环境,然后source train.sh运行bash文件就能开始训练。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java 设计模式——解释器模式

目录 1.概述2.结构3.案例实现3.1.抽象表达式类3.2.终结表达式3.3.非终结表达式3.4.环境类3.5.测试 4.优缺点5.使用场景 1.概述 &#xff08;1&#xff09;如下图&#xff0c;设计一个软件用来进行加减计算。我们第一想法可能就是使用工具类&#xff0c;提供对应的加法和减法的…

2023最新版JavaSE教程——第5天:数组

目录 一、数组的概述1.1 为什么需要数组1.2 数组的概念1.3 数组的分类 二、一维数组的使用2.1 一维数组的声明2.2 一维数组的初始化2.2.1 静态初始化2.2.2 动态初始化 2.3 一维数组的使用2.3.1 数组的长度2.3.2 数组元素的引用 2.4 一维数组的遍历2.5 数组元素的默认值 三、一维…

03【远程协作开发、TortoiseGit、IDEA绑定Git插件的使用】

上一篇&#xff1a;02【Git分支的使用、Git回退、还原】 下一篇&#xff1a;【已完结】 目录&#xff1a;【Git系列教程-目录大纲】 文章目录 一、远程协作开发1.1 远程仓库简介1.1.1 Github1.1.2 Gitee1.1.3 其他托管平台 1.2 发布远程仓库1.2.1 创建项目1&#xff09; 新…

解决:AttributeError: ‘WebDriver‘ object has no attribute ‘find_element_by_xpath‘

解决&#xff1a;AttributeError: ‘WebDriver’ object has no attribute ‘find_element_by_xpath’ 背景 在使用之前的代码通过selenium定位元素时&#xff0c;报错&#xff1a;selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to l…

Altium Designer学习笔记1

一、新建项目和文件&#xff1a; 1、新建Project项目&#xff1b; 2、新建原理图文件&#xff1b; 3、新建PCB项目&#xff1b; 在工程文件上点击右键&#xff0c;保存为&#xff0c;可以依次保存三个文件。选择需要保存的路径&#xff0c;新建文件夹。 依次是原理图文件、…

如何用Java高效地存入一万条数据?这可能是你面试成功的关键!

大家好&#xff0c;我是你们的小米&#xff0c;一个热爱技术、喜欢分享的29岁程序猿。今天我要和大家聊一聊一个常见的面试题&#xff1a;在Java中&#xff0c;当我们需要将一万条数据存储到数据库时&#xff0c;如何能够提高存储效率呢&#xff1f; 在面试过程中&#xff0c;…

事务(本地事务与分布式事务)

事务 1 本地事务1.1 事务的特性1.2 事务的隔离级别1.3 事务的传播属性 2 分布式事务2.1 分布式事务基础2.1.1 CAP定理2.1.2 BASE定理 2.2 分布式事务的解决方案2.2.1 两阶段提交&#xff08;2PC&#xff09;2.2.2 TCC补偿式事务2.2.3 消息事务最终一致性 1 本地事务 1.1 事务的…

Mysql视图应用

现在&#xff0c;我们将创建一个视图&#xff0c;将员工的姓名、部门和工资信息组合在一起。 CREATE VIEW EmployeeSalaryView AS SELECT e.FirstName, e.LastName, e.Department, s.MonthlySalary FROM Employees e JOIN Salary s ON e.EmployeeID s.EmployeeID;通过这个视图…

SQLChat 的 RBAC 之旅

去年 ChatGPT 在科技圈大火&#xff0c;到今年彻底破圈。各个领域都有相应的一些产品&#xff0c;数据库领域集中在 AI SQL&#xff0c;自然语言转 SQL&#xff0c;或者利用自然语言来管理数据库等。今天我们来体验一下该领域的 SQLChat 这款 AI 数据库客户端。 今天我们预设一…

招聘信息采集

首先&#xff0c;我们需要使用PHP的curl库来发送HTTP请求。以下是一个基本的示例&#xff1a; <?php // 初始化curl $ch curl_init();// 设置代理 curl_setopt($ch, CURLOPT_PROXY, "jshk.com.cn");// 设置URL curl_setopt($ch, CURLOPT_URL, "http://www…

不同语言采集【淘宝1688拼多多API】平台数据的方式

首先我们以taobao商品页面采集商品详情数据为例&#xff1a; 请求方式&#xff1a;HTTPS POST GET 请求地址&#xff1a;API接口 请求参数 请求参数&#xff1a;num_iid669646899650&is_promotion1 参数说明&#xff1a;num_iid:淘宝商品ID is_promotion:是否获取取…

web前端JS基础------制作一个获取验证码

1&#xff0c;需要一个定时器&#xff0c;和一个button&#xff0c;通过点击事件启动获取验证码 2&#xff0c;参考代码如下 <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title></head><body><…

RapidSSL证书

RapidSSL是一家经验丰富的证书颁发机构&#xff0c;主要专注于提供标准和通配符SSL证书的域验证SSL证书。在2017年被DigicertCA收购后&#xff0c;RapidSSL改进了技术并开始使用现代基础设施。专注于为小型企业和网站提供基本安全解决方案的SSL加密。RapidSSL它具有强大的浏览器…

Python中的Socket编程

目录 一、概述 二、Socket的基本概念 三、Python中的Socket编程 四、Socket的高级功能 1、多路复用&#xff08;multiplexing&#xff09;&#xff1a; 2、非阻塞式IO&#xff1a; 3、SSL加密&#xff1a; 4、服务端编程&#xff1a; 五、Socket编程的常见问题及解决方…

基于Quartz实现动态定时任务

生命无罪&#xff0c;健康万岁&#xff0c;我是laity。 我曾七次鄙视自己的灵魂&#xff1a; 第一次&#xff0c;当它本可进取时&#xff0c;却故作谦卑&#xff1b; 第二次&#xff0c;当它在空虚时&#xff0c;用爱欲来填充&#xff1b; 第三次&#xff0c;在困难和容易之…

深入探析隔离CAN收发器NSI1050-DDBR各项参数

NSI1050-DDBR是一个隔离的CAN收发器&#xff0c;可以完全与ISO11898-2标准兼容。 NSI1050-DDBR集成了两个通道的数字隔离器和一个高电平可靠性CAN收发器。 数字隔离器是基于Novosense电容隔离技术的氧化硅隔离。 高度集成的解决方案可以帮助简化系统设计并提高可靠性。 NSI1050…

Yolov8模型训练报错:torch.cuda.OutOfMemoryError

最近在使用自己的数据训练Yolov8模型的时候遇到了很多错误&#xff0c;下面将逐一解答。 问题报错 在训练过程中红字报错&#xff1a;torch.cuda.OutOfMemoryError: CUDA out of memory. 后面还会跟着一大段报错&#xff1a; Tried to allocate XXX MiB (GPU 0; XXX GiB to…

Vue23-props配置功能

Vue2&3-props配置功能 Vue2-props配置 功能&#xff1a;接收从其他组件传过来的数据&#xff0c;将数据从静态转为动态注意&#xff1a; 同一层组件不能使用props&#xff0c;必须是父组件传子组件的形式。父组件传数据&#xff0c;子组件接收数据。不能什么数据都接收&a…

EMNLP2023 | LLM作用下的成分句法分析基础研究

深度学习自然语言处理 原创作者&#xff1a;cola 自训练已被证明是一种有效的针对跨域任务的方法。传统的自训练方法依赖于有限且低质量的源语料库。为克服这一限制&#xff0c;本文提出用大型语言模型(LLM)增强自训练&#xff0c;以迭代地生成特定领域的语料库。并针对句法成分…

JavaEE初阶学习:Linux 基本使用和 web 程序部署

1.Linux的基本认识 Linux 是一个操作系统.(搞管理的系统) 和Windows都是同类产品~~ Linux 实际的场景: 1.服务器 2.嵌入式设备 3.移动端(手机)Android 其实就是Linux 1991年,还在读大学的 芬兰人 Linus Benedict Torvalds,搞了一个Linux 这样的系统0.01版,正式发布了~ 后…