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

基于CNN神经网络的手写字符识别实验报告

作业要求

具体实验内容根据实际情况自拟,可以是传统的BP神经网络,Hopfield神经网络,也可以是深度学习相关内容。

数据集自选,可以是自建数据集,或MNIST,CIFAR10等公开数据集。

实验报告内容包括但不限于:

  1. 实验目标和动机,应明确说明输入数据,和网络输出数据;
  2. 所设计相关网络的基本架构;
  3. 核心架构的具体实现;
  4. 网络训练和推理过程及说明;
  5. 实验结果比对和分析;
  6. 总结和讨论
  7. … 可根据需要自行扩展

评分标准:符合上述内容和格式要求,80分

          根据算法原理介绍,算法实现,实验结果分析和讨论情况,加分0-5分;

          根据实验结果分析和讨论各种神经网络方法的优缺点,加分0~5分;

  讨论不同神经网络参数对性能的影响,并尝试比对,加分0~5分;

  有自己观点或体现自身工作量,加分0-10分;

          总分不超过100分。

目录

1. 实验目标和动机

2 CNN算法的基本原理

3 LeNet5网络基本架构

4 核心架构的具体实现

5 网络训练和推理过程及说明

6 实验结果对比和分析

6.1 不同神经网络参数对性能的影响

6.1.1 批处理大小

6.1.2 学习率

6.1.3 优化算法

6.1.4 激活函数

6.2 实验结果的分析

7. 各种神经网络方法的优缺点

7.1多层感知机(MLP)

7.2卷积神经网络(CNN)

7.3 循环神经网络(RNN)

7.4 长短期记忆网络(LSTM)和门控循环单元(GRU)

8.总结和讨论

9.附录

1. 实验目标和动机

实验的目标是使用MNIST数据集进行手写字符识别。MNIST数据集包含许多手写数字的图像,每个图像都是28x28像素的灰度图像,表示数字0到9。

实验动机是探索使用卷积神经网络(CNN)进行图像识别任务,并比较不同网络结构和参数配置对性能的影响。

输入数据: 28x28像素的灰度图像

网络输出数据: 预测的数字类别

2 CNN算法的基本原理

CNN是一种专门用于处理图像数据的深度学习模型,其核心原理包括卷积层、池化层和全连接层。

卷积神经网络利用卷积层来提取图像特征。卷积操作通过滑动卷积核在输入图像上提取局部特征,这有助于捕获图像中的边缘、纹理等信息,并保留空间关系。

池化层用于降维和减少特征图的大小,同时保留主要特征。最常见的池化操作是最大池化,它从每个局部区域中选择最大值作为输出,减小了特征图的尺寸并提高了计算效率。

全连接层通常位于网络的顶部,将卷积层和池化层提取的特征映射到输出类别。全连接层通过学习权重参数,将特征映射到每个类别的概率,最终实现图像分类。

激活层采用激活函数,把卷积层输出结果做非线性映射。在卷积层之后使用,以增加网络的表达能力。常见的激活函数包括ReLU(Rectified Linear Unit)、Sigmoid和Tanh等。ReLU是最常用的激活函数,它能够有效缓解梯度消失问题,并加速网络的收敛速度。

Softmax层通常作为网络的最后一层,用于将全连接层的输出转换成各个类别的概率分布。通过对这些概率进行比较,模型可以确定输入图像最可能属于哪个类别。

3 LeNet5网络基本架构

本实验使用CNN的经典模型LeNet5进行手写数字的识别。

LeNet-5的基本结构包括7层网络结构(不含输入层),其中包括2个卷积层、2个降采样层(池化层)、2个全连接层和输出层。

1)输入层(Input layer)

输入层接收大小为28×28 的手写数字图像,其中包括灰度值(0-255)。在本实验中对数据集进行预处理,数据进行了标准化,以加快训练速度和提高模型的准确性。[28,28,1]

2)卷积层C1(Convolutional layer C1)

卷积层C1包括6个卷积核,每个卷积核的大小为5×5,步长为1,填充为0。因此,每个卷积核会产生一个大小为28×28的特征图(输出通道数为6)。[28,28,6]

3)采样层S2(Subsampling layer S2)

