Keras深度学习框架实战(2):估计模型训练所需的样本量

1、模型训练样本量评估概述

1.1 样本量评估的意义

预估模型需要的样本量对于机器学习项目的成功至关重要,以下是几个主要原因:

  1. 防止过拟合与欠拟合

    • 过拟合:当模型在训练数据上表现极好,但在未见过的测试数据上表现糟糕时,就发生了过拟合。这通常是因为模型过于复杂,而训练数据不足以支持其学习数据的真实模式。通过预估足够的样本量,我们可以减少过拟合的风险。
    • 欠拟合:与过拟合相反,欠拟合是模型未能捕捉到数据中的关键模式。这可能是因为模型过于简单或训练数据不足。预估样本量有助于确保模型有足够的数据来学习数据的复杂模式。
  2. 资源分配

    • 预估样本量有助于项目团队合理分配资源。如果预计需要大量数据,团队可以提前开始数据收集工作,或考虑使用更高效的数据收集方法。此外,了解所需样本量还可以帮助团队估算项目的时间和成本。
  3. 实验设计

    • 在设计实验或研究时,预估样本量有助于确定实验的规模。这有助于确保实验具有足够的统计功效,以检测感兴趣的效应或差异。
  4. 模型性能评估

    • 有了足够的样本量,我们可以更准确地评估模型的性能。通过将模型应用于独立的测试集,我们可以评估模型在未见过的数据上的表现,并据此调整模型参数或结构。
  5. 可解释性与泛化能力

    • 充足的样本量有助于模型学习数据的普遍规律,而不仅仅是训练数据的特定模式。这使得模型更有可能在类似但不同的数据集上表现良好,即具有更强的泛化能力。此外,充足的样本量还可以提高模型的可解释性,使结果更易于理解和解释给非技术利益相关者。
  6. 合规性与伦理

    • 在某些领域,如医疗、金融和法律等,数据收集和使用受到严格的法规和伦理准则的约束。预估样本量有助于确保项目符合这些要求,避免潜在的合规性问题和伦理争议。
  7. 提高项目成功率

    • 通过预估模型需要的样本量,项目团队可以更好地规划和管理项目资源。这有助于提高项目的成功率和效率,减少因资源不足或分配不当而导致的延误和失败。

预估模型需要的样本量是机器学习项目成功的关键一步。通过仔细考虑和计算所需的样本量,我们可以确保模型具有足够的数据来学习数据的真实模式,并减少过拟合和欠拟合的风险。同时,这还有助于项目团队更好地规划和管理资源,提高项目的成功率和效率。

1.2 样本量评估的一般方法

在许多现实世界的场景中,用于训练深度学习模型的图像数据量是有限的。特别是在医疗成像领域,数据集的创建成本高昂。当面临一个新的问题时,通常首先出现的问题是:“我们需要多少张图像来训练一个足够好的机器学习模型?”

在大多数情况下,只有一小部分样本可用,我们可以利用这些样本来模拟训练数据大小与模型性能之间的关系。这样的模型可以用于估计达到所需模型性能所需的最优图像数量。

样本量确定方法

  1. 平衡子采样方案

    • 在这个例子中,使用平衡子采样方案来确定模型的最佳样本量。该方案通过选择由Y个图像组成的随机子样本,并使用该子样本训练模型来完成。
    • 随后,在一个独立的测试集上对模型进行评估。
    • 该过程对每个子样本重复N次,并进行替换,以构建观测性能的平均值和置信区间。
  2. 样本量与模型性能的关系建模

    • 利用现有的一小部分样本,我们可以构建一个模型来模拟训练数据大小与模型性能之间的关系。
    • 这个模型可以帮助我们预测,随着训练数据量的增加,模型性能将如何变化。
  3. 最优样本量的估计

    • 通过分析模型性能与训练数据大小之间的关系,我们可以估计出达到特定性能水平所需的最优样本量。
    • 这有助于我们确定在资源限制下,应收集多少图像来训练模型。
  4. 重复实验与统计评估

    • 为了获得更准确的估计,我们重复上述过程多次,并计算观测性能的平均值和置信区间。
    • 这有助于我们评估估计的可靠性,并确定所需的样本量是否足够稳健。

