深度学习Week18——学习残差网络和ResNet-50算法

文章目录
深度学习Week18——学习残差网络和ResNet-50算法
一、前言
二、我的环境
三、前期工作
1、配置环境
2、导入数据
2.1 加载数据
2.2 配置数据集
2.3 数据可视化
2.4 再次检查数据
四、构建ResNet-50网络模型
五、编译模型
六、训练模型
七、模型评估
八、指定图片预测
九、其他

一、前言

  • 🍨 本文为🔗365天深度学习训练营 中的学习记录博客
  • 🍖 原作者:K同学啊 | 接辅导、项目定制

本周学习主要了解到何恺明大佬提出的深度残差网络
在之前的17周练习中,我们常常碰见:当前广泛使用的优化器,无论是SGD,还是RMSProp,或是Adam都无法在网络深度变大后达到理论上最优的收敛结果。
准确率下降问题不是网络结构本身的问题,而是现有的训练方式不够理想造成的。

二、我的环境

  • 电脑系统:Windows 10
  • 语言环境:Python 3.8.0
  • 编译器:Pycharm2023.2.3
    深度学习环境:TensorFlow
    显卡及显存:RTX 3060 8G

三、前期工作

1、配置环境

import tensorflow as tfgpus = tf.config.list_physical_devices("GPU")if gpus:tf.config.experimental.set_memory_growth(gpus[0], True)  #设置GPU显存用量按需使用tf.config.set_visible_devices([gpus[0]],"GPU")import matplotlib.pyplot as plt
# 支持中文
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号import os,PIL,pathlib
import numpy as npfrom tensorflow import keras
from tensorflow.keras import layers,models

2、 导入数据

导入所有数据,依次分别为训练集图片(train_images)、训练集标签(train_labels)、测试集图片(test_images)、测试集标签(test_labels),数据集来源于K同学啊

2.1 加载数据
data_dir = "/home/mw/input/J1datas9827/bird_photos/bird_photos"data_dir = pathlib.Path(data_dir)image_count = len(list(data_dir.glob('*/*')))print("图片总数是:", image_count)
图片总数是: 565
2.2 配置数据集
batch_size = 8
img_height = 224
img_width = 224
train_ds = tf.keras.preprocessing.image_dataset_from_directory(data_dir,validation_split=0.2,subset="training",seed=123,image_size=(img_height, img_width),batch_size=batch_size)

使用image_dataset_from_directory方法将磁盘中的数据加载到tf.data.Dataset
tf.keras.preprocessing.image_dataset_from_directory()会将文件夹中的数据加载到tf.data.Dataset中,且加载的同时会打乱数据。

  • class_names
  • validation_split: 0和1之间的可选浮点数,可保留一部分数据用于验证。
  • subset: training或validation之一。仅在设置validation_split时使用。
  • seed: 用于shuffle和转换的可选随机种子。
  • batch_size: 数据批次的大小。默认值:32
  • image_size: 从磁盘读取数据后将其重新调整大小。默认:(256,256)。由于管道处理的图像批次必须具有相同的大小,因此该参数必须提供。

输出:

Found 565 files belonging to 4 classes.
Using 452 files for training.

由于原始的数据集里不包含测试集,所以我们需要自己创建一个

# 测试集
val_ds = tf.keras.preprocessing.image_dataset_from_directory(data_dir,validation_split=0.2,subset="validation",seed=123,image_size=(img_height, img_width),batch_size=batch_size)
Found 565 files belonging to 4 classes.
Using 113 files for validation.

我们可以通过class_names输出数据集的标签。标签将按字母顺序对应于目录名称。

# 用class_names输出数据集的标签
class_names = train_ds.class_names
print(class_names)

[‘Bananaquit’, ‘Black Skimmer’, ‘Black Throated Bushtiti’, ‘Cockatoo’]

2.3 数据可视化
plt.figure(figsize=(10, 5))  # 图形的宽为10高为5
plt.suptitle("源项目:K同学啊;学习:hanon")for images, labels in train_ds.take(1):for i in range(8):ax = plt.subplot(2, 4, i + 1)  plt.imshow(images[i].numpy().astype("uint8"))plt.title(class_names[labels[i]])plt.axis("off")

在这里插入图片描述

plt.imshow(images[0].numpy().astype("uint8"))

在这里插入图片描述

2.4 再次检查数据

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

四 、构建ResNet-50网络模型