采样层S2采用最大池化(max-pooling)操作,每个窗口的大小为2×2 ,步长为2。因此,每个池化操作会从4个相邻的特征图中选择最大值,产生一个大小为14×14的特征图(输出通道数为6)。[14,14,6]

4)卷积层C3(Convolutional layer C3)

卷积层C3包括16个卷积核,每个卷积核的大小为5×5 ,步长为1,填充为0。因此,每个卷积核会产生一个大小为10×10的特征图(输出通道数为16)。[10,10,16]

5)采样层S4(Subsampling layer S4)

采样层S4采用最大池化操作,每个窗口的大小为2×2,步长为2。因此,每个池化操作会从4个相邻的特征图中选择最大值,产生一个大小为5×5的特征图(输出通道数为16)。[5,5,16]

6)全连接层C5(Fully connected layer C5)

C5将每个大小为5×5 的特征图拉成一个长度为400的向量,并通过一个带有120个神经元的全连接层进行连接。120是由LeNet-5的设计者根据实验得到的最佳值。[400,]->[120,]

7)全连接层F6(Fully connected layer F6)

全连接层F6将120个神经元连接到84个神经元。[84,]

8)输出层(Output layer)

输出层由10个神经元组成,每个神经元对应0-9中的一个数字,并输出最终的分类结果。在训练过程中,使用交叉熵损失函数计算输出层的误差,并通过反向传播算法更新卷积核和全连接层的权重参数。[10,]

4 核心架构的具体实现

# 构建LeNet-5模型
model = models.Sequential([layers.Conv2D(6, kernel_size=(5, 5), strides=(1, 1), activation='relu', input_shape=(28, 28, 1), padding='same'),layers.AveragePooling2D(pool_size=(2, 2), strides=(2, 2), padding='valid'),layers.Conv2D(16, kernel_size=(5, 5), strides=(1, 1), activation='relu', padding='valid'),layers.AveragePooling2D(pool_size=(2, 2), strides=(2, 2), padding='valid'),layers.Flatten(),layers.Dense(120, activation='relu'),layers.Dense(84, activation='relu'),layers.Dense(10, activation='softmax')
])# 编译模型
model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])# 训练模型
history = model.fit(train_images, train_labels, epochs=10, batch_size=16, validation_data=(test_images, test_labels))

5 网络训练和推理过程及说明

网络训练过程

·准备数据: 首先需要准备训练数据集和验证数据集。训练数据集通常用来训练模型的参数,验证数据集用来评估模型在训练过程中的性能。

·构建模型: 定义LeNet5模型的架构,包括输入层、隐藏层、输出层以及它们之间的连接关系。这里通过深度学习框架TensorFlow来实现。

·定义损失函数和优化器: 选择交叉熵作为损失函数和Adam作为优化器。

·训练模型: 将模型与训练数据集进行训练,通过反向传播算法不断优化模型参数,使得模型能够更好地拟合训练数据。

·评估模型: 使用验证数据集评估训练得到的模型的性能,观察模型在验证集上的表现,并根据评估结果进行调参和优化。

网络推理过程

·准备输入数据: 对于需要进行推理的新数据,首先需要进行预处理,使其能够输入到训练好的模型中进行推理。

·加载模型: 从保存的模型参数中加载训练好的模型。

·模型推理: 将输入数据通过加载的模型进行前向传播,得到模型的输出结果。

·输出结果

6 实验结果对比和分析

6.1 不同神经网络参数对性能的影响

通过对网络模型的不同参数的调整,发现以下几个参数都会对模型的性能产生影响:学习率、优化算法、激活函数、批处理大小。下面是不同的模型参数对模型准确率的影响

上图虽然数据过于多,但是很明显的一点是,当使用随机梯度下降(sgd)最为优化器,sigmoid作为激活函数的时候准确率尤其低,可以发现模型的参数选择非常重要,下面是对不同模型参数的的实验结果比对和研究。

6.1.1 批处理大小

在本次实验中,我们探究了不同批量大小对LeNet5模型性能的影响。我们使用了批量大小为16、32和64,并记录了每个批量大小下模型在测试集上的准确率。

由于有几个点的准确率过于低,使整个折现图不是很直观,于是将上述几个准确率过于低的点去掉,可以得到以下可视化折线图

