当前位置: 首页 > news >正文

第J2周:ResNet50V2算法实现01(Tensorflow硬编码版)

  • 🍨 本文为🔗365天深度学习训练营 中的学习记录博客
  • 🍖 原作者:K同学啊

目标

使用tensorflow实现ResNetV50V2的网络结构。本次根据第一层的细节手动硬编码,没有任何的优化,只为了更好的理解细节。
目录结构:
image.png

网络结构图见最后

具体实现

(一)环境

语言环境:Python 3.10
编 译 器: PyCharm
框 架: Tensorflow

(二)具体步骤

1. ResNet50V2的实现

from keras import layers  
from keras.layers import Input, Activation, BatchNormalization, Flatten, GlobalAveragePooling2D  
from keras.layers import Dense, Conv2D,MaxPooling2D,ZeroPadding2D  
from keras.models import Model  # 非优化版,直接按照ResNet50V2的网络结构,先写出来训练。  def ResNet50V2(input_shape=[224, 224, 3], classes=1000):  # 输入  img_input = Input(shape=input_shape)  # STAGE 0 第一个卷积层和池化层  x = ZeroPadding2D((1,1), name='conv1_pad')(img_input)  x = Conv2D(64, (7,7), strides = (2,2), name = 'conv1')(x)  x = BatchNormalization(name = 'bn_conv1')(x)  x = Activation('relu')(x)  x = ZeroPadding2D((1,1))(x)  x = MaxPooling2D((3,3), strides = (2,2))(x)  # STAGE 1  # 预激活  x1 = BatchNormalization(name = 'bn_stage1_conv2')(x)  x1 = Activation('relu')(x1)  x1 = Conv2D(64, (1,1), strides = (1,1), name = 'conv2')(x1)  x1 = BatchNormalization(name = 'bn_conv3')(x1)  x1 = Activation('relu')(x1)  x1 = ZeroPadding2D((1,1))(x1)  x1 = Conv2D(64, (3,3), strides = (1,1), name = 'conv3')(x1)  x1 = BatchNormalization(name = 'bn_conv4')(x1)  x1 = Activation('relu')(x1)  x1 = Conv2D(256, (1,1), strides = (1,1), name = 'conv4')(x1)  # 对输入张量进行1x1卷积,以匹配输出张量的维度  shortcut = Conv2D(256, (1, 1), strides=(1, 1), name='conv5')(x)  # 将卷积结果与输入张量相加,实现残差连接  x1 = layers.add([x1, shortcut], name='add1')  # STAGE 2  x2 = BatchNormalization(name='bn1')(x1)  x2 = Activation('relu', name='relu4')(x2)  x2 = Conv2D(64, (1, 1), strides=(1, 1), name='conv6')(x2)  x2 = BatchNormalization(name='bn2')(x2)  x2 = Activation('relu', name='relu5')(x2)  x2 = ZeroPadding2D((1, 1), name='pad1')(x2)  x2 = Conv2D(64, (3, 3), strides=(1, 1), name='conv7')(x2)  x2 = BatchNormalization(name='bn3')(x2)  x2 = Activation('relu', name='relu6')(x2)  x2 = Conv2D(256, (1, 1), strides=(1, 1), name='conv8')(x2)  shortcut = Conv2D(256, (1, 1), strides=(1, 1), name='conv9')(x1)  x2 = layers.add([x2, shortcut], name='add2')  # STAGE 3  x3 = BatchNormalization(name='bn4')(x2)  x3 = Activation('relu', name='relu7')(x3)  x3 = Conv2D(64, (1, 1), strides=(1, 1), name='conv10')(x3)  x3 = BatchNormalization(name='bn5')(x3)  x3 = Activation('relu', name='relu8')(x3)  x3 = ZeroPadding2D((1, 1), name='pad2')(x3)  x3 = Conv2D(64, (3, 3), strides=(2, 2), name='conv11')(x3)  x3 = BatchNormalization(name='bn6')(x3)  x3 = Activation('relu', name='relu9')(x3)  x3 = Conv2D(256, (1, 1), strides=(1, 1), name='conv12')(x3)  shortcut = Conv2D(256, (1, 1), strides=(2, 2), name='conv13')(x2)  x3 = layers.add([x3, shortcut], name='add3')  # STAGE 4  x4 = BatchNormalization(name='bn7')(x3)  x4 = Activation('relu', name='relu10')(x4)  x4 = Conv2D(128, (1, 1), strides=(1, 1), name='conv14')(x4)  x4 = BatchNormalization(name='bn8')(x4)  x4 = Activation('relu', name='relu11')(x4)  x4 = ZeroPadding2D((1, 1), name='pad3')(x4)  x4 = Conv2D(128, (3, 3), strides=(1, 1), name='conv15')(x4)  x4 = BatchNormalization(name='bn9')(x4)  x4 = Activation('relu', name='relu12')(x4)  x4 = Conv2D(512, (1, 1), strides=(1, 1), name='conv16')(x4)  shortcut = Conv2D(512, (1, 1), strides=(1, 1), name='conv17')(x3)  x4 = layers.add([x4, shortcut], name='add4')  # STAGE 5  x5 = BatchNormalization(name='bn10')(x4)  x5 = Activation('relu', name='relu13')(x5)  x5 = Conv2D(128, (1, 1), strides=(1, 1), name='conv18')(x5)  x5 = BatchNormalization(name='bn11')(x5)  x5 = Activation('relu', name='relu14')(x5)  x5 = ZeroPadding2D((1, 1), name='pad4')(x5)  x5 = Conv2D(128, (3, 3), strides=(1, 1), name='conv19')(x5)  x5 = BatchNormalization(name='bn12')(x5)  x5 = Activation('relu', name='relu15')(x5)  x5 = Conv2D(512, (1, 1), strides=(1, 1), name='conv20')(x5)  shortcut = Conv2D(512, (1, 1), strides=(1, 1), name='conv21')(x4)  x5 = layers.add([x5, shortcut], name='add5')  # STAGE 6  x6 = BatchNormalization(name='bn13')(x5)  x6 = Activation('relu', name='relu16')(x6)  x6 = Conv2D(128, (1, 1), strides=(1, 1), name='conv22')(x6)  x6 = BatchNormalization(name='bn14')(x6)  x6 = Activation('relu', name='relu17')(x6)  x6 = ZeroPadding2D((1, 1), name='pad5')(x6)  x6 = Conv2D(128, (3, 3), strides=(1, 1), name='conv23')(x6)  x6 = BatchNormalization(name='bn15')(x6)  x6 = Activation('relu', name='relu18')(x6)  x6 = Conv2D(512, (1, 1), strides=(1, 1), name='conv24')(x6)  shortcut = Conv2D(512, (1, 1), strides=(1, 1), name='conv25')(x5)  x6 = layers.add([x6, shortcut], name='add6')  # STAGE 7  x7 = BatchNormalization(name='bn16')(x6)  x7 = Activation('relu', name='relu19')(x7)  x7 = Conv2D(128, (1, 1), strides=(1, 1), name='conv26')(x7)  x7 = BatchNormalization(name='bn17')(x7)  x7 = Activation('relu', name='relu20')(x7)  x7 = ZeroPadding2D((1, 1), name='pad6')(x7)  x7 = Conv2D(128, (3, 3), strides=(2, 2), name='conv27')(x7)  x7 = BatchNormalization(name='bn18')(x7)  x7 = Activation('relu', name='relu21')(x7)  x7 = Conv2D(512, (1, 1), strides=(1, 1), name='conv28')(x7)  # shortcut = MaxPooling2D(pool_size=(1, 1), strides=(2, 2), padding='valid', name='conv29')(x6)  shortcut = Conv2D(512, (1, 1), strides=(2, 2), name='conv30')(x6)  x7 = layers.add([x7, shortcut], name='add7')  # STAGE 8  x8 = BatchNormalization(name='bn19')(x7)  x8 = Activation('relu', name='relu22')(x8)  x8 = Conv2D(256, (1, 1), strides=(1, 1), name='conv31')(x8)  x8 = BatchNormalization(name='bn20')(x8)  x8 = Activation('relu', name='relu23')(x8)  x8 = ZeroPadding2D((1, 1), name='pad7')(x8)  x8 = Conv2D(256, (3, 3), strides=(1, 1), name='conv32')(x8)  x8 = BatchNormalization(name='bn21')(x8)  x8 = Activation('relu', name='relu24')(x8)  x8 = Conv2D(1024, (1, 1), strides=(1, 1), name='conv33')(x8)  shortcut = Conv2D(1024, (1, 1), strides=(1, 1), name='conv34')(x7)  x8 = layers.add([x8, shortcut], name='add8')  # STAGE 9  x9 = BatchNormalization(name='bn22')(x8)  x9 = Activation('relu', name='relu25')(x9)  x9 = Conv2D(256, (1, 1), strides=(1, 1), name='conv35')(x9)  x9 = BatchNormalization(name='bn23')(x9)  x9 = Activation('relu', name='relu26')(x9)  x9 = ZeroPadding2D((1, 1), name='pad8')(x9)  x9 = Conv2D(256, (3, 3), strides=(1, 1), name='conv36')(x9)  x9 = BatchNormalization(name='bn24')(x9)  x9 = Activation('relu', name='relu27')(x9)  x9 = Conv2D(1024, (1, 1), strides=(1, 1), name='conv37')(x9)  shortcut = Conv2D(1024, (1, 1), strides=(1, 1), name='conv38')(x8)  x9 = layers.add([x9, shortcut], name='add9')  # STAGE 10  x10 = BatchNormalization(name='bn25')(x9)  x10 = Activation('relu', name='relu28')(x10)  x10 = Conv2D(256, (1, 1), strides=(1, 1), name='conv39')(x10)  x10 = BatchNormalization(name='bn26')(x10)  x10 = Activation('relu', name='relu29')(x10)  x10 = ZeroPadding2D((1, 1), name='pad9')(x10)  x10 = Conv2D(256, (3, 3), strides=(1, 1), name='conv40')(x10)  x10 = BatchNormalization(name='bn27')(x10)  x10 = Activation('relu', name='relu30')(x10)  x10 = Conv2D(1024, (1, 1), strides=(1, 1), name='conv41')(x10)  shortcut = Conv2D(1024, (1, 1), strides=(1, 1), name='conv42')(x9)  x10 = layers.add([x10, shortcut], name='add10')  # STAGE 11  x11 = BatchNormalization(name='bn28')(x10)  x11 = Activation('relu', name='relu31')(x11)  x11 = Conv2D(256, (1, 1), strides=(1, 1), name='conv43')(x11)  x11 = BatchNormalization(name='bn29')(x11)  x11 = Activation('relu', name='relu32')(x11)  x11 = ZeroPadding2D((1, 1), name='pad10')(x11)  x11 = Conv2D(256, (3, 3), strides=(1, 1), name='conv44')(x11)  x11 = BatchNormalization(name='bn30')(x11)  x11 = Activation('relu', name='relu33')(x11)  x11 = Conv2D(1024, (1, 1), strides=(1, 1), name='conv45')(x11)  shortcut = Conv2D(1024, (1, 1), strides=(1, 1), name='conv46')(x10)  x11 = layers.add([x11, shortcut], name='add11')  # STAGE 12  x12 = BatchNormalization(name='bn31')(x11)  x12 = Activation('relu', name='relu34')(x12)  x12 = Conv2D(256, (1, 1), strides=(1, 1), name='conv47')(x12)  x12 = BatchNormalization(name='bn32')(x12)  x12 = Activation('relu', name='relu35')(x12)  x12 = ZeroPadding2D((1, 1), name='pad11')(x12)  x12 = Conv2D(256, (3, 3), strides=(2, 2), name='conv48')(x12)  x12 = BatchNormalization(name='bn33')(x12)  x12 = Activation('relu', name='relu36')(x12)  x12 = Conv2D(1024, (1, 1), strides=(1, 1), name='conv49')(x12)  shortcut = MaxPooling2D(pool_size=(1, 1), strides=(2, 2), padding='valid', name='conv50')(x11)  shortcut = Conv2D(1024, (1, 1), strides=(1, 1), name='conv51')(shortcut)  x12 = layers.add([x12, shortcut], name='add12')  # STAGE 13  x13 = BatchNormalization(name='bn34')(x12)  x13 = Activation('relu', name='relu37')(x13)  x13 = Conv2D(512, (1, 1), strides=(1, 1), name='conv52')(x13)  x13 = BatchNormalization(name='bn35')(x13)  x13 = Activation('relu', name='relu38')(x13)  x13 = ZeroPadding2D((1, 1), name='pad12')(x13)  x13 = Conv2D(512, (3, 3), strides=(1, 1), name='conv53')(x13)  x13 = BatchNormalization(name='bn36')(x13)  x13 = Activation('relu', name='relu39')(x13)  x13 = Conv2D(2048, (1, 1), strides=(1, 1), name='conv54')(x13)  shortcut = Conv2D(2048, (1, 1), strides=(1, 1), name='conv55')(x12)  x13 = layers.add([x13, shortcut], name='add13')  # STAGE 14  x14 = BatchNormalization(name='bn37')(x13)  x14 = Activation('relu', name='relu40')(x14)  x14 = Conv2D(512, (1, 1), strides=(1, 1), name='conv56')(x14)  x14 = BatchNormalization(name='bn38')(x14)  x14 = Activation('relu', name='relu41')(x14)  x14 = ZeroPadding2D((1, 1), name='pad13')(x14)  x14 = Conv2D(512, (3, 3), strides=(1, 1), name='conv57')(x14)  x14 = BatchNormalization(name='bn39')(x14)  x14 = Activation('relu', name='relu42')(x14)  x14 = Conv2D(2048, (1, 1), strides=(1, 1), name='conv58')(x14)  shortcut = Conv2D(2048, (1, 1), strides=(1, 1), name='conv59')(x13)  x14 = layers.add([x14, shortcut], name='add14')  # STAGE 15  x15 = BatchNormalization(name='bn40')(x14)  x15 = Activation('relu', name='relu43')(x15)  x15 = Conv2D(512, (1, 1), strides=(1, 1), name='conv60')(x15)  x15 = BatchNormalization(name='bn41')(x15)  x15 = Activation('relu', name='relu44')(x15)  x15 = ZeroPadding2D((1, 1), name='pad14')(x15)  x15 = Conv2D(512, (3, 3), strides=(1, 1), name='conv61')(x15)  x15 = BatchNormalization(name='bn42')(x15)  x15 = Activation('relu', name='relu45')(x15)  x15 = Conv2D(2048, (1, 1), strides=(1, 1), name='conv62')(x15)  shortcut = Conv2D(2048, (1, 1), strides=(1, 1), name='conv63')(x14)  x15 = layers.add([x15, shortcut], name='add15')  # STAGE 16  x16 = BatchNormalization(name='bn43')(x15)  x16 = Activation('relu', name='relu46')(x16)  x16 = GlobalAveragePooling2D()(x16)  x16 = Flatten()(x16)  x16 = Dense(classes, activation='softmax', name='fc1000')(x16)  model = Model(img_input, x16, name='ResNet50V2')  return model  if __name__=='__main__':  model = ResNet50V2()  model.summary()

