深度学习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 tf

gpus = 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 np

from 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.AUTOTUNE

train_ds = train_ds.cache().shuffle(1000).prefetch(buffer_size=AUTOTUNE)
val_ds = val_ds.cache().prefetch(buffer_size=AUTOTUNE)
from keras import layers

from keras.layers import Input,Activation,BatchNormalization,Flatten
from keras.layers import Dense,Conv2D,MaxPooling2D,ZeroPadding2D,AveragePooling2D
from keras.models import Model

def identity_block(input_tensor, kernel_size, filters, stage, block):

    filters1, filters2, filters3 = filters

    name_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 = filters

    res_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 model

model = 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 = 10

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

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

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

相关文章

超详细的Stable Diffusion WebUI 安装!

前言 安装方式: 使用发行包在带有 NVidia-GPU 的 Windows 10/11 上安装 sd.webui.zip从v1.0.0-pre下载并解压其内容。 跑步update.bat。 跑步run.bat。 Windows 上自动安装 安装Python 3.10.6(较新版本的Python不支持torch)&#xff0…

stm32cubemx,adc采样的几种方总结,触发获取adc值的方法dma timer trigger中断

stm32cubemx adc采样的几种方总结,触发获取adc值的方法 timer trigger中断 方法1,软件触发方法2:,Timer触发ADC采集通过DMA搬运 触发获取adc值的方法 Regular Conversion launched by software 软件触发 调用函数即可触发ADC转换 Timer X Cap…

英伟达GB200系列AI芯片供不应求;阿里云通义灵码上线Visual Studio插件市场

🦉 AI新闻 🚀 英伟达GB200系列AI芯片供不应求 摘要:英伟达GB200系列AI芯片供不应求,台积电和日月光等公司获追加订单。GB200芯片性能提升30倍,成本和能耗降至25分之一。预计2025年出货量突破百万颗,后段封…

收藏 | SSL证书无效的原因和解决办法