我们可以明显地观察到,在不同的批量大小下,模型的准确率存在差异。具体来说,批量大小为64时,我们观察到最低的准确率。

一般而言,较大的批量大小可能会降低模型的收敛速度,而较小的批量大小可能导致模型更快地收敛但容易受到数据噪声的影响。这种差异可能是由于不同批量大小下梯度估计的差异所导致。

考虑到模型的性能在不同批量大小下存在明显变化,批量大小的选择在训练深度学习模型时至关重要。然而,并不存在一种适用于所有情况的通用最佳批量大小,因此在选择批量大小时需要综合考虑模型架构、数据集特性和优化器的选择。

综上所述,批量大小作为一个重要的超参数,对于模型的性能具有显著影响。在实践中,我们建议根据具体情况进行实验和验证,以确定最适合的批量大小,从而有效地训练深度学习模型。

6.1.2 学习率

学习率(learning rate)是训练神经网络时一个非常重要的超参数,它决定了模型在每次参数更新时的步长大小。学习率的选择对模型的性能有着直接的影响,过大或过小的学习率都可能导致训练不稳定或性能下降。

如果学习率设置过大,可能导致参数更新过大,从而使得模型在参数空间中跳动幅度过大,无法收敛到最优解,甚至可能导致训练过程中出现震荡或不稳定的情况。

相反,如果学习率设置过小,模型参数更新的步长会变得很小,导致训练过程收敛速度缓慢,需要更多的迭代次数才能达到收敛,从而增加训练时间。此外,学习率过小还容易使得模型陷入局部最优解而难以获得全局最优解。

有6.1.1 可以看出来当batch_size为16时模型性能比较好,下面只可视化batch_size为16时的模型性能

可以看出过大或过小的学习率都可能导致训练不稳定或性能下降。在模型训练时应该选择恰当的学习率。

​​​​​​​6.1.3 优化算法

优化算法在训练神经网络时起着至关重要的作用,它决定了模型参数的更新方式和速度。不同的优化算法对模型性能有着直接的影响。

SGD 是最常见的优化算法之一,然而在本实验中,在对MNIST数据集的分类中SGD表现则没有那么良好。

相比其他两个Adam和RMSprop这两个自适应学习率算法,SGD的表现可以说是非常差。

对于 MNIST 这样的任务,Adam 和 RMSprop 这类自适应学习率算法通常能够快速收敛并取得较好的性能。因为这些算法能够自动调整学习率,适应不同特征的分布和参数的尺度,从而更快地收敛到最优解。

综上所述,对于 MNIST 数据集的分类任务,自适应学习率算法(如 Adam 和 RMSprop)通常能够在收敛速度和性能上取得良好的平衡。然而,对于特定的模型架构和超参数设置,不同的优化算法可能会有着不同的表现。

6.1.4 激活函数

不同的激活函数(如ReLU、Sigmoid、Tanh等)在网络训练中会对梯度传播和稀疏表示等方面产生不同的影响。实验发现就对MNIST数据集的分类ReLU表现更为好。

由上述两个图可以看出SGD(随机梯度下降)与 Sigmoid 激活函数结合导致准确率极为低。尝试分析了一下原因:

1)梯度消失问题: Sigmoid 函数具有饱和性,其导数在 0 到 1 之间。在网络的反向传播过程中,当梯度反向传播到较深层时,这种饱和性可能导致梯度消失,使得深层网络参数无法有效地更新,难以学习到复杂的特征表示。

2)非线性表达受限: Sigmoid 函数并不是非常适合作为激活函数,因为它只覆盖了一小部分输入范围,导致网络的表达能力受到限制。相比之下,ReLU 或其变体可以更好地处理非线性关系,并且不容易出现梯度消失的问题。

3)输出分布偏移: Sigmoid 输出值的范围在 0 到 1 之间,但是在实际应用中,可能需要更广泛的输出分布。特别是对于 MNIST 数据集中的分类问题,期望的输出是 one-hot 编码,即输出节点应该尽可能地接近 0 或 1。Sigmoid 输出的值域不是最理想的,可能导致网络训练困难。

4)SGD 优化器的限制: SGD 是一种简单的优化器,可能无法快速收敛到全局最优解。在复杂的模型结构中,SGD 可能会受到局部最小值或者鞍点的影响。