通过采用平衡子采样方案和构建模型性能与训练数据大小之间的关系模型,我们可以系统地估计出达到所需模型性能所需的最优图像数量。这种方法不仅可以帮助我们在有限的资源下做出明智的决策,还可以提高机器学习模型在实际应用中的性能和可靠性。在医疗成像等数据稀缺的领域,这种方法尤为重要。

2、设置

import osos.environ["KERAS_BACKEND"] = "tensorflow"import matplotlib.pyplot as plt
import numpy as np
import tensorflow as tf
import keras
from keras import layers
import tensorflow_datasets as tfds# Define seed and fixed variables
seed = 42
keras.utils.set_random_seed(seed)
AUTO = tf.data.AUTOTUNE

3、数据集加载

我们将使用 TF Flowers 数据集,加载它并将其转换为 NumPy 数组。
数据下载地址如下:
https://storage.googleapis.com/download.tensorflow.org/example_images/flower_photos.tgz
下面是一个示例代码,展示如何使用 TensorFlow 的 tf.keras.preprocessing.image_dataset_from_directory 函数加载数据集,并将其转换为 NumPy 数组:

# Specify dataset parameters
dataset_name = "tf_flowers"
batch_size = 64
image_size = (224, 224)# Load data from tfds and split 10% off for a test set
(train_data, test_data), ds_info = tfds.load(dataset_name,split=["train[:90%]", "train[90%:]"],shuffle_files=True,as_supervised=True,with_info=True,
)# Extract number of classes and list of class names
num_classes = ds_info.features["label"].num_classes
class_names = ds_info.features["label"].namesprint(f"Number of classes: {num_classes}")
print(f"Class names: {class_names}")# Convert datasets to NumPy arrays
def dataset_to_array(dataset, image_size, num_classes):images, labels = [], []for img, lab in dataset.as_numpy_iterator():images.append(tf.image.resize(img, image_size).numpy())labels.append(tf.one_hot(lab, num_classes))return np.array(images), np.array(labels)img_train, label_train = dataset_to_array(train_data, image_size, num_classes)
img_test, label_test = dataset_to_array(test_data, image_size, num_classes)num_train_samples = len(img_train)
print(f"Number of training samples: {num_train_samples}")
Number of classes: 5
Class names: ['dandelion', 'daisy', 'tulips', 'sunflowers', 'roses']
Number of training samples: 3303

从测试集中绘制几个示例的图表

plt.figure(figsize=(16, 12))
for n in range(30):ax = plt.subplot(5, 6, n + 1)plt.imshow(img_test[n].astype("uint8"))plt.title(np.array(class_names)[label_test[n] == True][0])plt.axis("off")

在这里插入图片描述

4、图像增强(Augmentation)

使用Keras预处理层(preprocessing layers)定义图像增强,并将其应用于训练集。

在深度学习中,图像增强是一种常用的技术,用于通过随机修改训练图像来增加模型的泛化能力。这些修改可能包括旋转、缩放、翻转、裁剪、颜色变换等。通过使用Keras的预处理层,您可以轻松地为训练数据定义和执行这些增强操作。

# Define image augmentation model
image_augmentation = keras.Sequential([layers.RandomFlip(mode="horizontal"),layers.RandomRotation(factor=0.1),layers.RandomZoom(height_factor=(-0.1, -0)),layers.RandomContrast(factor=0.1),],
)# Apply the augmentations to the training images and plot a few examples
img_train = image_augmentation(img_train).numpy()plt.figure(figsize=(16, 12))
for n in range(30):ax = plt.subplot(5, 6, n + 1)plt.imshow(img_train[n].astype("uint8"))plt.title(np.array(class_names)[label_train[n] == True][0])plt.axis("off")

在这里插入图片描述

5、定义模型构建和训练函数

我们创建几个方便的函数来构建基于迁移学习的模型,编译并训练它,以及解冻层以进行微调。