当浏览器访问一个使用SSL证书保护的网站时,会检查其证书的有效性。如果发现证书存在问题,浏览器会显示“SSL证书无效”的警告信息,提醒用户存在潜在的安全风险。 “SSL证书无效”的警告可能会导致用户离开站点(并且永远不会返回&…

72V转12V非隔离DC/DC电源原理图+PCB源文件

资料下载地址:72V转12V非隔离DCDC电源原理图PCB源文件 电动车所用的非隔离DC/DC电源,采用BUCK电路,运行稳定,为已经在产品中使用的电路 1、原理图 2、PCB

Cryptographic algorithms—(Green-Book)加密算法

Cryptographic algorithms—加密算法 9.2.3 加密算法9.2.3.1 概述9.2.3.2 哈希函数9.2.3.3 对称密钥算法9.2.3.3.1 概述9.2.3.3.2 加密和解密9.2.3.3.3 高级加密标准9.2.3.3.4 加密操作模式9.2.3.3.5 消息认证码9.2.3.3.6 密钥包装9.2.3.3.7 Galois/Counter Mode9.2.3.3.7.1 概…

星星历c++

题目描述 不管是基于太阳的阳历,还是基于月亮的阴历,或者阴阳合历的农历,都太复杂了。 XXX自己发明了一套历法,取名为“星星历”。星星历采用每年 3 星,每星 120 天的方式纪年。 XXX定义现实的 2024 年 1 月 18 日为…

CVPR讲座总结(二)-探索图像生成基础模型的最新进展探索多模态代理的最新进展:从视频理解到可操作代理

引言 在CVPR24上的教程中,微软高级研究员Linjie Li为我们带来了多模态代理的深入探索。这些代理通过整合多模态专家和大语言模型(LLM)来增强感知、理解和生成能力。本文总结了Linjie Li的讲座内容,重点介绍了多模态记忆、可操作代…

碳课堂|ISO 14064标准新版变化

ISO 14064标准是针对组织碳排放方面的管理标准,包括温室气体排放和清除的量化、报告与验证的国际标准。其最新版本于 2018年发布,标志着对温室气体管理的全球认知和实践的进一步演进。ISO 14064 作为 ISO 14060 标准系列的重要组成部分,将继续…

C语言 指针——缓冲区溢出与缓冲区溢出攻击

目录 缓冲区溢出攻击 缓冲区溢出攻击实例 字符串的安全输入方法​编辑 防止缓冲区溢出的两个要点 缓冲区溢出攻击 网络黑客常针对系统和程序自身存在的漏洞,编写相应的攻击程序  对缓冲区溢出漏洞的攻击 —— 最常见  几乎占到了网络攻击次数的一半以上…

图像增强及运算篇之图像掩膜直方图和HS直方图

一.图像掩膜直方图 如果要统计图像的某一部分直方图,就需要使用掩码(蒙板)来进行计算。假设将要统计的部分设置为白色,其余部分设置为黑色,然后使用该掩膜进行直方图绘制,其完整代码如下所示。 # -*- codi…

风控图算法之中心性算法(小数据集Python版)

风控图算法之中心性算法(小数据集Python版) 图算法在金融风控领域的应用已经超越了传统的社区发现技术,这些技术曾被主要用于识别和分析欺诈性行为模式,例如黑产团伙。当前,一系列图统计算法,包括介数中心…

Filter and Search

应用筛选器时,“视图”仅显示符合当前筛选条件的记录。您可以根据一列或多列筛选数据。如果针对多个列进行筛选,则网格会在列筛选器之间应用AND逻辑运算符。 GridControl-Grid View 大多数DevExpress数据感知组件(数据网格、树列表、垂直网…

大模型时代:程序员如何升职加薪?

什么是AI大模型? AI大模型,又称大规模预训练模型,是指那些具有超大规模参数量和复杂结构的人工智能模型。这些模型通常包含数百万至数百亿个参数,通过深度学习技术,特别是 Transformer 等先进架构,在大规模…

没有兴趣爱好的我,怎么填报高考志愿选专业?

这是我从知乎看来的一个问题,也在知乎做了回复,顺便摘录下来做个记录。 原文是:以为考完了就走向人生巅峰了,谁知道会这么down。我爸这两天一直追着问我有什么理想,搞得我很难受。过去的十几年里,我对人生都…

基于Volov7的安全帽检测系统

1 项目介绍 1.1 摘要 随着工业化和城市化的迅猛推进,工作场所的安全管理愈发受到重视。安全帽作为保护工人头部安全的关键装备,其实时监测和检测的重要性不言而喻。本文提出并深入研究了基于YOLOv7算法的安全帽佩戴检测技术,该技术旨在实现…

首户完工!江门市特殊困难老年人家庭适老化改造资助项目初见成效

日前,江门市特殊困难老年人家庭适老化改造项目取得新进展。位于蓬江区杜阮镇的黄伯家,成为“慈善筑迹溢彩同行”江门市特殊困难老年人家庭适老化改造项目资助的首户完工受益户。 黄伯的家由两座旧平房构成,大门门槛处原步差较大,…

高效实现虚拟机(VMware)安装教程(附安装包)

目录 一.下载VMware Wworkstation Pro 二 安装: 注:若是安装完VMware,还想在上面安装Centos、Ubuntu,系统请转到基于VMware的linux操作系统安装(附安装包)-CSDN博客 一.下载VMware Wworkstation Pro 渠道…

什么是div移动指令?如何用vue自定义指令实现?

目录 一、Vue.js框架介绍二、vue自定义指令directive三、什么是div移动指令四、使用vue自定义指令directive写一个div移动指令 一、Vue.js框架介绍 Vue.js是一个用于构建用户界面的渐进式JavaScript框架。它设计得非常灵活,可以轻松地被集成到现有的项目中&#xf…

有什么简单易上手的CRM系统推荐?五款CRM软件评测

在数字化时代,企业急需一个能全面展示客户、销售和分析数据的CRM系统。当然,简单易用的CRM系统成了企业首选。选择系统时,同时要关注它的实际功能是否满足需求,是否容易上手,能否根据企业需求灵活定制,能否…