6.2 实验结果的分析

通过上述调试参数,最终使用如下参数进行模型的训练和测试,得到实验结果如下:

activations = [ 'relu']

learning_rates = [0.001]

optimizers = [ 'adam']

batch_sizes = [16]

epochs = 10

可视化:

可以看出模型预测出错的图片,人眼也很难识别,可见模型的训练还是比较成功的。

7. 各种神经网络方法的优缺点

7.1多层感知机(MLP)

优点: ①简单易用,适用于一些简单的分类和回归任务。

②可以进行非线性映射,对一些非线性问题的建模能力较强。

缺点: ①处理图像、语音和自然语言处理等复杂任务的能力有限。

②受限于全连接结构,参数较多,容易过拟合。

7.2卷积神经网络(CNN)

优点: ①在图像处理领域表现出色,能够自动提取局部特征。

②参数共享和池化操作减少了模型的参数数量,降低了过拟合风险。

缺点: ①对位置平移和尺度变化敏感,需要大量数据进行训练以获得良好的泛化性能。

②不擅长处理序列数据,如文本和时间序列数据。

7.3 循环神经网络(RNN)

优点: ①适用于处理序列数据,能够捕捉时间上的依赖关系。

②可以处理不定长的输入序列,适用于自然语言处理等任务。

缺点: ①难以捕捉长距离的依赖关系,存在梯度消失和梯度爆炸问题。

②计算效率较低,难以并行化处理。

7.4 长短期记忆网络(LSTM)和门控循环单元(GRU)

优点: ①解决了传统RNN难以捕捉长距离依赖关系的问题。

②具有记忆单元和门控机制,能够更好地处理长序列任务。

缺点: ①参数较多,需要更多的数据来训练。

②计算成本较高,对硬件要求较高。

8.总结和讨论

在MNIST手写字符识别任务中,CNN(例如LeNet-5)模型表现出了较好的性能,能够有效地提取图像特征,获得较高的准确率。

参数调优对模型性能影响显著,如学习率、批处理大小、优化算法和激活函数等。具体调整这些参数能够显著地改变模型的收敛速度和准确率。

不同的优化算法和激活函数对模型性能有重要影响。自适应学习率算法(如Adam、RMSprop)和ReLU激活函数通常能在训练效率和性能上取得较好的平衡。

手写字符识别问题在现代深度学习中仍然是一个重要的研究领域,不同的模型和方法在实际应用中各有优劣。

还有一些对于手写字符识别问题未来的看法和建议:

探索更深层次、更复杂的网络结构,例如ResNet、Inception等,在保持计算效率的同时提高模型性能。

应用更多的数据增强技术和预处理方法,以增加数据集的多样性,提高模型的鲁棒性和泛化能力。

结合迁移学习的方法,利用预训练的模型,在手写字符识别问题上进行fine-tuning。同时,尝试模型融合等集成学习方法,提高模型性能。

随着技术的发展,探索如注意力机制、图神经网络等新技术在手写字符识别中的应用,以提高模型的表达能力。

总体而言,手写字符识别问题仍有许多待解决的挑战,需要进一步的研究和探索新的方法,以应对不同场景下的需求,并不断提升模型性能。

9.附录

基于LeNet5模型进行MNIST手写数字集的分类,实验完整代码

