tensorflow案例3--运动鞋识别(学习tensorflow动态加载学习率、如何设置早停等方法)

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

前言

  • 这个案例还是以学习API为主,学习了tensorflow如何动态加载学习率、如何设置早停等方法
  • 这个案例主要学习为主,由于模型结构比较简单,故在验证集上效果并不是很好;
  • 以后本人会每周至少更新一篇深度学习与机器学习的案例,明天或后天更新机器学习;
  • 欢迎收藏+关注,本人会持续更新。

文章目录

  • 1、知识积累
  • 2、案例演示
    • 1、数据处理
      • 1、导入库
      • 2、加载数据类别
      • 3、加载训练集和验证集数据
      • 4、展示部分数据图片
    • 2、内存优化
    • 3、搭建CNN网络模型
    • 3、模型训练
      • 1、设置超参数(包含动态设置学习率)
      • 2、模型训练
    • 4、结果展示

1、知识积累

👿 图片加载

使用image_dataset_from_directory方法将磁盘中的数据加载到tf.data.Dataset

  • tf.keras.preprocessing.image_dataset_from_directory():是 TensorFlow 的 Keras 模块中的一个函数,用于从目录中创建一个图像数据集(dataset)。这个函数可以以更方便的方式加载图像数据,用于训练和评估神经网络模型。

✌️ 测试集和验证集的关系

  1. 验证集并没有参与训练过程梯度下降过程的,狭义上来讲是没有参与模型的参数训练更新的。
  2. 但是广义上来讲,验证集存在的意义确实参与了一个“人工调参”的过程,我们根据每一个epoch训练之后模型在valid data上的表现来决定是否需要训练进行early stop,或者根据这个过程模型的性能变化来调整模型的超参数,如学习率,batch_size等等。
  3. 因此,我们也可以认为,验证集也参与了训练,但是并没有使得模型去overfit验证集

动态学习率的加载

ExponentialDecay函数:

tf.keras.optimizers.schedules.ExponentialDecay是 TensorFlow 中的一个学习率衰减策略,用于在训练神经网络时动态地降低学习率。学习率衰减是一种常用的技巧,可以帮助优化算法更有效地收敛到全局最小值,从而提高模型的性能。

🔎 主要参数:

  • **initial_learning_rate(初始学习率):**初始学习率大小。
  • **decay_steps(衰减步数):**学习率衰减的步数。在经过 decay_steps 步后,学习率将按照指数函数衰减。例如,如果 decay_steps 设置为 10,则每10步衰减一次。
  • **decay_rate(衰减率):**学习率的衰减率。它决定了学习率如何衰减。通常,取值在 0 到 1 之间。
  • **staircase(阶梯式衰减):**一个布尔值,控制学习率的衰减方式。如果设置为 True,则学习率在每个 decay_steps 步之后直接减小,形成阶梯状下降。如果设置为 False,则学习率将连续衰减。

🍃 学习率大与学习率小的优缺点分析:

学习率大

  • 优点:

    • 1、加快学习速率。
    • 2、有助于跳出局部最优值。
  • 缺点:

    • 1、导致模型训练不收敛。
    • 2、单单使用大学习率容易导致模型不精确。

学习率小

  • 优点:

    • 1、有助于模型收敛、模型细化。
    • 2、提高模型精度。
  • 缺点:

    • 1、很难跳出局部最优值。
    • 2、收敛缓慢。

🚙 早停与保存最佳模型参数

EarlyStopping()参数说明

  • monitor: 被监测的数据。

  • min_delta: 在被监测的数据中被认为是提升的最小变化, 例如,小于 min_delta 的绝对变化会被认为没有提升。

  • patience: 没有进步的训练轮数,在这之后训练就会被停止。

  • verbose: 详细信息模式。

  • mode: {auto, min, max} 其中之一。 在 min 模式中, 当被监测的数据停止下降,训练就会停止;在 max 模式中,当被监测的数据停止上升,训练就会停止;在 auto 模式中,方向会自动从被监测的数据的名字中判断出来。

  • baseline: 要监控的数量的基准值。 如果模型没有显示基准的改善,训练将停止。

  • estore_best_weights: 是否从具有监测数量的最佳值的时期恢复模型权重。 如果为 False,则使用在训练的最后一步获得的模型权重。

# 设置早停
earlystopper = EarlyStopping(monitor='val_accuracy', 
                             min_delta=0.001,
                             patience=20, 
                             verbose=1)