2.训练代码

import numpy as np  
import tensorflow as tf  
from models.ResNet50V2 import ResNet50V2  
from tensorflow.python.data import AUTOTUNE  # 设置GPU  
# 获取当前系统中所有可用的物理GPU设备  
gpus = tf.config.list_physical_devices("GPU")  # 如果系统中存在GPU设备  
if gpus:  # 设置第一个GPU设备的内存增长模式为动态增长,以避免一次性占用所有显存  tf.config.experimental.set_memory_growth(gpus[0], True)  # 设置当前可见的GPU设备为第一个GPU,确保程序仅使用该GPU进行计算  tf.config.set_visible_devices([gpus[0]], "GPU")  # 导入数据  
import matplotlib.pyplot as plt  
import os, PIL, pathlib  
from tensorflow import keras  
from tensorflow.keras import layers, models  # 设置matplotlib的字体为SimHei,以支持中文显示  
plt.rcParams['font.sans-serif'] = ['SimHei']  
# 设置matplotlib的负号显示为正常符号,避免显示为方块  
plt.rcParams['axes.unicode_minus'] = False  # 定义数据目录路径  
data_dir = "./data/bird_photos"  
# 将路径转换为pathlib.Path对象,方便后续操作  
data_dir = pathlib.Path(data_dir)  # 使用glob方法获取所有子目录下的jpg文件,并计算其数量  
image_count = len(list(data_dir.glob('*/*.jpg')))  
# 打印图片数量  
print("图片数量:",image_count)  # 数据预处理  
# 定义批量大小和图像尺寸  
batch_size = 8  
img_height = 224  
img_width = 224  # 使用 `tf.keras.preprocessing.image_dataset_from_directory` 从指定目录加载训练数据集  
# 参数说明:  
# - data_dir: 包含图像数据的目录路径  
# - validation_split: 用于验证集的数据比例,此处为20%  
# - subset: 指定加载的数据子集,此处为训练集  
# - seed: 随机种子,确保数据分割的可重复性  
# - image_size: 图像将被调整到的尺寸,此处为224x224  
# - batch_size: 每个批次的图像数量,此处为8  
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)  # 使用 `tf.keras.preprocessing.image_dataset_from_directory` 从指定目录加载验证数据集  
# 参数说明与训练集相同,但 `subset` 参数指定为验证集  
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)  # 从训练数据集中获取类别名称  
class_names = train_ds.class_names  # 打印类别名称  
print("类别:", class_names)  # 可视化数据  
# 可视化训练数据集中的部分图像及其对应的标签  
# 该代码块创建一个大小为10x5的图形窗口,并在窗口中展示训练数据集中的前8张图像及其标签。  plt.figure(figsize=(10, 5))  # 创建一个大小为10x5的图形窗口  
plt.suptitle("训练数据集可视化")  # 设置图形的标题为"训练数据集可视化"  # 从训练数据集中取出一批数据(images和labels),并展示其中的前8张图像  
for images, labels in train_ds.take(1):  for i in range(8):  ax = plt.subplot(2, 4, i+1)  # 在2行4列的网格中创建第i+1个子图  plt.imshow(images[i].numpy().astype("uint8"))  # 显示第i张图像,并将其转换为uint8类型  plt.title(class_names[labels[i]])  # 设置子图的标题为对应的类别名称  plt.axis("off")  # 关闭子图的坐标轴显示  # 检查数据  
"""  
遍历训练数据集中的批次,并打印图像批次和标签批次的形状。  该代码片段从训练数据集 `train_ds` 中获取一个批次的数据,并打印该批次中图像和标签的形状。  
`train_ds` 是一个可迭代对象,通常包含图像和标签的批次数据。  代码执行流程:  
1. 从 `train_ds` 中获取一个批次的图像和标签。  
2. 打印图像批次的形状。  
3. 打印标签批次的形状。  
4. 使用 `break` 语句提前退出循环,仅处理第一个批次。  
"""  
for image_batch, labels_batch in train_ds:  # 打印图像批次的形状,通常为 (batch_size, height, width, channels)    print(image_batch.shape)  # 打印标签批次的形状,通常为 (batch_size,)    print(labels_batch.shape)  # 仅处理第一个批次后退出循环  break  # 配置数据集  
# 设置自动调优参数,用于优化数据加载和预处理性能  
AUTOTUNE = tf.data.AUTOTUNE  # 对训练数据集进行优化处理:  
# 1. `cache()`: 将数据集缓存到内存或磁盘,避免在每个epoch重复加载数据,提高训练效率。  
# 2. `shuffle(1000)`: 对数据集进行随机打乱,缓冲区大小为1000,确保训练数据的随机性。  
# 3. `prefetch(buffer_size=AUTOTUNE)`: 使用自动调优的缓冲区大小,预取数据以重叠数据加载和模型训练,提高整体性能。  
train_ds = train_ds.cache().shuffle(1000).prefetch(buffer_size=AUTOTUNE)  # 对验证数据集进行优化处理:  
# 1. `cache()`: 将数据集缓存到内存或磁盘,避免在每个epoch重复加载数据,提高验证效率。  
# 2. `prefetch(buffer_size=AUTOTUNE)`: 使用自动调优的缓冲区大小,预取数据以重叠数据加载和模型验证,提高整体性能。  
val_ds = val_ds.cache().prefetch(buffer_size=AUTOTUNE)  # 初始化一个ResNet50V2模型实例  
# 参数说明:  
#   - input_shape: 输入图像的形状,格式为[height, width, channels],此处为[224, 224, 3],表示224x224像素的RGB图像  
#   - classes: 分类任务的类别数量,此处为class_names列表的长度,表示模型将输出对应类别的概率  
model = ResNet50V2(classes=4)  # 打印模型的摘要信息,包括每一层的名称、输出形状和参数数量  
model.summary()  model.compile(  # 使用Adam优化器,学习率初始值为0.001  optimizer=tf.keras.optimizers.Adam(learning_rate=0.001),  # 设置损失函数为交叉熵损失函数  loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),  # 设置性能指标列表,将在模型训练时监控列表中的指标  metrics=['accuracy']  
)  # 训练模型并记录训练过程中的历史数据  
#  
# 参数:  
#   train_ds: 训练数据集,通常是一个tf.data.Dataset对象,包含训练数据。  
#   validation_data: 验证数据集,通常是一个tf.data.Dataset对象,用于在训练过程中评估模型性能。  
#   epochs: 训练的轮数,即模型将遍历整个训练数据集的次数。  
#  
# 返回值:  
#   history: 一个History对象,包含训练过程中的损失和评估指标的历史记录。  epochs = 10  
history = model.fit(  train_ds,  validation_data=val_ds,  epochs=epochs  
)  # 评估模型  
# 该代码块用于绘制模型训练过程中的准确率和损失曲线,以便可视化模型在训练集和验证集上的表现。  # 从训练历史记录中提取训练集和验证集的准确率及损失值  
acc = history.history['accuracy']  
val_acc = history.history['val_accuracy']  
loss = history.history['loss']  
val_loss = history.history['val_loss']  # 生成一个范围,表示训练的轮数(epochs)  
epochs_range = range(epochs)  # 创建一个大小为12x4的图形窗口  
plt.figure(figsize=(12, 4))  # 在图形窗口的第一个子图中绘制训练集和验证集的准确率曲线  
plt.subplot(1, 2, 1)  
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()  # 预测  
# 该函数用于展示验证数据集中的图片,并使用训练好的模型对图片进行预测,显示预测结果。  
# 函数的主要步骤包括:  
# 1. 创建一个大小为10x5的图形窗口。  
# 2. 设置图形的总标题为“图片预测”。  
# 3. 从验证数据集中取出一批图片和标签。  
# 4. 对每张图片进行预测,并在子图中显示图片和预测结果。  
# 5. 关闭子图的坐标轴显示。  plt.figure(figsize=(10, 5))  # 创建一个大小为10x5的图形窗口  
plt.suptitle("图片预测")  # 设置图形的总标题为“图片预测”  # 从验证数据集中取出一批图片和标签  
for images, labels in val_ds.take(1):  # 遍历前8张图片,并在子图中显示图片和预测结果  for i in range(8):  ax = plt.subplot(2, 4, i+1)  # 创建2行4列的子图,并选择第i+1个子图  plt.imshow(images[i].numpy().astype("uint8"))  # 显示第i张图片  # 对图片进行预测  img_array = tf.expand_dims(images[i], 0)  # 扩展图片的维度以适应模型输入  predictions = model.predict(img_array)  # 使用模型进行预测  # 在子图标题中显示预测结果  plt.title(class_names[np.argmax(predictions)])  plt.axis("off")  # 关闭子图的坐标轴显示