def train_model(training_data, training_labels):"""Trains the model as follows:- Trains only the top layers for 10 epochs.- Unfreezes deeper layers.- Train for 20 more epochs.Arguments:training_data: NumPy Array, training data.training_labels: NumPy Array, training labels.Returns:Model accuracy."""model = build_model(num_classes)# Compile and train top layershistory = compile_and_train(model,training_data,training_labels,metrics=[keras.metrics.AUC(name="auc"), "acc"],optimizer=keras.optimizers.Adam(),patience=3,epochs=10,)# Unfreeze model from block 10 onwardsmodel = unfreeze(model, "block_10")# Compile and train for 20 epochs with a lower learning ratefine_tune_epochs = 20total_epochs = history.epoch[-1] + fine_tune_epochshistory_fine = compile_and_train(model,training_data,training_labels,metrics=[keras.metrics.AUC(name="auc"), "acc"],optimizer=keras.optimizers.Adam(learning_rate=1e-4),patience=5,epochs=total_epochs,)# Calculate model accuracy on the test set_, _, acc = model.evaluate(img_test, label_test)return np.round(acc, 4)

6、迭代训练模型

既然我们已经有了模型构建函数和支持迭代训练的函数,我们就可以在几个子样本分割上迭代训练模型。

我们选择子样本分割为下载数据集的5%、10%、25%和50%。我们假设目前只有50%的实际数据是可用的。

我们在每个分割上从零开始训练模型5次,并记录准确率值。

请注意,这将训练20个模型,并需要一些时间。请确保您已经激活了GPU运行环境。

为了保持这个示例的轻量级,我们提供了之前训练运行的样本数据。

def train_iteratively(sample_splits=[0.05, 0.1, 0.25, 0.5], iter_per_split=5):"""Trains a model iteratively over several sample splits.Arguments:sample_splits: List/NumPy array, contains fractions of the trainins setto train over.iter_per_split: Int, number of times to train a model per sample split.Returns:Training accuracy for all splits and iterations and the number of samplesused for training at each split."""# Train all the sample models and calculate accuracytrain_acc = []sample_sizes = []for fraction in sample_splits:print(f"Fraction split: {fraction}")# Repeat training 3 times for each sample sizesample_accuracy = []num_samples = int(num_train_samples * fraction)for i in range(iter_per_split):print(f"Run {i+1} out of {iter_per_split}:")# Create fractional subsetsrand_idx = np.random.randint(num_train_samples, size=num_samples)train_img_subset = img_train[rand_idx, :]train_label_subset = label_train[rand_idx, :]# Train model and calculate accuracyaccuracy = train_model(train_img_subset, train_label_subset)print(f"Accuracy: {accuracy}")sample_accuracy.append(accuracy)train_acc.append(sample_accuracy)sample_sizes.append(num_samples)return train_acc, sample_sizes# Running the above function produces the following outputs
train_acc = [[0.8202, 0.7466, 0.8011, 0.8447, 0.8229],[0.861, 0.8774, 0.8501, 0.8937, 0.891],[0.891, 0.9237, 0.8856, 0.9101, 0.891],[0.8937, 0.9373, 0.9128, 0.8719, 0.9128],
]sample_sizes = [165, 330, 825, 1651]

7、学习曲线

我们现在通过拟合一个指数曲线穿过平均准确率点来绘制学习曲线。我们使用TensorFlow(TF)来通过数据拟合一个指数函数。

然后,我们扩展学习曲线来预测在整个训练集上训练的模型的准确率。

绘制学习曲线通常用于理解模型在拥有不同数量的训练数据时的性能如何变化。通过观察随着数据量增加时模型准确率的提升(或停滞),我们可以对模型的学习能力有一个大致的了解,并可能发现是否存在过拟合或欠拟合的问题。

在训练数据有限的情况下,通过外推学习曲线,我们可以对使用更多数据(例如整个训练集)时模型的潜在性能进行预测。这有助于我们决定是否值得进一步收集或生成更多的训练数据。