这段代码的以上是训练patience=20轮,但是val_accuracy提升小于0.001,则提前停止。

2、案例演示

1、数据处理

1、导入库

import tensorflow as tf 
from tensorflow.keras import datasets, models, layers
import numpy as np 

gpus = tf.config.list_physical_devices("GPU")

if gpus:
    gpu0 = gpus[0]  # 如果有多块gpu,选择第一块
    tf.config.experimental.set_memory_growth(gpu0, True)
    tf.config.set_visible_devices([gpu0], "GPU")
    
gpus

输出:

[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]

2、加载数据类别

文件加中数据,分为训练集和测试集两个文件,每一个文件都有不同类别文件夹,文件夹以不同鞋为分类,即不同文件夹就是不同类别。

# 任务:遍历文件夹,展示类别名称
import os, PIL, pathlib

# 数据目录
data_dir = './data/train/'
data_dir = pathlib.Path(data_dir)  # 转换成pathlib对象

# 遍历
classnames = [str(path).split('/')[0] for path in os.listdir(data_dir)]
classnames  # 输出类别名称

输出:

['adidas', 'nike']

3、加载训练集和验证集数据

# 任务:加载训练集和验证集数据

batch_size = 32
img_width = 224
img_height = 224

train_ds = tf.keras.preprocessing.image_dataset_from_directory(
    './data/train',
    batch_size=batch_size,   # 默认也是32
    seed=42,
    image_size=(img_height, img_width)
)

val_ds = tf.keras.preprocessing.image_dataset_from_directory(
    './data/test/',
    batch_size=batch_size,
    seed=42,
    image_size=(img_height, img_width)
)

# 输出数据格式
for x, y in train_ds:
    print('数据信息(每一批):',x.shape)
    print('一批数据类别编码:',y)
    break
Found 502 files belonging to 2 classes.
Found 76 files belonging to 2 classes.
数据信息(每一批): (32, 224, 224, 3)
一批数据类别编码: tf.Tensor([0 1 0 1 1 0 0 0 1 1 0 1 0 1 0 0 0 0 0 1 1 1 1 0 0 1 0 1 1 0 0 0], shape=(32,), dtype=int32)

4、展示部分数据图片

# 任务:展示训练集随机20个图像
import matplotlib.pyplot as plt 

plt.figure(figsize=(20, 15))
for images, labels in train_ds.take(1):
    for i in range(20):
        plt.subplot(5, 10, i + 1)
        
        plt.imshow(images[i].numpy().astype('uint8'))
        plt.title(classnames[labels[i]])
        
        plt.axis('off')
        
plt.show()


在这里插入图片描述

2、内存优化

from tensorflow.data.experimental import AUTOTUNE

AUTOTUNE = tf.data.experimental.AUTOTUNE

train_ds = train_ds.cache().shuffle(1000).prefetch(buffer_size=AUTOTUNE)
vals_ds = val_ds.cache().prefetch(buffer_size=AUTOTUNE)

3、搭建CNN网络模型

三层卷积,三层池化,两层连接层

创建模型的两种方法:

  1. 首先创建models.Sequential(),然后调用add函数添加;
  2. 直接在[]中添加所有层,本人一般用这种情况。
model = models.Sequential([
    # 压缩像素,[0,255]---> [0,1]
    layers.experimental.preprocessing.Rescaling(1./255, input_shape=(img_height, img_width, 3)),
    
    # 第一层要输入维度
    layers.Conv2D(16, (3, 3), activation='relu', input_shape=(img_height, img_width, 3)),
    layers.AveragePooling2D((2,2)),
    
    layers.Conv2D(32, (3, 3), activation='relu'),
    layers.AveragePooling2D((2,2)),
    layers.Dropout(0.3),
    
    layers.Conv2D(32, (3, 3), activation='relu'),
    layers.AveragePooling2D((2,2)),
    layers.Dropout(0.3),
    
    layers.Flatten(),
    layers.Dense(128, activation='relu'),
    layers.Dense(len(classnames))
])