结果

Model: "ResNet50V2"
__________________________________________________________________________________________________Layer (type)                   Output Shape         Param #     Connected to                     
==================================================================================================input_1 (InputLayer)           [(None, 224, 224, 3  0           []                               )]                                                                conv1_pad (ZeroPadding2D)      (None, 226, 226, 3)  0           ['input_1[0][0]']                conv1 (Conv2D)                 (None, 110, 110, 64  9472        ['conv1_pad[0][0]']              )                                                                 bn_conv1 (BatchNormalization)  (None, 110, 110, 64  256         ['conv1[0][0]']                  )                                                                 activation (Activation)        (None, 110, 110, 64  0           ['bn_conv1[0][0]']               )                                                                 zero_padding2d (ZeroPadding2D)  (None, 112, 112, 64  0          ['activation[0][0]']             )                                                                 max_pooling2d (MaxPooling2D)   (None, 55, 55, 64)   0           ['zero_padding2d[0][0]']         bn_conv2 (BatchNormalization)  (None, 55, 55, 64)   256         ['max_pooling2d[0][0]']          activation_1 (Activation)      (None, 55, 55, 64)   0           ['bn_conv2[0][0]']               conv2 (Conv2D)                 (None, 55, 55, 64)   4160        ['activation_1[0][0]']           bn_conv3 (BatchNormalization)  (None, 55, 55, 64)   256         ['conv2[0][0]']                  activation_2 (Activation)      (None, 55, 55, 64)   0           ['bn_conv3[0][0]']               zero_padding2d_1 (ZeroPadding2  (None, 57, 57, 64)  0           ['activation_2[0][0]']           D)                                                                                               conv3 (Conv2D)                 (None, 55, 55, 64)   36928       ['zero_padding2d_1[0][0]']       bn_conv4 (BatchNormalization)  (None, 55, 55, 64)   256         ['conv3[0][0]']                  activation_3 (Activation)      (None, 55, 55, 64)   0           ['bn_conv4[0][0]']               conv4 (Conv2D)                 (None, 55, 55, 256)  16640       ['activation_3[0][0]']           conv5 (Conv2D)                 (None, 55, 55, 256)  16640       ['max_pooling2d[0][0]']          add1 (Add)                     (None, 55, 55, 256)  0           ['conv4[0][0]',                  'conv5[0][0]']                  bn1 (BatchNormalization)       (None, 55, 55, 256)  1024        ['add1[0][0]']                   relu4 (Activation)             (None, 55, 55, 256)  0           ['bn1[0][0]']                    conv6 (Conv2D)                 (None, 55, 55, 64)   16448       ['relu4[0][0]']                  bn2 (BatchNormalization)       (None, 55, 55, 64)   256         ['conv6[0][0]']                  relu5 (Activation)             (None, 55, 55, 64)   0           ['bn2[0][0]']                    pad1 (ZeroPadding2D)           (None, 57, 57, 64)   0           ['relu5[0][0]']                  conv7 (Conv2D)                 (None, 55, 55, 64)   36928       ['pad1[0][0]']                   bn3 (BatchNormalization)       (None, 55, 55, 64)   256         ['conv7[0][0]']                  relu6 (Activation)             (None, 55, 55, 64)   0           ['bn3[0][0]']                    conv8 (Conv2D)                 (None, 55, 55, 256)  16640       ['relu6[0][0]']                  conv9 (Conv2D)                 (None, 55, 55, 256)  65792       ['add1[0][0]']                   add2 (Add)                     (None, 55, 55, 256)  0           ['conv8[0][0]',                  'conv9[0][0]']                  bn4 (BatchNormalization)       (None, 55, 55, 256)  1024        ['add2[0][0]']                   relu7 (Activation)             (None, 55, 55, 256)  0           ['bn4[0][0]']                    conv10 (Conv2D)                (None, 55, 55, 64)   16448       ['relu7[0][0]']                  bn5 (BatchNormalization)       (None, 55, 55, 64)   256         ['conv10[0][0]']                 relu8 (Activation)             (None, 55, 55, 64)   0           ['bn5[0][0]']                    pad2 (ZeroPadding2D)           (None, 57, 57, 64)   0           ['relu8[0][0]']                  conv11 (Conv2D)                (None, 28, 28, 64)   36928       ['pad2[0][0]']                   bn6 (BatchNormalization)       (None, 28, 28, 64)   256         ['conv11[0][0]']                 relu9 (Activation)             (None, 28, 28, 64)   0           ['bn6[0][0]']                    conv12 (Conv2D)                (None, 28, 28, 256)  16640       ['relu9[0][0]']                  conv13 (Conv2D)                (None, 28, 28, 256)  65792       ['add2[0][0]']                   add3 (Add)                     (None, 28, 28, 256)  0           ['conv12[0][0]',                 'conv13[0][0]']                 bn7 (BatchNormalization)       (None, 28, 28, 256)  1024        ['add3[0][0]']                   relu10 (Activation)            (None, 28, 28, 256)  0           ['bn7[0][0]']                    conv14 (Conv2D)                (None, 28, 28, 128)  32896       ['relu10[0][0]']                 bn8 (BatchNormalization)       (None, 28, 28, 128)  512         ['conv14[0][0]']                 relu11 (Activation)            (None, 28, 28, 128)  0           ['bn8[0][0]']                    pad3 (ZeroPadding2D)           (None, 30, 30, 128)  0           ['relu11[0][0]']                 conv15 (Conv2D)                (None, 28, 28, 128)  147584      ['pad3[0][0]']                   bn9 (BatchNormalization)       (None, 28, 28, 128)  512         ['conv15[0][0]']                 relu12 (Activation)            (None, 28, 28, 128)  0           ['bn9[0][0]']                    conv16 (Conv2D)                (None, 28, 28, 512)  66048       ['relu12[0][0]']                 conv17 (Conv2D)                (None, 28, 28, 512)  131584      ['add3[0][0]']                   add4 (Add)                     (None, 28, 28, 512)  0           ['conv16[0][0]',                 'conv17[0][0]']                 bn10 (BatchNormalization)      (None, 28, 28, 512)  2048        ['add4[0][0]']                   relu13 (Activation)            (None, 28, 28, 512)  0           ['bn10[0][0]']                   conv18 (Conv2D)                (None, 28, 28, 128)  65664       ['relu13[0][0]']                 bn11 (BatchNormalization)      (None, 28, 28, 128)  512         ['conv18[0][0]']                 relu14 (Activation)            (None, 28, 28, 128)  0           ['bn11[0][0]']                   pad4 (ZeroPadding2D)           (None, 30, 30, 128)  0           ['relu14[0][0]']                 conv19 (Conv2D)                (None, 28, 28, 128)  147584      ['pad4[0][0]']                   bn12 (BatchNormalization)      (None, 28, 28, 128)  512         ['conv19[0][0]']                 relu15 (Activation)            (None, 28, 28, 128)  0           ['bn12[0][0]']                   conv20 (Conv2D)                (None, 28, 28, 512)  66048       ['relu15[0][0]']                 conv21 (Conv2D)                (None, 28, 28, 512)  262656      ['add4[0][0]']                   add5 (Add)                     (None, 28, 28, 512)  0           ['conv20[0][0]',                 'conv21[0][0]']                 bn13 (BatchNormalization)      (None, 28, 28, 512)  2048        ['add5[0][0]']                   relu16 (Activation)            (None, 28, 28, 512)  0           ['bn13[0][0]']                   conv22 (Conv2D)                (None, 28, 28, 128)  65664       ['relu16[0][0]']                 bn14 (BatchNormalization)      (None, 28, 28, 128)  512         ['conv22[0][0]']                 relu17 (Activation)            (None, 28, 28, 128)  0           ['bn14[0][0]']                   pad5 (ZeroPadding2D)           (None, 30, 30, 128)  0           ['relu17[0][0]']                 conv23 (Conv2D)                (None, 28, 28, 128)  147584      ['pad5[0][0]']                   bn15 (BatchNormalization)      (None, 28, 28, 128)  512         ['conv23[0][0]']                 relu18 (Activation)            (None, 28, 28, 128)  0           ['bn15[0][0]']                   conv24 (Conv2D)                (None, 28, 28, 512)  66048       ['relu18[0][0]']                 conv25 (Conv2D)                (None, 28, 28, 512)  262656      ['add5[0][0]']                   add6 (Add)                     (None, 28, 28, 512)  0           ['conv24[0][0]',                 'conv25[0][0]']                 bn16 (BatchNormalization)      (None, 28, 28, 512)  2048        ['add6[0][0]']                   relu19 (Activation)            (None, 28, 28, 512)  0           ['bn16[0][0]']                   conv26 (Conv2D)                (None, 28, 28, 128)  65664       ['relu19[0][0]']                 bn17 (BatchNormalization)      (None, 28, 28, 128)  512         ['conv26[0][0]']                 relu20 (Activation)            (None, 28, 28, 128)  0           ['bn17[0][0]']                   pad6 (ZeroPadding2D)           (None, 30, 30, 128)  0           ['relu20[0][0]']                 conv27 (Conv2D)                (None, 14, 14, 128)  147584      ['pad6[0][0]']                   bn18 (BatchNormalization)      (None, 14, 14, 128)  512         ['conv27[0][0]']                 relu21 (Activation)            (None, 14, 14, 128)  0           ['bn18[0][0]']                   conv28 (Conv2D)                (None, 14, 14, 512)  66048       ['relu21[0][0]']                 conv30 (Conv2D)                (None, 14, 14, 512)  262656      ['add6[0][0]']                   add7 (Add)                     (None, 14, 14, 512)  0           ['conv28[0][0]',                 'conv30[0][0]']                 bn19 (BatchNormalization)      (None, 14, 14, 512)  2048        ['add7[0][0]']                   relu22 (Activation)            (None, 14, 14, 512)  0           ['bn19[0][0]']                   conv31 (Conv2D)                (None, 14, 14, 256)  131328      ['relu22[0][0]']                 bn20 (BatchNormalization)      (None, 14, 14, 256)  1024        ['conv31[0][0]']                 relu23 (Activation)            (None, 14, 14, 256)  0           ['bn20[0][0]']                   pad7 (ZeroPadding2D)           (None, 16, 16, 256)  0           ['relu23[0][0]']                 conv32 (Conv2D)                (None, 14, 14, 256)  590080      ['pad7[0][0]']                   bn21 (BatchNormalization)      (None, 14, 14, 256)  1024        ['conv32[0][0]']                 relu24 (Activation)            (None, 14, 14, 256)  0           ['bn21[0][0]']                   conv33 (Conv2D)                (None, 14, 14, 1024  263168      ['relu24[0][0]']                 )                                                                 conv34 (Conv2D)                (None, 14, 14, 1024  525312      ['add7[0][0]']                   )                                                                 add8 (Add)                     (None, 14, 14, 1024  0           ['conv33[0][0]',                 )                                 'conv34[0][0]']                 bn22 (BatchNormalization)      (None, 14, 14, 1024  4096        ['add8[0][0]']                   )                                                                 relu25 (Activation)            (None, 14, 14, 1024  0           ['bn22[0][0]']                   )                                                                 conv35 (Conv2D)                (None, 14, 14, 256)  262400      ['relu25[0][0]']                 bn23 (BatchNormalization)      (None, 14, 14, 256)  1024        ['conv35[0][0]']                 relu26 (Activation)            (None, 14, 14, 256)  0           ['bn23[0][0]']                   pad8 (ZeroPadding2D)           (None, 16, 16, 256)  0           ['relu26[0][0]']                 conv36 (Conv2D)                (None, 14, 14, 256)  590080      ['pad8[0][0]']                   bn24 (BatchNormalization)      (None, 14, 14, 256)  1024        ['conv36[0][0]']                 relu27 (Activation)            (None, 14, 14, 256)  0           ['bn24[0][0]']                   conv37 (Conv2D)                (None, 14, 14, 1024  263168      ['relu27[0][0]']                 )                                                                 conv38 (Conv2D)                (None, 14, 14, 1024  1049600     ['add8[0][0]']                   )                                                                 add9 (Add)                     (None, 14, 14, 1024  0           ['conv37[0][0]',                 )                                 'conv38[0][0]']                 bn25 (BatchNormalization)      (None, 14, 14, 1024  4096        ['add9[0][0]']                   )                                                                 relu28 (Activation)            (None, 14, 14, 1024  0           ['bn25[0][0]']                   )                                                                 conv39 (Conv2D)                (None, 14, 14, 256)  262400      ['relu28[0][0]']                 bn26 (BatchNormalization)      (None, 14, 14, 256)  1024        ['conv39[0][0]']                 relu29 (Activation)            (None, 14, 14, 256)  0           ['bn26[0][0]']                   pad9 (ZeroPadding2D)           (None, 16, 16, 256)  0           ['relu29[0][0]']                 conv40 (Conv2D)                (None, 14, 14, 256)  590080      ['pad9[0][0]']                   bn27 (BatchNormalization)      (None, 14, 14, 256)  1024        ['conv40[0][0]']                 relu30 (Activation)            (None, 14, 14, 256)  0           ['bn27[0][0]']                   conv41 (Conv2D)                (None, 14, 14, 1024  263168      ['relu30[0][0]']                 )                                                                 conv42 (Conv2D)                (None, 14, 14, 1024  1049600     ['add9[0][0]']                   )                                                                 add10 (Add)                    (None, 14, 14, 1024  0           ['conv41[0][0]',                 )                                 'conv42[0][0]']                 bn28 (BatchNormalization)      (None, 14, 14, 1024  4096        ['add10[0][0]']                  )                                                                 relu31 (Activation)            (None, 14, 14, 1024  0           ['bn28[0][0]']                   )                                                                 conv43 (Conv2D)                (None, 14, 14, 256)  262400      ['relu31[0][0]']                 bn29 (BatchNormalization)      (None, 14, 14, 256)  1024        ['conv43[0][0]']                 relu32 (Activation)            (None, 14, 14, 256)  0           ['bn29[0][0]']                   pad10 (ZeroPadding2D)          (None, 16, 16, 256)  0           ['relu32[0][0]']                 conv44 (Conv2D)                (None, 14, 14, 256)  590080      ['pad10[0][0]']                  bn30 (BatchNormalization)      (None, 14, 14, 256)  1024        ['conv44[0][0]']                 relu33 (Activation)            (None, 14, 14, 256)  0           ['bn30[0][0]']                   conv45 (Conv2D)                (None, 14, 14, 1024  263168      ['relu33[0][0]']                 )                                                                 conv46 (Conv2D)                (None, 14, 14, 1024  1049600     ['add10[0][0]']                  )                                                                 add11 (Add)                    (None, 14, 14, 1024  0           ['conv45[0][0]',                 )                                 'conv46[0][0]']                 bn31 (BatchNormalization)      (None, 14, 14, 1024  4096        ['add11[0][0]']                  )                                                                 relu34 (Activation)            (None, 14, 14, 1024  0           ['bn31[0][0]']                   )                                                                 conv47 (Conv2D)                (None, 14, 14, 256)  262400      ['relu34[0][0]']                 bn32 (BatchNormalization)      (None, 14, 14, 256)  1024        ['conv47[0][0]']                 relu35 (Activation)            (None, 14, 14, 256)  0           ['bn32[0][0]']                   pad11 (ZeroPadding2D)          (None, 16, 16, 256)  0           ['relu35[0][0]']                 conv48 (Conv2D)                (None, 7, 7, 256)    590080      ['pad11[0][0]']                  bn33 (BatchNormalization)      (None, 7, 7, 256)    1024        ['conv48[0][0]']                 relu36 (Activation)            (None, 7, 7, 256)    0           ['bn33[0][0]']                   conv50 (MaxPooling2D)          (None, 7, 7, 1024)   0           ['add11[0][0]']                  conv49 (Conv2D)                (None, 7, 7, 1024)   263168      ['relu36[0][0]']                 conv51 (Conv2D)                (None, 7, 7, 1024)   1049600     ['conv50[0][0]']                 add12 (Add)                    (None, 7, 7, 1024)   0           ['conv49[0][0]',                 'conv51[0][0]']                 bn34 (BatchNormalization)      (None, 7, 7, 1024)   4096        ['add12[0][0]']                  relu37 (Activation)            (None, 7, 7, 1024)   0           ['bn34[0][0]']                   conv52 (Conv2D)                (None, 7, 7, 512)    524800      ['relu37[0][0]']                 bn35 (BatchNormalization)      (None, 7, 7, 512)    2048        ['conv52[0][0]']                 relu38 (Activation)            (None, 7, 7, 512)    0           ['bn35[0][0]']                   pad12 (ZeroPadding2D)          (None, 9, 9, 512)    0           ['relu38[0][0]']                 conv53 (Conv2D)                (None, 7, 7, 512)    2359808     ['pad12[0][0]']                  bn36 (BatchNormalization)      (None, 7, 7, 512)    2048        ['conv53[0][0]']                 relu39 (Activation)            (None, 7, 7, 512)    0           ['bn36[0][0]']                   conv54 (Conv2D)                (None, 7, 7, 2048)   1050624     ['relu39[0][0]']                 conv55 (Conv2D)                (None, 7, 7, 2048)   2099200     ['add12[0][0]']                  add13 (Add)                    (None, 7, 7, 2048)   0           ['conv54[0][0]',                 'conv55[0][0]']                 bn37 (BatchNormalization)      (None, 7, 7, 2048)   8192        ['add13[0][0]']                  relu40 (Activation)            (None, 7, 7, 2048)   0           ['bn37[0][0]']                   conv56 (Conv2D)                (None, 7, 7, 512)    1049088     ['relu40[0][0]']                 bn38 (BatchNormalization)      (None, 7, 7, 512)    2048        ['conv56[0][0]']                 relu41 (Activation)            (None, 7, 7, 512)    0           ['bn38[0][0]']                   pad13 (ZeroPadding2D)          (None, 9, 9, 512)    0           ['relu41[0][0]']                 conv57 (Conv2D)                (None, 7, 7, 512)    2359808     ['pad13[0][0]']                  bn39 (BatchNormalization)      (None, 7, 7, 512)    2048        ['conv57[0][0]']                 relu42 (Activation)            (None, 7, 7, 512)    0           ['bn39[0][0]']                   conv58 (Conv2D)                (None, 7, 7, 2048)   1050624     ['relu42[0][0]']                 conv59 (Conv2D)                (None, 7, 7, 2048)   4196352     ['add13[0][0]']                  add14 (Add)                    (None, 7, 7, 2048)   0           ['conv58[0][0]',                 'conv59[0][0]']                 bn40 (BatchNormalization)      (None, 7, 7, 2048)   8192        ['add14[0][0]']                  relu43 (Activation)            (None, 7, 7, 2048)   0           ['bn40[0][0]']                   conv60 (Conv2D)                (None, 7, 7, 512)    1049088     ['relu43[0][0]']                 bn41 (BatchNormalization)      (None, 7, 7, 512)    2048        ['conv60[0][0]']                 relu44 (Activation)            (None, 7, 7, 512)    0           ['bn41[0][0]']                   pad14 (ZeroPadding2D)          (None, 9, 9, 512)    0           ['relu44[0][0]']                 conv61 (Conv2D)                (None, 7, 7, 512)    2359808     ['pad14[0][0]']                  bn42 (BatchNormalization)      (None, 7, 7, 512)    2048        ['conv61[0][0]']                 relu45 (Activation)            (None, 7, 7, 512)    0           ['bn42[0][0]']                   conv62 (Conv2D)                (None, 7, 7, 2048)   1050624     ['relu45[0][0]']                 conv63 (Conv2D)                (None, 7, 7, 2048)   4196352     ['add14[0][0]']                  add15 (Add)                    (None, 7, 7, 2048)   0           ['conv62[0][0]',                 'conv63[0][0]']                 bn43 (BatchNormalization)      (None, 7, 7, 2048)   8192        ['add15[0][0]']                  relu46 (Activation)            (None, 7, 7, 2048)   0           ['bn43[0][0]']                   global_average_pooling2d (Glob  (None, 2048)        0           ['relu46[0][0]']                 alAveragePooling2D)                                                                              flatten (Flatten)              (None, 2048)         0           ['global_average_pooling2d[0][0]']                                fc1000 (Dense)                 (None, 4)            8196        ['flatten[0][0]']                ==================================================================================================
Total params: 35,969,668
Trainable params: 35,927,172
Non-trainable params: 42,496
__________________________________________________________________________________________________