import tensorflow as tffrom tensorflow.keras import layers, models, datasetsimport matplotlib.pyplot as plt# 加载MNIST数据集(train_images, train_labels), (test_images, test_labels) = datasets.mnist.load_data()train_images = train_images.reshape((60000, 28, 28, 1)).astype('float32') / 255test_images = test_images.reshape((10000, 28, 28, 1)).astype('float32') / 255# 构建LeNet-5模型model = models.Sequential([layers.Conv2D(6, kernel_size=(5, 5), strides=(1, 1), activation='relu', input_shape=(28, 28, 1), padding='same'),layers.AveragePooling2D(pool_size=(2, 2), strides=(2, 2), padding='valid'),layers.Conv2D(16, kernel_size=(5, 5), strides=(1, 1), activation='relu', padding='valid'),layers.AveragePooling2D(pool_size=(2, 2), strides=(2, 2), padding='valid'),layers.Flatten(),layers.Dense(120, activation='relu'),layers.Dense(84, activation='relu'),layers.Dense(10, activation='softmax')])# 编译模型model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])# 训练模型history = model.fit(train_images, train_labels, epochs=10, batch_size=16, validation_data=(test_images, test_labels))# 可视化训练过程plt.plot(history.history['accuracy'], label='accuracy')plt.plot(history.history['val_accuracy'], label = 'val_accuracy')plt.xlabel('Epoch')plt.ylabel('Accuracy')plt.ylim([0, 1])plt.legend(loc='lower right')plt.show()# 评估模型test_loss, test_acc = model.evaluate(test_images, test_labels)print('Test accuracy:', test_acc)import numpy as np# 使用训练好的模型对测试集进行预测predictions = model.predict(test_images)predicted_labels = np.argmax(predictions, axis=1)# 找出预测正确和错误的样本correct_indices = np.where(predicted_labels == test_labels)[0]incorrect_indices = np.where(predicted_labels != test_labels)[0]# 输出部分预测错误的样本plt.figure(figsize=(10, 10))for i, incorrect_idx in enumerate(incorrect_indices[:25]):plt.subplot(5, 5, i + 1)plt.imshow(test_images[incorrect_idx].reshape(28, 28), cmap='gray')plt.title(f"Predicted: {predicted_labels[incorrect_idx]}, True: {test_labels[incorrect_idx]}")plt.axis('off')plt.tight_layout()plt.show()# 输出部分预测正确的样本plt.figure(figsize=(10, 10))for i, correct_idx in enumerate(correct_indices[:25]):plt.subplot(5, 5, i + 1)plt.imshow(test_images[correct_idx].reshape(28, 28), cmap='gray')plt.title(f"Predicted: {predicted_labels[correct_idx]}, True: {test_labels[correct_idx]}")plt.axis('off')plt.tight_layout()plt.show()# 参数配置实验activations = ['tanh', 'relu', 'sigmoid']learning_rates = [0.01, 0.001, 0.0001]optimizers = ['sgd', 'adam', 'rmsprop']batch_sizes = [16, 32, 64]epochs = 3  results = []for act in activations:for lr in learning_rates:for opt in optimizers:for batch_size in batch_sizes:model = build_lenet5_model(activation=act)model.compile(optimizer=opt, loss='sparse_categorical_crossentropy', metrics=['accuracy'])history = model.fit(train_images, train_labels, batch_size=batch_size, epochs=epochs, validation_data=(test_images, test_labels))val_accuracy = history.history['val_accuracy'][-1]  # 获取最终验证准确率results.append((act, lr, opt, batch_size, val_accuracy))import csv# 将结果保存到CSV文件filename = 'experiment_results.csv'with open(filename, mode='w', newline='') as file:writer = csv.writer(file)writer.writerow(['Activation', 'Learning Rate', 'Optimizer', 'Batch Size', 'Validation Accuracy'])for result in results:# 提取结果并进行可视化labels = [f'{act} LR:{lr} Opt:{opt} Batch:{batch}' for act, lr, opt, batch, _ in results]accuracy_values = [accuracy for _, _, _, _, accuracy in results]# 创建条形图plt.figure(figsize=(15, 8))plt.bar(labels, accuracy_values, color='skyblue')# 添加标题和标签plt.title('Validation Accuracy for Different Hyperparameter Combinations and Batch Sizes')plt.xlabel('Hyperparameters and Batch Sizes')plt.ylabel('Validation Accuracy')plt.xticks(rotation=45, ha='right')plt.tight_layout()plt.show()import csvimport matplotlib.pyplot as plt# 读取CSV文件数据filename = 'experiment_results.csv'with open(filename, mode='r') as file:reader = csv.reader(file)header = next(reader)  # 读取标题行data = [row for row in reader]  # 读取数据行# 提取数据batch_sizes = set(row[3] for row in data)activation_types = set(row[0] for row in data)learning_rates = set(row[1] for row in data)optimizers = set(row[2] for row in data)# 准备数据并过滤性能较差的数据点batch_size_data = {}threshold = 0.5  # 设定阈值for batch_size in batch_sizes:accuracies = [float(row[4]) for row in data if row[3] == batch_size and float(row[4]) > threshold]batch_size_data[batch_size] = accuracies# 绘制折线图plt.figure(figsize=(10, 6))for batch_size, accuracies in batch_size_data.items():# 根据batch_size筛选数据行filtered_data = [row for row in data if row[3] == batch_size and float(row[4]) > threshold]# 获取当前参数的值作为标签labels = [f'{row[0]}, {row[1]}, {row[2]}' for row in filtered_data]plt.plot(labels, accuracies, marker='o', label=f'Batch Size: {batch_size}')# 设置图表属性plt.title('Model Performance by Different Batch Sizes')plt.xlabel('Model Parameters')plt.ylabel('Validation Accuracy')plt.xticks(rotation=90)  # 旋转X轴标签,以防止重叠plt.legend()# 显示图表plt.tight_layout()plt.show()

