当前位置: 首页 > 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的隐层神经元权重以及偏置都是随机产生的…...

m3u8网络视频文件下载方法

在windows下,使用命令行cmd的命令下载m3u8视频文件并保存为mp4文件。 1.下载ffmpeg,访问FFmpeg官方网站:https://www.ffmpeg.org/进行下载 ffmpeg下载,安装,操作说明 https://blog.csdn.net/m0_53157282/article/det…...

相机内参标定理论篇------张正友标定法

一、为什么做相机标定? 标定是为了得到相机坐标系下的点和图像像素点的映射关系,为摄影几何、计算机视觉等应用做准备。 二、为什么需要张正友标定法? 张正友标定法使手工标定相机成为可能,使相机标定不再需要精密的设备帮助。…...

鸿蒙 Window 环境的搭建

鸿蒙操作系统是国内自研的新一代的智能终端操作系统,支持多种终端设备部署,能够适配不同类别的硬件资源和功能需求。是一款面向万物互联的全场景分布式操作系统。 下载、安装与配置 DevEco Studio支持Windows系统和macOS系统 Windows系统配置华为官方推…...

新一代大语言模型在Amazon Bedrock引领人工智能潮流

亚马逊Bedrock平台推出全新Amazon Titan大语言模型,为大型数据集预处理提供强大支持。亚马逊云科技开发者大会演讲重点介绍了Amazon Titan在文本大语言模型领域的创新,以及如何通过Bedrock平台实现定制化应用。 亚马逊Bedrock平台的主要产品经理Brent S…...

kafka实现延迟消息

背景 我们知道消息中间件mq是支持延迟消息的发送功能的,但是kafka不支持这种直接的用法,所以我们需要独立实现这个功能,以下是在kafka中实现消息延时投递功能的一种方案 kafka实现延时消息 主要的思路是增加一个检测服务,这个检…...

python+django高校教材共享管理系统PyCharm 项目

本中原工学院教材共享平台采用的数据库是mysql,使用nodejs技术开发。在设计过程中,充分保证了系统代码的良好可读性、实用性、易扩展性、通用性、便于后期维护、操作方便以及页面简洁等特点。系统所要实现的功能分析,对于现在网络方便的管理&…...

三子棋(c语言)

前言: 三子棋是一种民间传统游戏,又叫九宫棋、圈圈叉叉棋、一条龙、井字棋等。游戏规则是双方对战,双方依次在9宫格棋盘上摆放棋子,率先将自己的三个棋子走成一条线就视为胜利。但因棋盘太小,三子棋在很多时候会出现和…...

09.kubernetes 部署calico / flannel网络插件

脚本中实现了 calico 和 flannel 这两种主流的网络插件,选择其中一种部署即可 1、calico calico架构 Calico是一个三层的虚拟网络解决方案,它把每个节点都当作虚拟路由器(vRouter),并把每个节点上的Pod都当作是节点路由器后的一个终端设备并为其分配一个IP地址。各节点…...

【DevOps 工具链】搭建 项目管理软件 禅道

文章目录 1、简介2、环境要求3、搭建部署环境3.1. 安装Apache服务3.2. 安装PHP环境(以php7.0为例 )3.3. 安装MySQL服务 4、搭建禅道4.1、下载解压4.2、 配置4.2.1、 启动4.2.2、自启动4.2.3、确认是否开机启动 5、成功安装 1、简介 禅道是国产开源项目管…...

ES6的默认参数和rest参数

✨ 专栏介绍 在现代Web开发中,JavaScript已经成为了不可或缺的一部分。它不仅可以为网页增加交互性和动态性,还可以在后端开发中使用Node.js构建高效的服务器端应用程序。作为一种灵活且易学的脚本语言,JavaScript具有广泛的应用场景&#x…...

深入理解WPF MVVM:探索数据绑定与命令的优雅之道

引言: WPF(Windows Presentation Foundation)是一种用于创建富客户端应用程序的框架,而MVVM(Model-View-ViewModel)则是一种在WPF中使用的架构模式。MVVM提供了一种优雅的方式来组织和管理应用程序的代码&a…...

ssrf之gopher协议的使用和配置,以及需要注意的细节

gopher协议 目录 gopher协议 (1)安装一个cn (2)使用Gopher协议发送一个请求,环境为:nc起一个监听,curl发送gopher请求 (3)使用curl发送http请求,命令为 …...

SVN下载安装(服务器与客户端)

1.下载 服务器下载:Download | VisualSVN Server 客户端下载:自行查找 2. 服务器安装 双击执行 运行 下一步 同意下一步 下一步 选中安装目录 3. 客户端安装 双击执行 下一步 4. 服务器创建仓库 5. 服务器创建用户 6. 客户端获取资源 文件夹右键...

SpringIOC之ApplicationObjectSupport

博主介绍:✌全网粉丝5W,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验…...

香橙派 ubuntu实现打通内网,外网双网络,有线和无线双网卡