model.summary()
Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 rescaling (Rescaling)       (None, 224, 224, 3)       0         
                                                                 
 conv2d (Conv2D)             (None, 222, 222, 16)      448       
                                                                 
 average_pooling2d (AverageP  (None, 111, 111, 16)     0         
 ooling2D)                                                       
                                                                 
 conv2d_1 (Conv2D)           (None, 109, 109, 32)      4640      
                                                                 
 average_pooling2d_1 (Averag  (None, 54, 54, 32)       0         
 ePooling2D)                                                     
                                                                 
 dropout (Dropout)           (None, 54, 54, 32)        0         
                                                                 
 conv2d_2 (Conv2D)           (None, 52, 52, 32)        9248      
                                                                 
 average_pooling2d_2 (Averag  (None, 26, 26, 32)       0         
 ePooling2D)                                                     
                                                                 
 dropout_1 (Dropout)         (None, 26, 26, 32)        0         
                                                                 
 flatten (Flatten)           (None, 21632)             0         
                                                                 
 dense (Dense)               (None, 128)               2769024   
                                                                 
 dense_1 (Dense)             (None, 2)                 258       
                                                                 
=================================================================
Total params: 2,783,618
Trainable params: 2,783,618
Non-trainable params: 0
_________________________________________________________________

3、模型训练

1、设置超参数(包含动态设置学习率)

# 设置初始化学习率
learning_rate = 0.001

# 设置动态学习率
lr_schedule = tf.keras.optimizers.schedules.ExponentialDecay(
    learning_rate,
    decay_steps=10,
    decay_rate=0.92,
    staircase=True
)

# 创建优化器
optimizer = tf.keras.optimizers.Adam(learning_rate=lr_schedule)

# 设置超参数
model.compile(
    optimizer=optimizer,
    loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
    metrics=['accuracy']
)

2、模型训练

from tensorflow.keras.callbacks import ModelCheckpoint, EarlyStopping

epochs = 50

# 保存最佳模型参数
checkpointer = ModelCheckpoint('best_model.h5',
                                monitor='val_accuracy',
                                verbose=1,
                                save_best_only=True,
                                save_weights_only=True)

# 设置早停
earlystopper = EarlyStopping(monitor='val_accuracy', 
                             min_delta=0.001,
                             patience=20, 
                             verbose=1)


epochs = 50

# 保存最佳模型参数
checkpointer = ModelCheckpoint('best_model.h5',
                                monitor='val_accuracy',
                                verbose=1,
                                save_best_only=True,
                                save_weights_only=True)

# 模型训练
history = model.fit(train_ds,
                    validation_data=val_ds,
                    epochs=epochs,
                    callbacks=[checkpointer, earlystopper])