Ps:省略了一些重复的代码

文档完成于2023/12/14

编辑于2023/12/30

相关文章:

基于CNN神经网络的手写字符识别实验报告

作业要求 具体实验内容根据实际情况自拟,可以是传统的BP神经网络,Hopfield神经网络,也可以是深度学习相关内容。 数据集自选,可以是自建数据集,或MNIST,CIFAR10等公开数据集。 实验报告内容包括但不限于&am…...

Ubuntu 系统中安装和配置 clash

本博客参考 ubuntu下怎么安装clash-ghc? 和 对 clash 进行下载和配置,如有需要可自行点击链接查看原文。 下载 clash 打开终端(进入到 主目录/用户目录 ),通过命令下载 clash 文件并将其中命名为 clash: # 下载 cl…...

DragonEnglish:COCA20000+单词+释义

去年的时候接触到了 COCA20000 单词,对这种给单词特定顺序的方式蛮感兴趣的。因为我当时接触的版本只有单词或者单词释义的版本,所以我直接通过各种方式给它搭配了音标例句发音,然后每100个切割成1份,分成了 202 个文件来学习&…...

『亚马逊云科技产品测评』活动征文|云服务器如何快速搭建个人博客(图文详解)

授权声明:本篇文章授权活动官方亚马逊云科技文章转发、改写权,包括不限于在 Developer Centre, 知乎,自媒体平台,第三方开发者媒体等亚马逊云科技官方渠道 文章目录 引言一、前期准备步骤1.1 准备一个亚马逊 EC2 服务器1.2 进入控…...

QT上位机开发(乘法计算小软件)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 前面一篇文章,我们学习了怎么创建qt的第一个工程,怎么用designer给qt修改界面。虽然我们到目前为止,还没有编写…...

【Matlab】BP 神经网络时序预测算法

资源下载: https://download.csdn.net/download/vvoennvv/88681507 一,概述 BP 神经网络是一种常见的人工神经网络,也是一种有监督学习的神经网络。其全称为“Back Propagation”,即反向传播算法。BP 神经网络主要由输入层、隐藏层…...

GPT在企业自动化方面的应用

GPT和类似的自然语言处理技术在企业自动化方面有许多应用。以下是一些主要的应用领域: 自动化客户支持: 使用GPT可以构建自动化的客户支持系统,能够理解和生成自然语言文本,回答常见问题,解决用户的疑问和问题。 自动…...

STM32——通用计时器

通用计时器框图 1.时钟源 1)内部时钟(CK_INT) 2)外部时钟模式 1:外部输入引脚(TIx),x1,2(即只能来自于通道 1 或者通道 2) 3)外部时钟模式 2:外部触发输入(ETR) 4&#…...

【HarmonyOS】鸿蒙开发简介与项目基础配置演示

从今天开始,博主将开设一门新的专栏用来讲解市面上比较热门的技术 “鸿蒙开发”,对于刚接触这项技术的小伙伴在学习鸿蒙开发之前,有必要先了解一下鸿蒙,从你的角度来讲,你认为什么是鸿蒙呢?它出现的意义又是…...

[MySQL] MySQL数据库创建存储过程

一、mysql存储过程的相关知识 1.1 存储过程的概念 存储过程是一组为了完成特定功能的SQL语句集合。类似于于其他编程语言中的函数,定义一个函数方法,可以随时起到传参调用的功能。 存储过程在使用过程中是将常用或者复杂的工作预先使用SQL语句写好并用…...