AUTOTUNE = tf.data.AUTOTUNEtrain_ds = train_ds.cache().shuffle(1000).prefetch(buffer_size=AUTOTUNE)
val_ds = val_ds.cache().prefetch(buffer_size=AUTOTUNE)
from keras import layersfrom keras.layers import Input,Activation,BatchNormalization,Flatten
from keras.layers import Dense,Conv2D,MaxPooling2D,ZeroPadding2D,AveragePooling2D
from keras.models import Modeldef identity_block(input_tensor, kernel_size, filters, stage, block):filters1, filters2, filters3 = filtersname_base = str(stage) + block + '_identity_block_'x = Conv2D(filters1, (1, 1), name=name_base + 'conv1')(input_tensor)x = BatchNormalization(name=name_base + 'bn1')(x)x = Activation('relu', name=name_base + 'relu1')(x)x = Conv2D(filters2, kernel_size,padding='same', name=name_base + 'conv2')(x)x = BatchNormalization(name=name_base + 'bn2')(x)x = Activation('relu', name=name_base + 'relu2')(x)x = Conv2D(filters3, (1, 1), name=name_base + 'conv3')(x)x = BatchNormalization(name=name_base + 'bn3')(x)x = layers.add([x, input_tensor] ,name=name_base + 'add')x = Activation('relu', name=name_base + 'relu4')(x)return x
# 在残差网络中,广泛地使用了BN层;但是没有使用MaxPooling以便减小特征图尺寸,
# 作为替代,在每个模块的第一层,都使用了strides = (2, 2)的方式进行特征图尺寸缩减,
# 与使用MaxPooling相比,毫无疑问是减少了卷积的次数,输入图像分辨率较大时比较适合
# 在残差网络的最后一级,先利用layer.add()实现H(x) = x + F(x)
def conv_block(input_tensor, kernel_size, filters, stage, block, strides=(2, 2)):filters1, filters2, filters3 = filtersres_name_base = str(stage) + block + '_conv_block_res_'name_base = str(stage) + block + '_conv_block_'x = Conv2D(filters1, (1, 1), strides=strides, name=name_base + 'conv1')(input_tensor)x = BatchNormalization(name=name_base + 'bn1')(x)x = Activation('relu', name=name_base + 'relu1')(x)x = Conv2D(filters2, kernel_size, padding='same', name=name_base + 'conv2')(x)x = BatchNormalization(name=name_base + 'bn2')(x)x = Activation('relu', name=name_base + 'relu2')(x)x = Conv2D(filters3, (1, 1), name=name_base + 'conv3')(x)x = BatchNormalization(name=name_base + 'bn3')(x)shortcut = Conv2D(filters3, (1, 1), strides=strides, name=res_name_base + 'conv')(input_tensor)shortcut = BatchNormalization(name=res_name_base + 'bn')(shortcut)x = layers.add([x, shortcut], name=name_base+'add')x = Activation('relu', name=name_base+'relu4')(x)return x
def ResNet50(input_shape=[224,224,3],classes=1000):img_input = Input(shape=input_shape)x = ZeroPadding2D((3, 3))(img_input)x = Conv2D(64, (7, 7), strides=(2, 2), name='conv1')(x)x = BatchNormalization(name='bn_conv1')(x)x = Activation('relu')(x)x = MaxPooling2D((3, 3), strides=(2, 2))(x)x =     conv_block(x, 3, [64, 64, 256], stage=2, block='a', strides=(1, 1))x = identity_block(x, 3, [64, 64, 256], stage=2, block='b')x = identity_block(x, 3, [64, 64, 256], stage=2, block='c')x =     conv_block(x, 3, [128, 128, 512], stage=3, block='a')x = identity_block(x, 3, [128, 128, 512], stage=3, block='b')x = identity_block(x, 3, [128, 128, 512], stage=3, block='c')x = identity_block(x, 3, [128, 128, 512], stage=3, block='d')x =     conv_block(x, 3, [256, 256, 1024], stage=4, block='a')x = identity_block(x, 3, [256, 256, 1024], stage=4, block='b')x = identity_block(x, 3, [256, 256, 1024], stage=4, block='c')x = identity_block(x, 3, [256, 256, 1024], stage=4, block='d')x = identity_block(x, 3, [256, 256, 1024], stage=4, block='e')x = identity_block(x, 3, [256, 256, 1024], stage=4, block='f')x =     conv_block(x, 3, [512, 512, 2048], stage=5, block='a')x = identity_block(x, 3, [512, 512, 2048], stage=5, block='b')x = identity_block(x, 3, [512, 512, 2048], stage=5, block='c')x = AveragePooling2D((7, 7), name='avg_pool')(x)x = Flatten()(x)x = Dense(classes, activation='softmax', name='fc1000')(x)model = Model(img_input, x, name='resnet50')# 加载预训练模型,这里输入你的预训练模型存放的地址model.load_weights("/home/mw/input/J1datas9827/resnet50_weights_tf_dim_ordering_tf_kernels.h5")return modelmodel = ResNet50()
model.summary()
______________________________________________________________________________________________
Layer (type)                    Output Shape         Param #     Connected to                     
===========================================================================================
input_2 (InputLayer)            [(None, 224, 224, 3) 0                                            
______________________________________________________________________________________________
zero_padding2d_1 (ZeroPadding2D (None, 230, 230, 3)  0           input_2[0][0]                    
______________________________________________________________________________________________
conv1 (Conv2D)                  (None, 112, 112, 64) 9472        zero_padding2d_1[0][0]           
______________________________________________________________________________________________
bn_conv1 (BatchNormalization)   (None, 112, 112, 64) 256         conv1[0][0]                      
______________________________________________________________________________________________
activation_1 (Activation)       (None, 112, 112, 64) 0           bn_conv1[0][0]                   
______________________________________________________________________________________________
max_pooling2d_1 (MaxPooling2D)  (None, 55, 55, 64)   0           activation_1[0][0]               
______________________________________________________________________________________________
2a_conv_block_conv1 (Conv2D)    (None, 55, 55, 64)   4160        max_pooling2d_1[0][0]            
______________________________________________________________________________________________
2a_conv_block_bn1 (BatchNormali (None, 55, 55, 64)   256         2a_conv_block_conv1[0][0]        
______________________________________________________________________________________________
省略…………………………
______________________________________________________________________________________________
5a_conv_block_conv3 (Conv2D)    (None, 7, 7, 2048)   1050624     5a_conv_block_relu2[0][0]        
______________________________________________________________________________________________
5a_conv_block_res_conv (Conv2D) (None, 7, 7, 2048)   2099200     4f_identity_block_relu4[0][0]    
______________________________________________________________________________________________
5a_conv_block_bn3 (BatchNormali (None, 7, 7, 2048)   8192        5a_conv_block_conv3[0][0]        
______________________________________________________________________________________________
5a_conv_block_res_bn (BatchNorm (None, 7, 7, 2048)   8192        5a_conv_block_res_conv[0][0]     
______________________________________________________________________________________________
5a_conv_block_add (Add)         (None, 7, 7, 2048)   0           5a_conv_block_bn3[0][0]          5a_conv_block_res_bn[0][0]       
______________________________________________________________________________________________5a_conv_block_relu4 (Activation (None, 7, 7, 2048)   0           5a_conv_block_add[0][0]          
______________________________________________________________________________________________
5b_identity_block_conv1 (Conv2D (None, 7, 7, 512)    1049088     5a_conv_block_relu4[0][0]        
______________________________________________________________________________________________
5b_identity_block_bn1 (BatchNor (None, 7, 7, 512)    2048        5b_identity_block_conv1[0][0]    
______________________________________________________________________________________________
5b_identity_block_relu1 (Activa (None, 7, 7, 512)    0           5b_identity_block_bn1[0][0]      
______________________________________________________________________________________________
5b_identity_block_conv2 (Conv2D (None, 7, 7, 512)    2359808     5b_identity_block_relu1[0][0]    
______________________________________________________________________________________________
5b_identity_block_bn2 (BatchNor (None, 7, 7, 512)    2048        5b_identity_block_conv2[0][0]    
______________________________________________________________________________________________
5b_identity_block_relu2 (Activa (None, 7, 7, 512)    0           5b_identity_block_bn2[0][0]      
______________________________________________________________________________________________
5b_identity_block_conv3 (Conv2D (None, 7, 7, 2048)   1050624     5b_identity_block_relu2[0][0]    
______________________________________________________________________________________________
5b_identity_block_bn3 (BatchNor (None, 7, 7, 2048)   8192        5b_identity_block_conv3[0][0]    
______________________________________________________________________________________________
5b_identity_block_add (Add)     (None, 7, 7, 2048)   0           5b_identity_block_bn3[0][0]      5a_conv_block_relu4[0][0]        
______________________________________________________________________________________________
5b_identity_block_relu4 (Activa (None, 7, 7, 2048)   0           5b_identity_block_add[0][0]      
______________________________________________________________________________________________
5c_identity_block_conv1 (Conv2D (None, 7, 7, 512)    1049088     5b_identity_block_relu4[0][0]    
______________________________________________________________________________________________
5c_identity_block_bn1 (BatchNor (None, 7, 7, 512)    2048        5c_identity_block_conv1[0][0]    
______________________________________________________________________________________________
5c_identity_block_relu1 (Activa (None, 7, 7, 512)    0           5c_identity_block_bn1[0][0]      
______________________________________________________________________________________________
5c_identity_block_conv2 (Conv2D (None, 7, 7, 512)    2359808     5c_identity_block_relu1[0][0]    
______________________________________________________________________________________________
5c_identity_block_bn2 (BatchNor (None, 7, 7, 512)    2048        5c_identity_block_conv2[0][0]    
______________________________________________________________________________________________
5c_identity_block_relu2 (Activa (None, 7, 7, 512)    0           5c_identity_block_bn2[0][0]      
______________________________________________________________________________________________
5c_identity_block_conv3 (Conv2D (None, 7, 7, 2048)   1050624     5c_identity_block_relu2[0][0]    
______________________________________________________________________________________________
5c_identity_block_bn3 (BatchNor (None, 7, 7, 2048)   8192        5c_identity_block_conv3[0][0]    
______________________________________________________________________________________________
5c_identity_block_add (Add)     (None, 7, 7, 2048)   0           5c_identity_block_bn3[0][0]      5b_identity_block_relu4[0][0]    
______________________________________________________________________________________________
5c_identity_block_relu4 (Activa (None, 7, 7, 2048)   0           5c_identity_block_add[0][0]      
______________________________________________________________________________________________
avg_pool (AveragePooling2D)     (None, 1, 1, 2048)   0           5c_identity_block_relu4[0][0]    
______________________________________________________________________________________________
flatten_1 (Flatten)             (None, 2048)         0           avg_pool[0][0]                   
______________________________________________________________________________________________
fc1000 (Dense)                  (None, 1000)         2049000     flatten_1[0][0]                  
=========================================================================================
Total params: 25,636,712
Trainable params: 25,583,592
Non-trainable params: 53,120
______________________________________________________________________________________________

五、编译模型

# 设置学习率,我们使用不同的学习率
opt = tf.keras.optimizers.Adam(learning_rate=1e-5)model.compile(optimizer="adam",loss='sparse_categorical_crossentropy',metrics=['accuracy'])

六、训练模型

epochs = 10history = model.fit(train_ds,validation_data=val_ds,epochs=epochs
)
Epoch 1/10
57/57 [==============================] - 27s 138ms/step - loss: 2.3737 - accuracy: 0.6071 - val_loss: 4607.0063 - val_accuracy: 0.2655
Epoch 2/10
57/57 [==============================] - 6s 100ms/step - loss: 0.5559 - accuracy: 0.7980 - val_loss: 59.8738 - val_accuracy: 0.2301
Epoch 3/10
57/57 [==============================] - 6s 100ms/step - loss: 0.3012 - accuracy: 0.9086 - val_loss: 28.0947 - val_accuracy: 0.2743
Epoch 4/10
57/57 [==============================] - 6s 101ms/step - loss: 0.1443 - accuracy: 0.9562 - val_loss: 0.3001 - val_accuracy: 0.9381
Epoch 5/10
57/57 [==============================] - 6s 101ms/step - loss: 0.0551 - accuracy: 0.9870 - val_loss: 8.5784 - val_accuracy: 0.6195
Epoch 6/10
57/57 [==============================] - 6s 101ms/step - loss: 0.0492 - accuracy: 0.9879 - val_loss: 0.2026 - val_accuracy: 0.9204
Epoch 7/10
57/57 [==============================] - 6s 101ms/step - loss: 0.0308 - accuracy: 0.9900 - val_loss: 1.6341 - val_accuracy: 0.5929
Epoch 8/10
57/57 [==============================] - 6s 102ms/step - loss: 0.0839 - accuracy: 0.9744 - val_loss: 0.2057 - val_accuracy: 0.9646
Epoch 9/10
57/57 [==============================] - 6s 102ms/step - loss: 0.1811 - accuracy: 0.9524 - val_loss: 2.8686 - val_accuracy: 0.5929
Epoch 10/10
57/57 [==============================] - 6s 102ms/step - loss: 0.1442 - accuracy: 0.9542 - val_loss: 0.9458 - val_accuracy: 0.8142

七、模型评估

acc = history.history['accuracy']
val_acc = history.history['val_accuracy']loss = history.history['loss']
val_loss = history.history['val_loss']epochs_range = range(epochs)plt.figure(figsize=(12, 4))
plt.subplot(1, 2, 1)
plt.suptitle("源项目:K同学啊;学习:hanon;学习率:1e-5")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='Training Loss')
plt.plot(epochs_range, val_loss, label='Validation Loss')
plt.legend(loc='upper right')
plt.title('Training and Validation Loss')
plt.show()

在这里插入图片描述
在这里插入图片描述

八、指定图片预测

# 采用加载的模型(new_model)来看预测结果plt.figure(figsize=(10, 5))  # 图形的宽为10高为5
plt.suptitle("源项目:K同学啊;学习:hanon")for images, labels in val_ds.take(1):for i in range(8):ax = plt.subplot(2, 4, i + 1)  # 显示图片plt.imshow(images[i].numpy().astype("uint8"))# 需要给图片增加一个维度img_array = tf.expand_dims(images[i], 0) # 使用模型预测图片中的人物predictions = model.predict(img_array)plt.title(class_names[np.argmax(predictions)])plt.axis("off")

在这里插入图片描述

九、其他

何恺明大佬在论文中提到:随着神经网络深度的增加,训练变得更困难,出现了梯度消失或爆炸的问题,以及准确度饱和后迅速下降的退化问题,这也是深度学习领域中的两朵乌云:

拓展: 深度神经网络的“两朵乌云”

  1. 梯度弥散/爆炸
    简单来讲就是网络太深了,会导致模型训练难以收敛。这个问题可以被标准初始化和中间层正规化的方法有效控制。
    a. 比如我们在一个山谷里面大喊,如果山谷非常深,回声可能会变得非常非常小,几乎听不见。
    在神经网络中,梯度弥散就像这个回声一样。当训练一个很深的网络时,从最后一层传回第一层的梯度(也就是告诉每一层怎么调整的信号)可能会变得非常小,就像声音在传播过程中逐渐减弱,导致前面的层几乎得不到有效的学习信号。
    b. 又比如我们在房间里大喊一声,声音在房间里反复反射,变得越来越大。如果这个声音(梯度)没有得到控制,它可能会变得极其响亮,以至于你无法分辨出任何有用的东西。
    在神经网络中,梯度爆炸就是梯度在传播过程中变得非常大,导致网络的权重更新过于剧烈,学习过程变得不稳定,甚至导致网络完全失效。
  2. 网络退化
    随着网络深度增加,网络的表现先是逐渐增加至饱和,然后迅速下降,这个退化不是由于过拟合引起的
    就如传话游戏。在这个游戏中,一组人站成一排,第一个人得到一个消息,然后他小声告诉下一个人,下一个人再告诉下一个,依此类推。理论上,如果有更多的人参与,你可以传递更长的消息。可事实上,信息的内容总是逐渐增加至饱和,然后迅速下降,当消息传到队尾时,消息可能会变得模糊不清,甚至完全变了样。

为了解决这些问题,大佬使用了一种名为残差块(Residual Block)的方式,一种包含快捷连接(Shortcut Connections)的构建模块,这些连接可以跳过一层或多层,简化了网络的输出与输入之间的关系。通过下图(图片来源K同学啊),我们可以很直白的理解残差网络是如何解决上面两个问题的。

就如我们本周打卡的内容,假设有一个五层的神经网络,输入是一张图片,我们希望网络能够识别出图片中的鸟的品类。在残差网络中,除了正常的层级结构,我们在网络的某两层之间增加了一个“快捷连接”如第二层和第四层。这样,第二层学习到的特征可以直接“传递”到第四层,第四层只需要学习第二层特征和最终输出之间的差异。这样,即使网络很深,每一层的学习任务都变得简单了,整个网络的训练也变得更加容易。
而在传统的神经网络中,信息需要逐层传递,如果某一层学习效果不好,就会影响整个网络的性能。
原图来自K同学啊

原图来自K同学啊
其实和我们人类学习很像,加入我们正在学习某个知识,我们总会经历以下五个阶段:

  1. 基础技能:一开始,你学习了一些基础和简单的知识,这就像是神经网络的前几层,它们学习了一些基本的特征识别能力。

  2. 技能提升:随着时间的推移,你开始学习更复杂的知识和技巧,这就像是网络的中间层,它们在基础特征上进一步学习更复杂的模式。

  3. 瓶颈期:但是,你可能会到达一个点,感觉无论怎么练习,提高都很有限。这就像深层网络训练时遇到的退化问题,网络的深层似乎不再学习新的东西,性能提升停滞。

  4. 残差学习:这时候,如果你采取一种不同的学习方法,比如回顾并改进你的基础,确保对每个知识点掌握的更熟,对比学习现在遇到的难题和自己已掌握的基础的差别(残差)就能在现有的基础上继续提升。这就像是残差网络中的“快捷连接”,它允许网络层直接学习相对于前面层的“残差”或改进,而传统网络可能就重新开始学习新的复杂学习。

  5. 持续进步:通过不断地在基础和复杂技巧之间循环,你能够持续提升你的水平,即使在达到高水平后也能继续进步。这与残差网络的工作方式相似,网络能够通过学习残差来持续优化深层的特征表示,从而提高整体的性能。
    以上为本周打卡内容。

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

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

相关文章

leetCode.92. 反转链表 II

leetCode.92. 反转链表 II 题目思路 代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode …

【Python数据分析与可视化】:使用【Matplotlib】实现销售数据的全面分析 ——【Matplotlib】数模学习

目录 安装Matplotlib 1.打开PyCharm: 2.打开终端: 3.安装Matplotlib: 4.确认安装: 导入Matplotlib 创建简单的折线图 代码解析: 创建子图 代码解析: 创建柱状图 代码解析: 创建散点…

Vite响应Ajax请求

Vite响应Ajax请求 陈拓 2024/06/20-2024/06/24 1. 概述 http-server、live-server 等常用于本地测试和开发的http服务器不能很好的支持 ES 模块,在测试ES 模块时浏览器控制台经常显示错误: Failed to load module script: Expected a JavaScript modu…

esp8266 GPIO

功能综述 ESP8266 的 16 个通⽤ IO 的管脚位置和名称如下表所示。 管脚功能选择 功能选择寄存器 PERIPHS_IO_MUX_MTDI_U(不同的 GPIO,该寄存器不同) PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U,FUNC_GPIO12);PERIPHS_IO_MUX_为前缀。后面的…

基于SpringBoot+Vue的大药房管理系统(带1w+文档)

基于SpringBootVue的大药房管理系统(带1w文档) 本系统主要包括管理员和用户两个用户角色;主要包括:首页,个人中心,用户管理,保健品分类管理,药品分类管理,药品信息管理,疫情常识管理…

Flink入门实战详解

Flink入门实战 Flink项目构建 1)基于MavenIdea创建项目&#xff1a; 使用maven进行项目构建&#xff0c;如图1所示。 图-34 构建maven项目 输入项目中的maven的坐标和存储坐标&#xff0c;如图2所示。 图2 maven坐标和存储位置 2)Maven依赖&#xff1a; <properties>…

开源API网关-ApacheShenYu首次按照启动遇到的问题

一.背景 公司有API网关产品需求&#xff0c;希望有图形化的后台管理功能。看到了ApacheShenYu&#xff0c;作为Apache的顶级项目&#xff0c;直接认可了。首先&#xff0c;感谢各位大神的付出&#xff0c;初步看这个项目是国内大厂中的大神创立的&#xff0c;在此表示膜拜&…

Zookeeper集群安装部署

简介 ZooKeeper是一个分布式的&#xff0c;开放源码的分布式应用程序协调服务&#xff0c;是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件&#xff0c;提供的功能包括&#xff1a;配置维护、域名服务、分布式同步、组服务等。 除了为Hadoop和HBase提供…

区块链开发基础知识及应用

区块链开发基础知识及应用 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;在本文中&#xff0c;我们将深入探讨区块链技术的基础知识及其在应用开发中的实际应用…

阿里云服务器入门使用教程——购买及操作系统选择并进行远程连接

文章目录 一、首先选择一个你自己要买的云服务器类型二、能选的就一个地域和一个操作系统&#xff0c;其他都是固定的三、创建完实例并使用finalshell连接的效果(要在完成后续步骤后才能连接)四、购买之后进入阿里云控制台&#xff0c;开通资源中心五、然后就可以看到已经帮你创…

耐磨材料元宇宙:探索未来科技的无限可能

随着科技的不断发展&#xff0c;我们正逐渐进入一个全新的时代——元宇宙。在这个虚拟世界中&#xff0c;人们可以自由地创造、探索和交流。而在元宇宙中&#xff0c;耐磨材料作为一种重要的基础资源&#xff0c;将为我们的虚拟世界带来更多的可能性。 一、耐磨材料在元宇宙中…

星戈瑞Sulfo Cy3 NHS Ester的水溶性与生物相容性

在生物医学研究领域&#xff0c;荧光标记技术已经成为一种科研工具。其中&#xff0c;Sulfo Cy3 NHS Ester作为一种荧光染料&#xff0c;因其水溶性和生物相容性而受应用。 Sulfo Cy3 NHS Ester的水溶性 Sulfo Cy3 NHS Ester在水中的溶解性较好&#xff0c;能够快速溶解并形成…

JS面试题5——JS继承有哪些方式

1. ES6 /* 此时的Child上只有name属性&#xff0c;没有age属性 */ <script> // 父 class Parent{constructor(){this.age 18;} } // 子 class Child{constructor(){this.name 张三;} } let o1 new Child(); console.log(o1, o1.name, o1.age); // 打印出&#xff1a;C…

Vue基础了解

目录 1、什么是Vue.js 2、Vue的优点 3、Vue的安装 4、Vue程序 5、Vue指令 代码演示&#xff1a; 6、Vue实例的生命周期 1、什么是Vue.js Vue (读音 /vjuː /&#xff0c;类似于 view) 是一套用于构建用户界面的渐进式框架。Vue 的核心库只关注视图层&#xff0c;不仅易…

Python28 十大机器学习算法之线性回归和逻辑回归

1.三类广义上的机器学习算法 监督学习。工作原理&#xff1a;该算法由一个目标/结果变量&#xff08;或因变量&#xff09;组成&#xff0c;该变量将从一组给定的预测变量&#xff08;自变量&#xff09;进行预测。使用这组变量&#xff0c;我们生成了一个将输入数据映射到所…

常见的工业信号指示灯及按钮开关代表什么?如何辨认?

信号指示灯&#xff0c;是用灯光监视电路和电气设备工作或位置状态的器件。也是自动化设备中最直观&#xff0c;唯一的监视元器件。主要的作用是通常用于反映电路的工作状态&#xff08;有电或无电&#xff09;、电气设备的工作状态&#xff08;运行、停运或试验&#xff09;和…

小程序web-view无法打开该页面的解决方法

问题&#xff1a;开发者工具可以正常打开&#xff0c;正式上线版小程序使用 web-view 组件测试时提示&#xff1a;“无法打开该页面&#xff0c;不支持打开 https://xxxxxx&#xff0c;请在“小程序右上角更多->反馈与投诉”中和开发者反馈。” 解决方法&#xff1a;需要配…

市场拓展招聘:完整指南

扩大招聘业务会给你带来很多挑战&#xff0c;更不用说你已经在处理的问题了。助教专业人士每周花近13个小时为一个角色寻找候选人。此外&#xff0c;客户的需求也在不断变化&#xff0c;招聘机构之间的竞争也在加剧。毫无疑问&#xff0c;对增长有战略的方法会有很大的帮助。一…

大数据面试题之Kafka(4)

目录 Kafka如何保证数据的ExactlyOnce? Kafka消费者怎么保证ExactlyOnce Kafka监控实现? Kafka中的数据能彻底删除吗? Kafka复制机制? Kafka分区多副本机制? Kafka分区分配算法 Kafka蓄水池机制 Kafka如何实现幂等性? Kafka的offset存在哪? Kafka中如何…

jeecg导入excel 含图片(嵌入式,浮动式)

jeecgboot的excel导入 含图片&#xff08;嵌入式&#xff0c;浮动式&#xff09; 一、啰嗦二、准备三、 代码1、代码&#xff08;修改覆写的ExcelImportServer&#xff09;2、代码&#xff08;修改覆写的PoiPublicUtil&#xff09;3、代码&#xff08;新增类SAXParserHandler&a…