image.png

(三)总结

结果不是很理想,网络结构应该还有瑕疵。后续优化代码解决拟合问题。
resnet50v2的详细网络结构:
resnet50v2.png

相关文章:

第J2周:ResNet50V2算法实现01(Tensorflow硬编码版)

🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 目标 使用tensorflow实现ResNetV50V2的网络结构。本次根据第一层的细节手动硬编码,没有任何的优化,只为了更好的理解细节。 目录结构&…...

论文分享 | HE-Nav: 一种适用于复杂环境中空地机器人的高性能高效导航系统

阿木实验室始终致力于通过开源项目和智能无人机产品,为全球无人机开发者提供强有力的技术支持,并推出了开源项目校园赞助活动,助力高校学子在学术研究与技术创新中取得更大突破。近日,香港大学王俊铭同学,基于阿木实验…...

【mysql】centOS7安装mysql详细操作步骤!—通过tar包方式

【mysql】centOS7安装mysql详细操作步骤! linux系统安装mysql版本 需要 root 权限,使用 root 用户进行命令操作。使用tar文件包,安装,gz包也可以但是还需要配置用户,tar包虽然大,但是全啊! 1. …...

java学习笔记1

程序编译步骤 java程序执行步骤 相关代码及解释: /* 对第一个java程序进行总结 1. java程序编写-编译-运行的过程 编写:我们将编写的java代码保存在以".java"结尾的源文件中 编译:使用javac.exe命令编译我们的java源文件。格式&am…...

强大的数据库DevOps工具:NineData 社区版

本文作者司马辽太杰, gzh:程序猿读历史 在业务快速变化与数据安全日益重要的今天,生产数据库变更管理、版本控制、数据使用是数据库领域的核心挑战之一。传统的解决方式往往采用邮件或即时通讯工具发起审批流程,再通过堡垒机直连数…...

「Unity3D」UGUI运行时设置元素的锚点Anchor,维持元素Rect的显示不变,即待在原处

在编辑器中,通过设置Raw edit mode,可以切换两种,元素锚点的改变模式: 一种是锚点单独改变,即:不开启原始模式,保持原样,改变anchoredPosition与sizeDelta。一种是锚点联动显示&…...

深入解析大语言模型的 Function Call 实现—— 以 Qwen2.5为例

引言 在现代大语言模型(LLM)中,Function Call(函数调用)能力极大地提升了模型的实用性,使其能够调用外部 API、执行复杂计算或获取实时数据。例如,在 OpenAI API 和 Qwen2.5-7B-Instruct 这样的…...

鸿蒙路由 HMrouter 配置及使用一

1、学习链接 HMRouter地址 https://gitee.com/hadss/hmrouter/blob/dev/HMRouterLibrary/README.md 2、工程配置 下载安装 ohpm install hadss/hmrouter 添加编译插件配置 在工程目录下的build-profile.json5中,配置useNormalizedOHMUrl属性为true (我这项目创…...

驾驭 DeepSeek 科技之翼,翱翔现代学习新天际

在当今这个信息爆炸的时代,学习的方式和途径正在经历着前所未有的变革。人工智能技术的飞速发展,为我们的学习带来了全新的机遇和挑战。DeepSeek 作为一款强大的大语言模型,凭借其卓越的性能和丰富的功能,为现代学习注入了新的活力…...

[Windows] 轻量级景好鼠标录制器 v2.1 单文件版,支持轨迹+鼠标键盘录制复刻

[Windows] 轻量级景好鼠标录制器 链接:https://pan.xunlei.com/s/VOLHz0rPyqdhV4bgyTYuW6W7A1?pwd98uj# 软件特性: 高效播放控制:动作间隔优化至100 ms,进度条可视化,支持随机循环/多次播放。 深度自定义&#xff1…...

C#生产型企业ERP系统管理软件PCB行业ERP进销存MRP管理系统BOM管理

背景 本软件为为苏州某生产型电子科技企业开发的ERP管理软件。 功能说明 希哲管理系统v1.0是一款在流览器上使用的企业管理软件,使用上与客户端版的优势是: 1.安装更新部署方便,只需服务器部署了软件,其它客户端的用户无需安装&am…...

【Linux内核系列】:文件系统

🔥 本文专栏:Linux 🌸作者主页:努力努力再努力wz ★★★ 本文前置知识: 文件系统初识 那么在我们此前关于文件的学习中,我们学习的都是进程与打开的文件之间的关系,以及打开的文件如何进行管理…...

工程化与框架系列(35)--前端微服务架构实践

前端微服务架构实践 🏗️ 引言 随着前端应用规模的不断扩大,微服务架构在前端领域的应用越来越广泛。本文将深入探讨前端微服务架构的实现方案、最佳实践和相关工具。 微服务架构概述 前端微服务架构主要包括以下方面: 应用拆分&#xf…...

多条件下的免杀webshell

前言 在做webshell免杀的时候,很多情况下都是对system,eval等命令执行函数进行匹配,如果说把变量当做一个函数来使用的话,那是不是可以bypass了呢?这今天刚好看见有一个回调函数有这样的功能,而且也不会报毒&#xff…...

【算法】动态规划

⭐️个人主页:小羊 ⭐️所属专栏:Linux 很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~ 目录 动态规划总结1、常见动态规划Fibonacci数列杨辉三角最小花费爬楼梯孩子们的游戏 2、组合方案李白打酒加强版(lqb&…...

MySQL事务及索引复习笔记

本文参考小林coding,地址事务隔离级别是怎么实现的? | 小林coding 事务 一、事务是什么? 比如一个程序是转账,你要扣减a的余额,增加b的余额,但是如果程序执行扣减成功然后挂了,就会出现a的余额…...

API调用大模型推理与第三方API实现业务整合

基于Python实现大模型推理与第三方API调用的集成,需要结合Function Call机制与提示词工程。 一、技术架构设计 双阶段流程 推理阶段:大模型解析用户意图,生成结构化API调用指令执行阶段:Python代码解析指令并触发第三方API # 示例…...

GreenKGC: A Lightweight Knowledge Graph Completion Method(论文笔记)

CCF等级:A 发布时间:2023年7月 代码位置 25年3月17日交 目录 一、简介 二、原理 1.整体 2.表示学习 3.特征修剪 4.决策学习 三、实验性能 1.主要结果 2.消融实验 四、结论和未来工作 一、简介 传统知识图谱补全方法中,嵌入维度…...

Android Composable 与 View 的联系和区别

在 Android 开发中,‌Composable‌(Jetpack Compose)与‌View‌(传统 View 系统)是两种不同的 UI 构建范式。本文将从核心联系、核心区别、代码实现三方面展开对比,并通过实例代码帮助开发者理解其应用场景…...

微信小程序wx.request接口报错(errno: 600001, errMsg: “request:fail -2:net::ERR_FAILED“)

来看看报错 报错如下: 请求发送部分,代码如下: uni.request({url: self.serverUrl "/getRealName",method: GET,data: {"code": self.info.code,},header: {"Authorization": uni.getStorageSync(tokenHead) uni.getStorageSync(token)}}…...

多线程与并发编程 面试专题

多线程与并发编程 面试专题 线程的基础概念基础概念线程的创建线程的状态线程的终止方式start 与 run 区别线程的常用方法 锁锁的分类深入synchronized深入ReentrantLock死锁问题 阻塞队列线程池 线程的基础概念 基础概念 进程与线程 进程:指运行中的程序。 比如我…...

大语言模型-1.2-大模型技术基础

简介 本博客内容是《大语言模型》一书的读书笔记,该书是中国人民大学高瓴人工智能学院赵鑫教授团队出品,覆盖大语言模型训练与使用的全流程,从预训练到微调与对齐,从使用技术到评测应用,帮助学员全面掌握大语言模型的…...

【C++】每日一练(轮转数组)

本篇博客给大家带来的是用C语言来解答轮转数组! 🐟🐟文章专栏:每日一练 🚀🚀若有问题评论区下讨论,我会及时回答 ❤❤欢迎大家点赞、收藏、分享! 今日思想:不服输的少年啊…...

dify本地源码win10部署

我的win10版本还比较老,winR,输入winver 只要高于我这个版本的都没啥大问题吧,我的安装docker Desktop,搞死人了, 就是win10的Win10 22H2 64之前的版本 win10低版本安装,里面包含wdl2安装程序 https://…...

Spring Cloud Config - 动态配置管理与高可用治理

引言:为什么需要配置中心? 在微服务架构中,配置管理面临分散化、多环境、动态更新三大挑战。传统基于application.yml等配置文件的硬编码方式,导致以下问题: • 环境差异:开发、测试、生产环境配置混杂&a…...

大模型最新面试题系列:微调篇之微调框架(一)

一. 在DeepSpeed中配置零冗余优化(ZeRO)实现显存优化的步骤 核心原理 ZeRO通过分片(Sharding)技术将模型参数、梯度和优化器状态分布到多卡,消除冗余存储。三个阶段逐步减少显存占用: Stage 1&#xff1…...

windows第十三章 GDI绘图技术

文章目录 GDI绘图函数介绍设备上下文函数m_hDC GDI对象画笔画刷位图字体区域 案例分享 GDI绘图函数介绍 绘图函数在CDC类里 设备上下文 DC:device context 设备上下文,显卡驱动程序,控制硬件,每个厂商的都不同,操作系统层面&am…...

使用 Nginx 进行前端灰度发布的策略与实践

1. 引言 灰度发布的概念 灰度发布,也称为金丝雀发布,是一种软件发布策略,通过向一小部分用户群体逐步推出新版本,收集反馈并监控性能,以确保新版本在大规模部署前不会出现问题。这种方法可以有效降低发布风险&#x…...

有了大语言模型还需要 RAG 做什么

一、百炼平台简介 阿里云的百炼平台就像是一个超级智能的大厨房,专门为那些想要做出美味AI大餐的企业和个人厨师准备的。你不需要从头开始做每一道菜,因为这个厨房已经为你准备了很多预制食材(预训练模型),你可以根据…...

pytest快速入门 - 目录:半天掌握pytest

1 pytest快速入门 - 目录 本系列文章将快速的带领用户进入pytest领域,通过阅读本专栏,用户将可以熟练掌握pytest的基本用法,同时对测试前置条件的构造、后置条件的清理等有较深入的了解,特别是后置条件的执行完备度有一个认识。 …...

2.4 python网络编程

在当今数字化的时代,网络连接着世界的每一个角落。从简单的网页浏览到复杂的分布式系统,网络编程无处不在。Python 作为一种功能强大且易于学习的编程语言,在网络编程领域占据着重要的地位。它丰富的库和简洁的语法使得开发者能够高效地构建各…...

网络变压器的主要电性参数与测试方法(4)

Hqst盈盛(华强盛)电子导读:网络变压器的主要电性参数与测试方法(4).. 今天我们继续来看看网络变压器的2个重要电性参数与它的测试方法: 1.反射损耗(Return loss&…...

【Springboot知识】开发属于自己的中间件健康监测HealthIndicate

文章目录 **一、技术栈****二、项目结构****三、依赖配置 (pom.xml)****四、配置文件 (application.yml)****五、自定义健康检查实现****1. Redis健康检查****2. Elasticsearch健康检查****3. Kafka健康检查****4. MySQL健康检查** **六、自定义健康检查接口 (可选)****七、测试…...

蓝桥杯备赛-二分-技能升级

问题描述 小蓝最近正在玩一款 RPG 游戏。他的角色一共有 NN 个可以加攻击力的技能。 其中第 ii 个技能首次升级可以提升 AiAi​ 点攻击力, 以后每次升级增加的点数 都会减少 Bi。「AiBi⌉Bi​。「Bi​Ai​​⌉ (上取整) 次之后, 再升级该技能将不会改变攻击力。 现在小蓝可以…...

【GPT入门】第18课 langchain介绍与API初步体验

【GPT入门】langchain第一课 langchain介绍与API初步体验 1. langchain介绍定义特点1. 模块化与灵活性2. 链式调用机制3. 数据连接能力4. 记忆管理功能5. 提示工程支持6. 可扩展性 2.langchain核心组件架构图3. 最简单的helloworld入门 1. langchain介绍 LangChain 是一个用于…...

Django部署Filemanagement

Pycharm搭建项目安装虚拟环境 mysqlclient对mysql的安装,配置有要求 pymsql伪装成mysqlclient,pymysql可以操纵mysql pip install pymysql操作sql5.7 mysql8.0会出现与pycharm不兼容问题,会报错,所以降到5.7 # 进入mysql 需要…...

Python的types库学习记录

types 库是 Python 标准库中的一部分,它提供了与 Python 对象类型相关的工具和常量,有助于在运行时处理和操作不同类型的对象。 以下是对 types 库的详细介绍: 主要用途 • 类型检查:在运行时判断对象的类型。 • 动态创建和操作…...

C# 表达式树详解

总目录 前言 在 C# 中,表达式树(Expression Trees)是一种强大的特性,允许开发者将代码表示为数据结构。这使得我们可以在运行时动态地创建和操作代码逻辑,广泛应用于 LINQ 查询、动态方法生成以及反射等领域。本文将深…...

分别用树型和UML结构展示java集合框架常见接口和类

树型结构展示java集合框架常见接口和类 Java 集合框架中的接口和子类关系可以用树形结构来展示。以下是一个简化的树形结构,展示了主要的接口和一些重要的实现类: java.util.Collection ├── java.util.List │ ├── java.util.ArrayList │ ├…...

蓝桥杯备赛-二分-青蛙过河

问题描述 小青蛙住在一条河边, 它想到河对岸的学校去学习。小青蛙打算经过河里 的石头跳到对岸。 河里的石头排成了一条直线, 小青蛙每次跳跃必须落在一块石头或者岸上。 不过, 每块石头有一个高度, 每次小青蛙从一块石头起跳, 这块石头的高度就 会下降 1 , 当石头的高度下降…...

uniapp+微信小程序+最简单局部下拉刷新实现

直接上代码 <scroll-view style"height: 27vh;" :scroll-top"scrollTop" scroll-y"true"scrolltolower"onScrollToLower1" lower-threshold"50"refresher-enabled"true" refresherrefresh"onRefresherR…...

Spring Boot 3.x 中 @NotNull 与 @NonNull 的深度解析

在 Java 开发领域&#xff0c;尤其是在 Spring Boot 生态系统中&#xff0c;空指针异常&#xff08;NPEs&#xff09;始终是一个顽固的挑战。这些运行时错误可能导致应用程序崩溃、数据不一致以及糟糕的用户体验。为了应对这一问题&#xff0c;Java 社区开发了各种空安全机制&a…...

SQLark 实战 | 如何从Excel、csv、txt等外部文件进行数据导入

数据导入导出是应用开发者在平时开发中最常用的操作之一&#xff0c;SQLark 里提供了方便的图形化界面来完成导入导出。本文先和大家分享如何从 Excel、csv、txt 等外部文件导入数据到数据库表中。 &#x1f449; 前往 SQLark 官网&#xff1a;www.sqlark.com 下载全功能免费版…...

MATLAB中envelope函数使用

目录 说明 示例 chirp 的解析包络 使用滤波器计算多通道信号的解析包络 录音信号的移动 RMS 包络 语音信号的峰值包络 不对称序列的包络 envelope函数的功能是提取信号的包络。 语法 [yupper,ylower] envelope(x) [yupper,ylower] envelope(x,fl,analytic) [yupper,…...

ES搭建详细指南+常见错误解决方法

Elasticsearch&#xff08;ES&#xff09;是一款开源的、分布式的、RESTful风格的搜索和数据分析引擎。它用于全文搜索、结构化搜索、分析等场景。以下是Elasticsearch的搭建步骤以及处理常见错误的方法。 Elasticsearch搭建步骤&#xff1a; 1.环境准备&#xff1a; 确保你的…...

Unity 封装一个依赖于MonoBehaviour的计时器(上) 基本功能

灵感来自下面这本书的协程部分,因此我就自己尝试写了一个 我的新书Unity3D游戏开发&#xff08;第3版&#xff09; | 雨松MOMO程序研究院 如果你不知道什么是协程:unity保姆级教程之协同程序_unity协同-CSDN博客 一句话概括:协程就是单线程的异步操作,其作用于Unity的主线程 1…...

PostgreSQL数据库版本支持策略

PostgreSQL数据库版本支持策略 主要版本会进行复杂的更改&#xff0c;因此无法以向后兼容的方式维护数据目录的内容。重大升级需要转储/重新加载数据库或使用pg_upgrade应用程序。我们还建议您阅读您计划升级到的主要版本的升级部分。您可以从一个主要版本升级到另一个&#xf…...

应用层之网络应用模型,HTTP/HTTPS协议

应用层是网络协议栈的最顶层&#xff0c;直接为应用程序提供通信服务&#xff0c;定义了不同主机间应用进程交互的规则&#xff0c;包括报文类型、语法、语义及通信时序 一、网络应用模型 1.定义及特点 模型定义核心特点典型应用场景C/S客户端向服务器发起请求&#xff0c;服…...

(七)Spring Boot学习——Redis使用

有部分内容是常用的&#xff0c;为了避免每次都查询数据库&#xff0c;将部分数据存入Redis。 一、 下载并安装 Redis Windows 版的 Redis 官方已不再维护&#xff0c;你可以使用 微软提供的 Redis for Windows 版本 或者 使用 WSL&#xff08;Windows Subsystem for Linux&a…...

11 | 给 Gin 服务器添加中间件

提示&#xff1a; 所有体系课见专栏&#xff1a;Go 项目开发极速入门实战课&#xff1b;欢迎加入 云原生 AI 实战 星球&#xff0c;12 高质量体系课、20 高质量实战项目助你在 AI 时代建立技术竞争力&#xff08;聚焦于 Go、云原生、AI Infra&#xff09;&#xff1b;本节课最终…...