14/16 [=========================>....] - ETA: 0s - loss: 0.7837 - accuracy: 0.5023
Epoch 1: val_accuracy improved from -inf to 0.53947, saving model to best_model.h5
16/16 [==============================] - 4s 35ms/step - loss: 0.7714 - accuracy: 0.5000 - val_loss: 0.6803 - val_accuracy: 0.5395
Epoch 2/50
12/16 [=====================>........] - ETA: 0s - loss: 0.6765 - accuracy: 0.5642
Epoch 2: val_accuracy improved from 0.53947 to 0.61842, saving model to best_model.h5
16/16 [==============================] - 0s 15ms/step - loss: 0.6783 - accuracy: 0.5677 - val_loss: 0.6532 - val_accuracy: 0.6184
Epoch 3/50
12/16 [=====================>........] - ETA: 0s - loss: 0.6705 - accuracy: 0.5775
Epoch 3: val_accuracy improved from 0.61842 to 0.65789, saving model to best_model.h5
16/16 [==============================] - 0s 15ms/step - loss: 0.6589 - accuracy: 0.6016 - val_loss: 0.6367 - val_accuracy: 0.6579
Epoch 4/50
12/16 [=====================>........] - ETA: 0s - loss: 0.6296 - accuracy: 0.6283
Epoch 4: val_accuracy did not improve from 0.65789
16/16 [==============================] - 0s 13ms/step - loss: 0.6453 - accuracy: 0.6116 - val_loss: 0.6192 - val_accuracy: 0.6447
Epoch 5/50
16/16 [==============================] - ETA: 0s - loss: 0.6124 - accuracy: 0.6594
Epoch 5: val_accuracy did not improve from 0.65789
16/16 [==============================] - 0s 13ms/step - loss: 0.6124 - accuracy: 0.6594 - val_loss: 0.6184 - val_accuracy: 0.6579
Epoch 6/50
11/16 [===================>..........] - ETA: 0s - loss: 0.5986 - accuracy: 0.6790
Epoch 6: val_accuracy improved from 0.65789 to 0.67105, saving model to best_model.h5
16/16 [==============================] - 0s 15ms/step - loss: 0.5803 - accuracy: 0.7092 - val_loss: 0.5611 - val_accuracy: 0.6711
Epoch 7/50
12/16 [=====================>........] - ETA: 0s - loss: 0.5406 - accuracy: 0.7139
Epoch 7: val_accuracy improved from 0.67105 to 0.73684, saving model to best_model.h5
16/16 [==============================] - 0s 15ms/step - loss: 0.5405 - accuracy: 0.7351 - val_loss: 0.5235 - val_accuracy: 0.7368
Epoch 8/50
11/16 [===================>..........] - ETA: 0s - loss: 0.5141 - accuracy: 0.7727
Epoch 8: val_accuracy did not improve from 0.73684
16/16 [==============================] - 0s 13ms/step - loss: 0.5055 - accuracy: 0.7729 - val_loss: 0.5382 - val_accuracy: 0.7368
Epoch 9/50
12/16 [=====================>........] - ETA: 0s - loss: 0.5257 - accuracy: 0.7166
Epoch 9: val_accuracy improved from 0.73684 to 0.77632, saving model to best_model.h5
16/16 [==============================] - 0s 15ms/step - loss: 0.5087 - accuracy: 0.7470 - val_loss: 0.5095 - val_accuracy: 0.7763
Epoch 10/50
12/16 [=====================>........] - ETA: 0s - loss: 0.4528 - accuracy: 0.8128
Epoch 10: val_accuracy did not improve from 0.77632
16/16 [==============================] - 0s 13ms/step - loss: 0.4459 - accuracy: 0.8187 - val_loss: 0.5135 - val_accuracy: 0.7500
Epoch 11/50
16/16 [==============================] - ETA: 0s - loss: 0.4237 - accuracy: 0.8147
Epoch 11: val_accuracy did not improve from 0.77632
16/16 [==============================] - 0s 13ms/step - loss: 0.4237 - accuracy: 0.8147 - val_loss: 0.4899 - val_accuracy: 0.7632
Epoch 12/50
11/16 [===================>..........] - ETA: 0s - loss: 0.4103 - accuracy: 0.8125
Epoch 12: val_accuracy did not improve from 0.77632
16/16 [==============================] - 0s 13ms/step - loss: 0.4010 - accuracy: 0.8127 - val_loss: 0.4718 - val_accuracy: 0.7500
Epoch 13/50
11/16 [===================>..........] - ETA: 0s - loss: 0.3687 - accuracy: 0.8352
Epoch 13: val_accuracy improved from 0.77632 to 0.78947, saving model to best_model.h5
16/16 [==============================] - 0s 15ms/step - loss: 0.3754 - accuracy: 0.8207 - val_loss: 0.4818 - val_accuracy: 0.7895
Epoch 14/50
12/16 [=====================>........] - ETA: 0s - loss: 0.3643 - accuracy: 0.8503
Epoch 14: val_accuracy did not improve from 0.78947
16/16 [==============================] - 0s 13ms/step - loss: 0.3607 - accuracy: 0.8506 - val_loss: 0.4916 - val_accuracy: 0.7500
Epoch 15/50
12/16 [=====================>........] - ETA: 0s - loss: 0.3609 - accuracy: 0.8369
Epoch 15: val_accuracy did not improve from 0.78947
16/16 [==============================] - 0s 13ms/step - loss: 0.3578 - accuracy: 0.8426 - val_loss: 0.4996 - val_accuracy: 0.7237
Epoch 16/50
12/16 [=====================>........] - ETA: 0s - loss: 0.3303 - accuracy: 0.8583
Epoch 16: val_accuracy did not improve from 0.78947
16/16 [==============================] - 0s 13ms/step - loss: 0.3420 - accuracy: 0.8526 - val_loss: 0.4879 - val_accuracy: 0.7763
Epoch 17/50
12/16 [=====================>........] - ETA: 0s - loss: 0.3240 - accuracy: 0.8690
Epoch 17: val_accuracy did not improve from 0.78947
16/16 [==============================] - 0s 13ms/step - loss: 0.3270 - accuracy: 0.8705 - val_loss: 0.4793 - val_accuracy: 0.7763
Epoch 18/50
12/16 [=====================>........] - ETA: 0s - loss: 0.2970 - accuracy: 0.8743
Epoch 18: val_accuracy did not improve from 0.78947
16/16 [==============================] - 0s 13ms/step - loss: 0.3069 - accuracy: 0.8725 - val_loss: 0.4800 - val_accuracy: 0.7895
Epoch 19/50
12/16 [=====================>........] - ETA: 0s - loss: 0.2982 - accuracy: 0.8717
Epoch 19: val_accuracy did not improve from 0.78947
16/16 [==============================] - 0s 13ms/step - loss: 0.2969 - accuracy: 0.8745 - val_loss: 0.4766 - val_accuracy: 0.7763
Epoch 20/50
16/16 [==============================] - ETA: 0s - loss: 0.2915 - accuracy: 0.8865
Epoch 20: val_accuracy did not improve from 0.78947
16/16 [==============================] - 0s 13ms/step - loss: 0.2915 - accuracy: 0.8865 - val_loss: 0.4894 - val_accuracy: 0.7763
Epoch 21/50
11/16 [===================>..........] - ETA: 0s - loss: 0.2953 - accuracy: 0.8665
Epoch 21: val_accuracy did not improve from 0.78947
16/16 [==============================] - 0s 13ms/step - loss: 0.2901 - accuracy: 0.8725 - val_loss: 0.5096 - val_accuracy: 0.7500
Epoch 22/50
12/16 [=====================>........] - ETA: 0s - loss: 0.2775 - accuracy: 0.8877
Epoch 22: val_accuracy did not improve from 0.78947
16/16 [==============================] - 0s 13ms/step - loss: 0.2808 - accuracy: 0.8865 - val_loss: 0.4826 - val_accuracy: 0.7763
Epoch 23/50
12/16 [=====================>........] - ETA: 0s - loss: 0.2748 - accuracy: 0.8797
Epoch 23: val_accuracy did not improve from 0.78947
16/16 [==============================] - 0s 13ms/step - loss: 0.2785 - accuracy: 0.8805 - val_loss: 0.5012 - val_accuracy: 0.7500
Epoch 24/50
12/16 [=====================>........] - ETA: 0s - loss: 0.2585 - accuracy: 0.9118
Epoch 24: val_accuracy did not improve from 0.78947
16/16 [==============================] - 0s 13ms/step - loss: 0.2636 - accuracy: 0.9084 - val_loss: 0.4887 - val_accuracy: 0.7763
Epoch 25/50
12/16 [=====================>........] - ETA: 0s - loss: 0.2694 - accuracy: 0.9011
Epoch 25: val_accuracy did not improve from 0.78947
16/16 [==============================] - 0s 13ms/step - loss: 0.2685 - accuracy: 0.9044 - val_loss: 0.4841 - val_accuracy: 0.7632
Epoch 26/50
16/16 [==============================] - ETA: 0s - loss: 0.2588 - accuracy: 0.9004
Epoch 26: val_accuracy did not improve from 0.78947
16/16 [==============================] - 0s 14ms/step - loss: 0.2588 - accuracy: 0.9004 - val_loss: 0.4855 - val_accuracy: 0.7632
Epoch 27/50
12/16 [=====================>........] - ETA: 0s - loss: 0.2661 - accuracy: 0.9037
Epoch 27: val_accuracy did not improve from 0.78947
16/16 [==============================] - 0s 13ms/step - loss: 0.2521 - accuracy: 0.9084 - val_loss: 0.4844 - val_accuracy: 0.7632
Epoch 28/50
12/16 [=====================>........] - ETA: 0s - loss: 0.2492 - accuracy: 0.9171
Epoch 28: val_accuracy did not improve from 0.78947
16/16 [==============================] - 0s 13ms/step - loss: 0.2457 - accuracy: 0.9183 - val_loss: 0.4820 - val_accuracy: 0.7632
Epoch 29/50
12/16 [=====================>........] - ETA: 0s - loss: 0.2669 - accuracy: 0.8877
Epoch 29: val_accuracy did not improve from 0.78947
16/16 [==============================] - 0s 13ms/step - loss: 0.2591 - accuracy: 0.8964 - val_loss: 0.4844 - val_accuracy: 0.7632
Epoch 30/50
12/16 [=====================>........] - ETA: 0s - loss: 0.2399 - accuracy: 0.9064
Epoch 30: val_accuracy did not improve from 0.78947
16/16 [==============================] - 0s 13ms/step - loss: 0.2501 - accuracy: 0.9024 - val_loss: 0.4872 - val_accuracy: 0.7632
Epoch 31/50
12/16 [=====================>........] - ETA: 0s - loss: 0.2410 - accuracy: 0.9251
Epoch 31: val_accuracy did not improve from 0.78947
16/16 [==============================] - 0s 13ms/step - loss: 0.2513 - accuracy: 0.9143 - val_loss: 0.4847 - val_accuracy: 0.7632
Epoch 32/50
12/16 [=====================>........] - ETA: 0s - loss: 0.2528 - accuracy: 0.9091
Epoch 32: val_accuracy did not improve from 0.78947
16/16 [==============================] - 0s 13ms/step - loss: 0.2504 - accuracy: 0.9104 - val_loss: 0.4911 - val_accuracy: 0.7632
Epoch 33/50
11/16 [===================>..........] - ETA: 0s - loss: 0.2489 - accuracy: 0.9091
Epoch 33: val_accuracy did not improve from 0.78947
16/16 [==============================] - 0s 13ms/step - loss: 0.2525 - accuracy: 0.9104 - val_loss: 0.4852 - val_accuracy: 0.7632
Epoch 33: early stopping

