第J2周:ResNet50V2算法实现01(Tensorflow硬编码版)
- 🍨 本文为🔗365天深度学习训练营 中的学习记录博客
- 🍖 原作者:K同学啊
目标
使用tensorflow实现ResNetV50V2的网络结构。本次根据第一层的细节手动硬编码,没有任何的优化,只为了更好的理解细节。
目录结构:
网络结构图见最后
具体实现
(一)环境
语言环境: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
__________________________________________________________________________________________________
(三)总结
结果不是很理想,网络结构应该还有瑕疵。后续优化代码解决拟合问题。
resnet50v2的详细网络结构:
相关文章:
第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,进度条可视化,支持随机循环/多次播放。 深度自定义࿱…...
C#生产型企业ERP系统管理软件PCB行业ERP进销存MRP管理系统BOM管理
背景 本软件为为苏州某生产型电子科技企业开发的ERP管理软件。 功能说明 希哲管理系统v1.0是一款在流览器上使用的企业管理软件,使用上与客户端版的优势是: 1.安装更新部署方便,只需服务器部署了软件,其它客户端的用户无需安装&am…...
【Linux内核系列】:文件系统
🔥 本文专栏:Linux 🌸作者主页:努力努力再努力wz ★★★ 本文前置知识: 文件系统初识 那么在我们此前关于文件的学习中,我们学习的都是进程与打开的文件之间的关系,以及打开的文件如何进行管理…...
工程化与框架系列(35)--前端微服务架构实践
前端微服务架构实践 🏗️ 引言 随着前端应用规模的不断扩大,微服务架构在前端领域的应用越来越广泛。本文将深入探讨前端微服务架构的实现方案、最佳实践和相关工具。 微服务架构概述 前端微服务架构主要包括以下方面: 应用拆分…...
多条件下的免杀webshell
前言 在做webshell免杀的时候,很多情况下都是对system,eval等命令执行函数进行匹配,如果说把变量当做一个函数来使用的话,那是不是可以bypass了呢?这今天刚好看见有一个回调函数有这样的功能,而且也不会报毒ÿ…...
【算法】动态规划
⭐️个人主页:小羊 ⭐️所属专栏: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࿱…...
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。「BiAi⌉ (上取整) 次之后, 再升级该技能将不会改变攻击力。 现在小蓝可以…...
【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 开发领域,尤其是在 Spring Boot 生态系统中,空指针异常(NPEs)始终是一个顽固的挑战。这些运行时错误可能导致应用程序崩溃、数据不一致以及糟糕的用户体验。为了应对这一问题,Java 社区开发了各种空安全机制&a…...
SQLark 实战 | 如何从Excel、csv、txt等外部文件进行数据导入
数据导入导出是应用开发者在平时开发中最常用的操作之一,SQLark 里提供了方便的图形化界面来完成导入导出。本文先和大家分享如何从 Excel、csv、txt 等外部文件导入数据到数据库表中。 👉 前往 SQLark 官网:www.sqlark.com 下载全功能免费版…...
MATLAB中envelope函数使用
目录 说明 示例 chirp 的解析包络 使用滤波器计算多通道信号的解析包络 录音信号的移动 RMS 包络 语音信号的峰值包络 不对称序列的包络 envelope函数的功能是提取信号的包络。 语法 [yupper,ylower] envelope(x) [yupper,ylower] envelope(x,fl,analytic) [yupper,…...
ES搭建详细指南+常见错误解决方法
Elasticsearch(ES)是一款开源的、分布式的、RESTful风格的搜索和数据分析引擎。它用于全文搜索、结构化搜索、分析等场景。以下是Elasticsearch的搭建步骤以及处理常见错误的方法。 Elasticsearch搭建步骤: 1.环境准备: 确保你的…...
Unity 封装一个依赖于MonoBehaviour的计时器(上) 基本功能
灵感来自下面这本书的协程部分,因此我就自己尝试写了一个 我的新书Unity3D游戏开发(第3版) | 雨松MOMO程序研究院 如果你不知道什么是协程:unity保姆级教程之协同程序_unity协同-CSDN博客 一句话概括:协程就是单线程的异步操作,其作用于Unity的主线程 1…...
PostgreSQL数据库版本支持策略
PostgreSQL数据库版本支持策略 主要版本会进行复杂的更改,因此无法以向后兼容的方式维护数据目录的内容。重大升级需要转储/重新加载数据库或使用pg_upgrade应用程序。我们还建议您阅读您计划升级到的主要版本的升级部分。您可以从一个主要版本升级到另一个…...
应用层之网络应用模型,HTTP/HTTPS协议
应用层是网络协议栈的最顶层,直接为应用程序提供通信服务,定义了不同主机间应用进程交互的规则,包括报文类型、语法、语义及通信时序 一、网络应用模型 1.定义及特点 模型定义核心特点典型应用场景C/S客户端向服务器发起请求,服…...
(七)Spring Boot学习——Redis使用
有部分内容是常用的,为了避免每次都查询数据库,将部分数据存入Redis。 一、 下载并安装 Redis Windows 版的 Redis 官方已不再维护,你可以使用 微软提供的 Redis for Windows 版本 或者 使用 WSL(Windows Subsystem for Linux&a…...
11 | 给 Gin 服务器添加中间件
提示: 所有体系课见专栏:Go 项目开发极速入门实战课;欢迎加入 云原生 AI 实战 星球,12 高质量体系课、20 高质量实战项目助你在 AI 时代建立技术竞争力(聚焦于 Go、云原生、AI Infra);本节课最终…...