mysql哪些情况下不走索引?

mysql哪些情况下不走索引? MySQL是一种常用的关系型数据库,它使用索引来提高查询性能。然而,并非所有的SQL语句都能充分利用索引。在本文中,我们将介绍几个无法使用到索引的MySQL SQL语句。 1. 使用函数:当SQL语句中…...

蓝桥杯python比赛历届真题99道经典练习题 (13-20)

【程序13】 题目:打印出所有的“水仙花数”,所谓“水仙花数”是指一个三位数,其各位数字立方和等于该数 本身。例如:153是一个“水仙花数”,因为153=1的三次方+5的三次方+3的三次方。 1.程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位。 2.程序…...

初识javaWeb

一、JavaWeb是什么? 1、概念 javaWeb指的是使用java语言进行互联网领域项目开发的技术栈——进行web项目开发所需的技术的集合。 -Web前端——在浏览器中用户可以看到的网页 -Web后端——为前端提供数据的程序 2、Web项目 java语言是可以进行多种类型的项目开发&a…...

day5--java基础编程:异常,内部类

6 异常 6.1 异常概述 出现背景: 在使用计算机语言进行项目开发的过程中,即使程序员把代码写得尽善尽美,在系统的运行过程中仍然会遇到一些问题,因为很多问题不是靠代码能够避免的,比如:客户输入数据的格式&#xff0c…...

2023.12.28 关于 Redis 数据类型 List 内部编码、应用场景

目录 List 编码方式 早期版本 现今版本 List 实际应用 多表之间的关联关系 消息队列 频道(多列表)消息队列 微博 Timeline 栈 & 队列 List 编码方式 早期版本 早期版本 List 类型的内部编码方式有两种 ziplist(压缩列表&#xf…...

uni-app page新建以及page外观配置

锋哥原创的uni-app视频教程: 2023版uniapp从入门到上天视频教程(Java后端无废话版),火爆更新中..._哔哩哔哩_bilibili2023版uniapp从入门到上天视频教程(Java后端无废话版),火爆更新中...共计23条视频,包括:第1讲 uni…...

问题:执行conda init 提示 No action taken,然后无法正确激活环境

执行完下面代码后, conda activate base 报错,提示先执行conda init,于是再执行下面代码 conda init发现还报错提示提示 No action taken。 解决方法: 打开一个新的终端窗口,您应该就可以正常使用conda命令。(把其…...

SpringBoot 增量/瘦身部署jar 包

背景 SpringBoot 项目的部署一般采用全量jar 包方式部署相关项目,如果我们对相关的Contrller\Service\Dao\Mapper 层进行相关业务调整就需要重新编译全量jar 包(包大小约为200M左右)实在太麻烦了。 本文:重点讲解使用SpringBoot 的增量/瘦身…...

AI客服的评分机制及自动化测试

智能客服的评分机制及自动化测试 使用pytest来编写智能客服的测试框架: 准备一个CSV文件来存储测试用例和预期结果。编写测试脚本,其中包含测试用例的读取、发送请求、评分逻辑和结果验证。使用pytest断言来验证测试结果。 首先安装pytest和requests库…...

【Matlab】ELM极限学习机时序预测算法

资源下载: https://download.csdn.net/download/vvoennvv/88681649 一,概述 ELM(Extreme Learning Machine)是一种单层前馈神经网络结构,与传统神经网络不同的是,ELM的隐层神经元权重以及偏置都是随机产生的…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...

使用分级同态加密防御梯度泄漏

抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...

测试markdown--肇兴

day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...

如何在网页里填写 PDF 表格?

有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据&#xff…...

LLMs 系列实操科普(1)

写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

比较数据迁移后MySQL数据库和OceanBase数据仓库中的表

设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...

Unity中的transform.up

2025年6月8日,周日下午 在Unity中,transform.up是Transform组件的一个属性,表示游戏对象在世界空间中的“上”方向(Y轴正方向),且会随对象旋转动态变化。以下是关键点解析: 基本定义 transfor…...

Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析

Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析 一、第一轮基础概念问题 1. Spring框架的核心容器是什么?它的作用是什么? Spring框架的核心容器是IoC(控制反转)容器。它的主要作用是管理对…...