def fit_and_predict(train_acc, sample_sizes, pred_sample_size):"""Fits a learning curve to model training accuracy results.Arguments:train_acc: List/Numpy Array, training accuracy for all modeltraining splits and iterations.sample_sizes: List/Numpy array, number of samples used for training ateach split.pred_sample_size: Int, sample size to predict model accuracy based onfitted learning curve."""x = sample_sizesmean_acc = tf.convert_to_tensor([np.mean(i) for i in train_acc])error = [np.std(i) for i in train_acc]# Define mean squared error cost and exponential curve fit functionsmse = keras.losses.MeanSquaredError()def exp_func(x, a, b):return a * x**b# Define variables, learning rate and number of epochs for fitting with TFa = tf.Variable(0.0)b = tf.Variable(0.0)learning_rate = 0.01training_epochs = 5000# Fit the exponential function to the datafor epoch in range(training_epochs):with tf.GradientTape() as tape:y_pred = exp_func(x, a, b)cost_function = mse(y_pred, mean_acc)# Get gradients and compute adjusted weightsgradients = tape.gradient(cost_function, [a, b])a.assign_sub(gradients[0] * learning_rate)b.assign_sub(gradients[1] * learning_rate)print(f"Curve fit weights: a = {a.numpy()} and b = {b.numpy()}.")# We can now estimate the accuracy for pred_sample_sizemax_acc = exp_func(pred_sample_size, a, b).numpy()# Print predicted x value and append to plot valuesprint(f"A model accuracy of {max_acc} is predicted for {pred_sample_size} samples.")x_cont = np.linspace(x[0], pred_sample_size, 100)# Build the plotfig, ax = plt.subplots(figsize=(12, 6))ax.errorbar(x, mean_acc, yerr=error, fmt="o", label="Mean acc & std dev.")ax.plot(x_cont, exp_func(x_cont, a, b), "r-", label="Fitted exponential curve.")ax.set_ylabel("Model classification accuracy.", fontsize=12)ax.set_xlabel("Training sample size.", fontsize=12)ax.set_xticks(np.append(x, pred_sample_size))ax.set_yticks(np.append(mean_acc, max_acc))ax.set_xticklabels(list(np.append(x, pred_sample_size)), rotation=90, fontsize=10)ax.yaxis.set_tick_params(labelsize=10)ax.set_title("Learning curve: model accuracy vs sample size.", fontsize=14)ax.legend(loc=(0.75, 0.75), fontsize=10)ax.xaxis.grid(True)ax.yaxis.grid(True)plt.tight_layout()plt.show()# The mean absolute error (MAE) is calculated for curve fit to see how well# it fits the data. The lower the error the better the fit.mae = keras.losses.MeanAbsoluteError()print(f"The mae for the curve fit is {mae(mean_acc, exp_func(x, a, b)).numpy()}.")# We use the whole training set to predict the model accuracy
fit_and_predict(train_acc, sample_sizes, pred_sample_size=num_train_samples)
Curve fit weights: a = 0.6445642113685608 and b = 0.048097413033246994.
A model accuracy of 0.9517362117767334 is predicted for 3303 samples.

在这里插入图片描述
从外推曲线中我们可以看到,使用3303张图像将产生大约95%的估计准确率。

让我们使用所有数据(3303张图像)来训练模型,看看我们的预测是否准确!