4、结果展示

acc = history.history['accuracy']
val_acc = history.history['val_accuracy']

loss = history.history['loss']
val_loss = history.history['val_loss']

epochs_range = range(len(loss))

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()


在这里插入图片描述

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

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

相关文章

SpringBoot 集成RabbitMQ 实现钉钉日报定时发送功能

文章目录 一、RabbitMq 下载安装二、开发步骤:1.MAVEN 配置2. RabbitMqConfig 配置3. RabbitMqUtil 工具类4. DailyDelaySendConsumer 消费者监听5. 测试延迟发送 一、RabbitMq 下载安装 官网:https://www.rabbitmq.com/docs 二、开发步骤:…

Python 实现彩票抽奖系统详解(双色球)

目录 一、系统功能概述 二、代码实现详解 (一)自选功能实现(ziXuanCaiPiao函数) (二)机选功能实现(autoChoiceCaiPiao函数) (三)彩票展示功能实现&#x…

如何解决 IDEA 的 pom.xml 文件中,依赖警告问题

原因 在升级高版本的Idea后,我的是(2024.2)版本。Idea默认引入了插件 Package Checker 插件,用于检查 Maven 的 pom.xml 引入的 jar 包是否有漏洞风险。如果有漏洞风险则直接在引入的 pom.xml 下画黄线警告。 虽然不是错误&…