当香橙派 ubuntu 连了有线,和无线时,默认请求外网时,只走一个网卡,如走了内网网卡,就只能访问内访问,访问不了外网;走了外网网卡就只能访问外网,访问不了内网; 实现双网…...

Spring Boot简单多线程定时任务实现 | @Async | @Scheduled

Spring Boot简单多线程定时任务实现 实现步骤 1 创建一个Spring Boot项目 2 定义定时任务: package com.jmd.timertasktest.task;import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.Async; impor…...

sklearn学习的一个例子用pycharm jupyter

环境 运行在jupyter 进行开发。即一个WEB端的开发工具。能适时显示开发的输出。后缀用的是ipynb.pycharm也可以支持。但也要提示按装jupyter. 或直接用andcoda 这里我们用pycharm进行项目创建 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple jupyterlab pip ins…...

JVM的生命周期

1.加载(Loading): 在加载阶段,JVM会找到并加载Java字节码文件。加载阶段分为三个步骤:通过类的全限定名找到对应的字节码文件,创建一个与该类相关的Class对象,将类的静态数据结构存储在方法区中…...

ElasticSearch--基本操作

ElasticSearch 完成ES安装 http://101.42.93.208:5601/app/dev_tools#/console 库的操作 创建索引库 请求方式:PUT 请求路径:/索引库名,可以自定义 请求参数:mapping映射 PUT /test {"mappings": {"propertie…...

大数据应用发展史:从搜索引擎时代到机器学习时代

文章目录 搜索引擎时代数据仓库时代数据挖掘时代机器学习时代小结 大数据技术的使用经历了一个发展过程 从最开始的Google在搜索引擎中开始使用大数据技术,到现在无处不在的各种人工智能应用,伴随着大数据技术的发展,大数据应用也从曲高和寡…...

java基础之String的不可变性

目录 概述 String是如何实现不可变的 String为何设计成不可变的 1.缓存和性能优化 2.安全性 3.线程安全性 4.API设计和预测性能 概述 String类的不可变性意味着一旦创建了一个字符串对象,它的值就不能被修改。 String是如何实现不可变的 查看源码 public …...

【JS】Promise详解

概述 在 JavaScript 中,Promise 是一个表示异步操作最终完成或失败的对象。它本质上是一个返回的对象,你可以附加回调函数,而不是将回调传递给函数。 let promise new Promise((resolve, reject) > {let condition true; // 这可以是某…...

原生微信小程序如何动态配置主题颜色及如何调用子组件的方法

一、最终效果 二、步骤 1、在初始化进入项目时,获取当前主题色 2、把主题色定义成全局变量(即在app.js中设置) 3、tabBar也需要定义全局变量,在首页时需要重新赋值 三、具体实现 1、app.js onLaunch () {//获取主题数据this.set…...

Java关键字(1)

Java中的关键字是指被编程语言保留用于特定用途的单词。这些关键字不能用作变量名或标识符。以下是Java中的一些关键字: public:表示公共的,可以被任何类访问。 private:表示私有的,只能被定义该关键字的类访问。 cl…...

【机器学习合集】深度生成模型 ->(个人学习记录笔记)

深度生成模型 深度生成模型基础 1. 监督学习与无监督学习 1.1 监督学习 定义 在真值标签Y的指导下,学习一个映射函数F,使得F(X)Y 判别模型 Discriminative Model,即判别式模型,又称为条件模型,或条件概率模型 生…...

Java将PDF转换为文本

在Java中&#xff0c;你可以使用现有的库来将PDF文件转换为文本。下面是一个简单的示例&#xff0c;使用Apache PDFBox库来实现PDF到文本的转换。首先&#xff0c;确保在你的项目中添加了Apache PDFBox库的依赖。你可以在 Maven 项目中添加以下依赖&#xff1a; <!--Pdf--&g…...

Linux 运维工具之1Panel

一、1Panel 简介 1Panel 是一个现代化、开源的 Linux 服务器运维管理面板。 特点&#xff1a; 快速建站&#xff1a;深度集成 Wordpress 和 Halo&#xff0c;域名绑定、SSL 证书配置等一键搞定&#xff1b;高效管理&#xff1a;通过 Web 端轻松管理 Linux 服务器&#xff0…...

深入了解小红书笔记详情API:为内容创新提供动力

一、小红书笔记详情API简介 小红书笔记详情API是一种允许开发者访问小红书平台上的笔记详细数据的接口。通过这个API&#xff0c;我们可以获取笔记的标题、内容、标签、点赞数、评论数等详细信息。这些数据对于内容创作者和品牌来说至关重要&#xff0c;可以帮助他们了解用户喜…...

Animate 2024(Adobe an2024)

Animate 2024是一款由Adobe公司开发的动画和互动内容创作工具&#xff0c;是Flash的演进版本。Animate 2024为设计师和开发者提供了更丰富的功能&#xff0c;让他们能够创建各种类型的动画、交互式内容和多媒体应用程序。 Animate 2024具有以下特点&#xff1a; 强大的设计工…...

尽量避免删改List

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 学习必须往深处挖&…...