# Now train the model with full dataset to get the actual accuracy
accuracy = train_model(img_train, label_train)
print(f"A model accuracy of {accuracy} is reached on {num_train_samples} images!")
Trainable weights: 2
Non_trainable weights: 260
Epoch 1/1047/47 ━━━━━━━━━━━━━━━━━━━━ 18s 338ms/step - acc: 0.4305 - auc: 0.7221 - loss: 1.4585 - val_acc: 0.8218 - val_auc: 0.9700 - val_loss: 0.5043
Epoch 2/1047/47 ━━━━━━━━━━━━━━━━━━━━ 15s 326ms/step - acc: 0.7666 - auc: 0.9504 - loss: 0.6287 - val_acc: 0.8792 - val_auc: 0.9838 - val_loss: 0.3733
Epoch 3/1047/47 ━━━━━━━━━━━━━━━━━━━━ 16s 332ms/step - acc: 0.8252 - auc: 0.9673 - loss: 0.5039 - val_acc: 0.8852 - val_auc: 0.9880 - val_loss: 0.3182
Epoch 4/1047/47 ━━━━━━━━━━━━━━━━━━━━ 16s 348ms/step - acc: 0.8458 - auc: 0.9768 - loss: 0.4264 - val_acc: 0.8822 - val_auc: 0.9893 - val_loss: 0.2956
Epoch 5/1047/47 ━━━━━━━━━━━━━━━━━━━━ 16s 350ms/step - acc: 0.8661 - auc: 0.9812 - loss: 0.3821 - val_acc: 0.8912 - val_auc: 0.9903 - val_loss: 0.2755
Epoch 6/1047/47 ━━━━━━━━━━━━━━━━━━━━ 16s 336ms/step - acc: 0.8656 - auc: 0.9836 - loss: 0.3555 - val_acc: 0.9003 - val_auc: 0.9906 - val_loss: 0.2701
Epoch 7/1047/47 ━━━━━━━━━━━━━━━━━━━━ 16s 331ms/step - acc: 0.8800 - auc: 0.9846 - loss: 0.3430 - val_acc: 0.8943 - val_auc: 0.9914 - val_loss: 0.2548
Epoch 8/1047/47 ━━━━━━━━━━━━━━━━━━━━ 16s 333ms/step - acc: 0.8917 - auc: 0.9871 - loss: 0.3143 - val_acc: 0.8973 - val_auc: 0.9917 - val_loss: 0.2494
Epoch 9/1047/47 ━━━━━━━━━━━━━━━━━━━━ 15s 320ms/step - acc: 0.9003 - auc: 0.9891 - loss: 0.2906 - val_acc: 0.9063 - val_auc: 0.9908 - val_loss: 0.2463
Epoch 10/1047/47 ━━━━━━━━━━━━━━━━━━━━ 15s 324ms/step - acc: 0.8997 - auc: 0.9895 - loss: 0.2839 - val_acc: 0.9124 - val_auc: 0.9912 - val_loss: 0.2394
Trainable weights: 24
Non-trainable weights: 238
Epoch 1/2947/47 ━━━━━━━━━━━━━━━━━━━━ 27s 537ms/step - acc: 0.8457 - auc: 0.9747 - loss: 0.4365 - val_acc: 0.9094 - val_auc: 0.9916 - val_loss: 0.2692
Epoch 2/2947/47 ━━━━━━━━━━━━━━━━━━━━ 24s 502ms/step - acc: 0.9223 - auc: 0.9932 - loss: 0.2198 - val_acc: 0.9033 - val_auc: 0.9891 - val_loss: 0.2826
Epoch 3/2947/47 ━━━━━━━━━━━━━━━━━━━━ 25s 534ms/step - acc: 0.9499 - auc: 0.9972 - loss: 0.1399 - val_acc: 0.9003 - val_auc: 0.9910 - val_loss: 0.2804
Epoch 4/2947/47 ━━━━━━━━━━━━━━━━━━━━ 26s 554ms/step - acc: 0.9590 - auc: 0.9983 - loss: 0.1130 - val_acc: 0.9396 - val_auc: 0.9968 - val_loss: 0.1510
Epoch 5/2947/47 ━━━━━━━━━━━━━━━━━━━━ 25s 533ms/step - acc: 0.9805 - auc: 0.9996 - loss: 0.0538 - val_acc: 0.9486 - val_auc: 0.9914 - val_loss: 0.1795
Epoch 6/2947/47 ━━━━━━━━━━━━━━━━━━━━ 24s 516ms/step - acc: 0.9949 - auc: 1.0000 - loss: 0.0226 - val_acc: 0.9124 - val_auc: 0.9833 - val_loss: 0.3186
Epoch 7/2947/47 ━━━━━━━━━━━━━━━━━━━━ 25s 534ms/step - acc: 0.9900 - auc: 0.9999 - loss: 0.0297 - val_acc: 0.9275 - val_auc: 0.9881 - val_loss: 0.3017
Epoch 8/2947/47 ━━━━━━━━━━━━━━━━━━━━ 25s 536ms/step - acc: 0.9910 - auc: 0.9999 - loss: 0.0228 - val_acc: 0.9426 - val_auc: 0.9927 - val_loss: 0.1938
Epoch 9/2947/47 ━━━━━━━━━━━━━━━━━━━━ 0s 489ms/step - acc: 0.9995 - auc: 1.0000 - loss: 0.0069Restoring model weights from the end of the best epoch: 4.47/47 ━━━━━━━━━━━━━━━━━━━━ 25s 527ms/step - acc: 0.9995 - auc: 1.0000 - loss: 0.0068 - val_acc: 0.9426 - val_auc: 0.9919 - val_loss: 0.2957
Epoch 9: early stopping12/12 ━━━━━━━━━━━━━━━━━━━━ 2s 170ms/step - acc: 0.9641 - auc: 0.9972 - loss: 0.1264
A model accuracy of 0.9964 is reached on 3303 images!