Tkinter -- python GUI学习与使用

前言 python GUI 目前pythonGUI有很多,哪一个最好? 先说说我选择的思路,我的目的是开发一个易用的软件,最重要的是稳定,并且碰到问题能够解决,因此,我的目标很明确,有比较大的用户群…

杂项笔记

1 这个好像如果如果分配空间就会执行 这个扩容好像会进行拷贝 2 3 4 没懂 5

【数据结构与算法】走进数据结构的“时间胶囊”——栈

大家好,我是小卡皮巴拉 文章目录 目录 引言 一.栈的基本概念 1.1 定义 1.2 特性 1.3 基本操作 二.栈的实现方式 2.1 顺序栈 2.2 链栈 三.顺序栈的实现 定义顺序栈的结构 初始化 入栈 检查栈是否为空 出栈 销毁 四.链栈的实现 定义链栈的结构 初始…

未来汽车驾驶还会有趣吗?车辆动力学系统简史

未来汽车驾驶还会有趣吗?车辆动力学系统简史 本篇文章来源:Schmidt, F., Knig, L. (2020). Will driving still be fun in the future? Vehicle dynamics systems through the ages. In: Pfeffer, P. (eds) 10th International Munich Chassis Symposiu…

数字图像处理的概念(一)

一 何谓数字图像处理 1 图像的概念 图像是对客观存在的物体的一种相似性的、生动的写真或描述。 2 图像的类别 可见光成像和不可见光成像 单波段、多波段和超波段图像 伽马射线成像 主要用途包括核 医学和天文观测 等 。 核医学 a)同位素注射 骨骼扫描图像 b)正电子放射( …

【Docker】安装、镜像、容器

什么是Docker? Docker:是基于Go语言实现的开源项目。 Docker 是一个用于开发、交付和运行应用程序的开放平台。它允许开发人员将应用程序及其依赖包打包到一个可移植的容器中, 然后在任何流行的 Linux 机器上运行。Docker 容器是完全隔离的&…

Openpyxl--学习记录

1.工作表的基本操作 1.1 工作表的新建打开与保存 1.1.1 创建工作簿 from openpyxl import Workbook from pathlib import Pathfile_path Path.home() / "Desktop" / "123.xlsx"# 1.创建工作簿 wb Workbook() # 2.访问默认工作簿 ws wb.active # 3.填充…

pytorh学习笔记——cifar10(六)MobileNet V1网络结构

基础知识储备: 一、深度可分离卷积(Depthwise Separable Convolution) MobileNet的核心是深度可分离卷积(Depthwise Separable Convolution),深度可分离卷积是卷积神经网络(CNN&#xf…

低代码开发详解与行业应用指南

低代码开发简化软件开发,助力企业数字化转型。ZohoCreator应用于零售、制造、教育、IT、医疗、房地产等行业,提升效率、降低成本。灵活定价,支持免费试用,助力企业快速实现数字化。 一、低代码开发是什么? 低代码开发…

CSS3 动画相关属性实例大全(三)(columns、filter、flex、flex-basis 、flex-grow、flex-shrink属性)

CSS3 动画相关属性实例大全(三) (columns、filter、flex、flex-basis 、flex-grow、flex-shrink属性) 本文目录: 一、columns属性(设置元素的列宽和列数) 二、filter属性(调整图像、背景和边…

打造充电场站:场地选择与合规运营详解

建设一座充电站需要六步流程:准备工作 → 备案 → 土地审核 → 规划审核 → 电力申请 → 验收确认 一、准备工作 在确定建设前,要考察待选的场地,例如空地、停车场等,与场地所有方签订充电站建设合作协议。根据场地和车流量等实际…

Docker 部署 EMQX 一分钟极速部署

部署 EMQX ( Docker ) [Step 1] : 拉取 EMQX 镜像 docker pull emqx/emqx:latest[Step 2] : 创建目录 ➡️ 创建容器 ➡️ 拷贝文件 ➡️ 授权文件 ➡️ 删除容器 # 创建目录 mkdir -p /data/emqx/{etc,data,log}# 创建容器 docker run -d --name emqx -p 1883:1883 -p 1808…

H7-TOOL的LUA小程序教程第15期:电压,电流,NTC热敏电阻以及4-20mA输入(2024-10-21,已经发布)

LUA脚本的好处是用户可以根据自己注册的一批API(当前TOOL已经提供了几百个函数供大家使用),实现各种小程序,不再限制Flash里面已经下载的程序,就跟手机安装APP差不多,所以在H7-TOOL里面被广泛使用&#xff…

在矩池云使用智谱情感语音模型GLM-4-Voice,详细指南

GLM-4-Voice 是智谱 AI 推出的端到端语音模型。GLM-4-Voice 能够直接理解和生成中英文语音,进行实时语音对话,并且能够遵循用户的指令要求改变语音的情感、语调、语速、方言等属性。 本文将详细介绍,如何在GPU算力租赁平台矩池云上快速复现、…

MongoDB安装配置及配置和启动服务

MongoDB 安装配置 附:MongoDB官网下载地址: https://www.mongodb.com/download-center/community 注: 官网可以下载最新版的MongoDB安装包,有MSI安装版和ZIP安装版。我们课堂上使用4.4.4的ZIP安装版。安装版参考博客&#xff1…

使用rust实现类似C#中的Convert数据转换类

// 编写一个模块&#xff08;好比是C#的一个类&#xff09; pub mod Convert {// 定义函数&#xff08;好比C#中的方法&#xff09;pub fn ToInt32(s:&str) -> i32 {s.parse::<i32>().unwrap()}pub fn ToInt64(s:&str) -> Result<i64,std::num::ParseIn…

Maven入门到实践:从安装到项目构建与IDEA集成

目录 1. Maven的概念 1.1 什么是Maven 1.2 什么是依赖管理 1.3 什么是项目构建 1.4 Maven的应用场景 1.5 为什么使用Maven 1.6 Maven模型 2.初识Maven 2.1 Maven安装 2.1.1 安装准备 2.1.2 Maven安装目录分析 2.1.3 Maven的环境变量 2.2 Maven的第一个项目 2.2.1…