8、结论

我们看到,使用3303张图像,模型达到了约94-96%的准确率。这与我们的估计非常接近!

尽管我们只使用了数据集的50%(1651张图像),但我们能够模拟模型的训练行为,并预测给定图像数量下的模型准确率。同样的方法可以用于预测达到所需准确率所需的图像数量。这在数据量较小时非常有用,当已经显示出深度学习模型可以收敛,但需要更多图像时。图像数量的预测可以用于计划和预算进一步的图像收集工作。

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

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

相关文章

5步3分钟0基础搭建,轻松搭建《雾锁王国》私人服务器

继《幻兽帕鲁》游戏爆火之后,与它同类型的《雾锁王国》也是强力刷屏,不分伯仲,在 Steam 上的评分一直稳定在“特别好评”,让小伙伴们很“上头”。就在两者游戏玩家反响爆火的同时,官方服务器人数爆满,卡顿频…

C语言Linux进度条模拟

在Linux字符界面中,使用yum、apt下载东西时会有一个图形化的进度条,可以告诉我们任务的执行进度。 我们也可以通过C语言实现一个类似的进度条,并且可以做得更加美观。以后我们自己写的程序需要显示进度时就可以去调用我们自己实现的进度条。 …

【typescript/flatbuffer】在websocket中使用flatbuffer

目录 说在前面场景fbs服务器代码前端typescript代码问题 说在前面 操作系统:Windows11node版本:v18.19.0typescript flatbuffer版本:24.3.25 场景 服务器(本文为golanggin)与前端通信时使用flatbuffer进行序列化与反序列化通信协议为websock…

从0开始制作微信小程序

目录 前言 正文 需要事先准备的 需要事先掌握的 什么是uniapp 平台应用的分类方式 什么是TypeScript 创建项目 项目文件作用 源码地址 尾声 🔭 Hi,I’m Pleasure1234🌱 I’m currently learning Vue.js,SpringBoot,Computer Security and so on.&#x1…

有点混乱的普里姆算法求最小生成树

Graph.h #pragma once //邻接矩阵的创建 #include<stdio.h> #include <stdlib.h> #include<assert.h> #include<string.h> #include<stdbool.h> #include<limits.h> #define MAX 100 #define INF INT_MAX typedef struct Graph {int n;…

一周学会Django5 Python Web开发 - Django5内置Admin系统二次开发

锋哥原创的Python Web开发 Django5视频教程&#xff1a; 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计56条视频&#xff0c;包括&#xff1a;2024版 Django5 Python we…

System-Verilog 实现DE2-115倒车雷达模拟

System-Verilog 实现DE2-115倒车雷达模拟 引言&#xff1a; 随着科技的不断进步&#xff0c;汽车安全技术也日益成为人们关注的焦点。在众多汽车安全辅助系统中&#xff0c;倒车雷达以其实用性和高效性脱颖而出&#xff0c;成为现代汽车不可或缺的一部分。倒车雷达系统利用超声…

idea中导入代码文件无法修改,显示File is read-only,怎么办?难办?那就别办了------看下面

File is read-only 文件属性只读&#xff0c;不可修改。。。。。 第一次遇到这种问题&#xff0c;去网上搜了一堆方法&#xff0c;都试了&#xff0c;没用&#xff0c;最后居然还建议我重装idea&#xff0c;我还差点信了&#xff0c;经9X9难后&#xff0c;取得真经。 问题解决…

Spring Boot项目中,如何在yml配置文件中读取maven pom.xml文件中的properties标签下的属性值

一、前言 在最近的项目开发过程中&#xff0c;有一个需求&#xff0c;需要在Spring Boot项目的yml配置文件中读取到mave的 pom.xml文件中的properties标签下的属性值&#xff0c;这个要怎么实现呢&#xff1f; 二、技术实践 pom.xml文件中增加测试属性 <properties><…

汇舟问卷:兼职做国外问卷三小时挣200

在繁忙的都市生活中&#xff0c;许多人为了生计而日夜奔波。对于大多数人来说&#xff0c;白天的工作已经足够充实&#xff0c;但依然有很多人选择在下班时间&#xff0c;多做些什么&#xff0c;为自己带来一份额外​的收入。 目前下班做的兼职工作不是跑滴滴&#xff0c;就是…

YOLOV10:参数越少,速度越快,性能更高的新一代目标检测框架

摘要 在过去的几年中&#xff0c;YOLOs由于在计算成本和检测性能之间实现了有效的平衡&#xff0c;已经成为实时目标检测领域的主导范式。研究人员已经探索了YOLOs的架构设计、优化目标、数据增强策略等&#xff0c;取得了显著的进展。然而&#xff0c;对非极大值抑制&#xf…

Redis学习笔记【基础篇】

SQL vs NOSQL SQL&#xff08;Structured Query Language&#xff09;和NoSQL&#xff08;Not Only SQL&#xff09;是两种不同的数据库处理方式&#xff0c;它们在多个维度上有所差异&#xff0c;主要区别包括&#xff1a; 数据结构: SQL&#xff08;关系型数据库&#xff09;…

深入探讨npm、Yarn、pnpm和npx之间的区别

前端生态系统是一个快速发展的领域&#xff0c;充满了各种工具和技术。对于开发人员来说&#xff0c;跟上这些创新可能是一项艰巨的挑战。 在本文中&#xff0c;我们将深入探讨npm、Yarn、pnpm和npx之间的区别&#xff0c;帮助你理解每个工具的不同之处。 包管理器比较 npm …

【一生一芯】

目录 安装Ubuntu 22.04 安装Ubuntu 22.04 我站在巨人的肩膀上&#xff0c;安装教程见VMware安装Ubuntu22.04(英文桌面)教程 备忘一下&#xff1a; 1.Ubuntu中在终端进入root权限但是总提示密码错误的解决方案 对支持 IPv6 的镜像主机执行 ping 操作&#xff1a; 将帐户添加到 …

私有大模型:针对长结构文档的回答方法

作者: Jon Saad-Falcon, Joe Barrow, Alexa Siu, Ani Nenkova, David Seunghyun Yoon, Ryan A. Rossi, Franck Dernoncourt 摘要: 大型语言模型&#xff08;LLMs&#xff09;在处理长文档问答&#xff08;QA&#xff09;时面临着无法适应其小上下文窗口的问题。为了解决这一问…

【计算机视觉】数字图像处理基础知识(模拟和数字图像、采样量化、像素的基本关系、灰度直方图、图像的分类)

一、图像的基本概念 图像(image)&#xff1a;图像这个简单单词其实包含两方面含义&#xff1a; “图”&#xff1a;是指物体反射光or透射光的分布“像”&#xff1a;接收和记录其分布所得到的结果&#xff08;如&#xff1a;人的视觉系统所接收“图”在人脑中形成的映像或认识&…

LLVM入门教学——SanitizerCoverage插桩(Linux)

1、介绍 LLVM 的 SanitizerCoverage 是一种代码覆盖工具&#xff0c;设计用于支持基于 fuzzing 的测试和其他安全相关工具。SanitizerCoverage 在编译时插桩代码&#xff0c;以在运行时收集覆盖信息&#xff0c;从而帮助识别未覆盖的代码路径&#xff0c;提高测试的有效性和全…

算法-随机快排及荷兰国旗优化

文章目录 算法介绍 :1. 随机快排解析2. 荷兰国旗问题3. 随机快排优化4. 总结随机快排 算法介绍 : 随机快速排序和传统的快速排序的逻辑本质是一致的,都是找到一个值作为划分的中间位置,左边数值均小于该数值,右边数值均大于该数值,但是与传统的快排又不一致的是,我们的这个位置…

国内的期权模拟账户怎么申请?

国内的期权模拟账户可以在券商和期权分仓平台处申请开通&#xff0c;期权相比于股票具有杠杆投资、风险控制等新特性。 期权模拟交易客户端能够提供期权的开平仓交易、备兑开仓&#xff0f;平仓、行权等交易指令&#xff0c;下文为大家介绍国内的期权模拟账户怎么申请&#xff…

2024 cicsn Ezheap

文章目录 检查 libc2.35利用adddeleeditshow 思路exp结果 检查 libc2.35 利用 add 0x80个chunk&#xff0c;遍历选一个没有被用的&#xff0c;输入的size<0x501,然后malloc后会清零安装输入的size&#xff0c;然后输入内容&#xff0c;长度也是输入的size dele 指定索引…