【AutoML】AutoKeras 进行 RNN 循环神经网络训练

news2025/1/18 4:39:33

由于最近这些天都在人工审查之前的哪些问答数据,所以迟迟都没有更新 AutoKeras 的训练结果。现在那部分数据都已经整理好了,20w+ 的数据最后能够使用的高质量数据只剩下 2k+。这 2k+ 的数据已经经过数据校验并且对部分问题的提问方式和答案内容进行了不改变原意的重构,相信用这部分数据进行训练将会得到满意的效果。

在正式讲解之前,还是先将一些概念性的内容讲一下。

为什么选 AutoKeras?

首先作为一名人工智能的初学者是会存在选择困难症的(毕竟人工智能种类五花八门,各有各特色。学习和实施门槛也各不相同,挺难选择的),去生啃论文又看得云里雾里。再加上小公司要快速产出,上级一直输出压力,整个人会越来越焦躁,也越来越学不下去。就在这时我遇到了 AutoML 的 AutoKeras,它简直就是初学者的救星。

AutoKeras 基于 Keras,而 Keras 又基于 Tensorflow。Tensorflow 发展了这么久了社区非常庞大且活跃,小白不明白的地方要找查证资料也比较简单。除此之外,AutoKeras 通过结合使用神经网络搜索算法和贝叶斯优化来搜索给定数据集的最佳模型架构和超参数,因此它的参数几乎都是可选的。它的具体实现是先创建一组具有不同架构和超参数的模型,然后在数据集上对其进行评估。最后根据模型的性能对模型进行排名,并选择最佳模型(这对于初学者来说真的非常友好!!)。AutoKeras 还提供了易于使用的 API,供开发人员快速开始深度学习。简单来说,只要你会 Python,会调用 API,再准备好你的数据,就能快速构建和部署模型。公司领导是“面向结果”管理的,对于他来说你能够快速产出比什么都重要。

什么是 AutoML 模型?

AutoML(Automated Machine Learning)是指利用自动化技术来简化机器学习模型的构建和训练过程的方法。个人觉得 AutoML 的最大优势在于降低了使用机器学习的门槛,即使像我这种初学者也能够轻松使用。

什么是 CNN?什么是 RNN?

先说 CNN,CNN 是卷积神经网络(Convolutional Neural Network)的简写,它主要由卷积层(Convolutional Layer)、池化层(Pooling Layer)和全连接层(Fully Connected Layer)组成。简单来说,这三层的分工就是卷积层负责学习图像中的特征,池化层用于降低卷积层输出的空间维度,同时保留关键信息,而全连接层则用于将卷积和池化层的输出映射到最终的输出类别。基于这种特征,CNN 多用于处理和分析视觉数据,像图像识别、检测、生成等处理非常出色。

循环神经网络(Recurrent Neural Network,RNN)是一类用于处理序列数据的神经网络。它在处理序列数据时具有记忆性,可以保持对先前输入的记忆,并在处理新输入时使用这些记忆。RNN 的基本结构是通过将网络的输出反馈到输入中,以实现对序列数据的处理。而我们的目标是训练一个问答机器人,这种自然语言处理的人工智能非常适合使用 RNN 进行训练。

(那些太过高深的原理等等我也不太会,以上都是我看完了之后的一些总结,如有纰漏的地方请各位指正,谢谢)

开始训练

好了,上面基础概念的想说的都说了,下面就开始说说我是怎样做训练的吧。

更新第一篇文章中搭建的训练环境插件,如下图:

# 更新 pip
python3 -m pip install --upgrade pip
# 安装 pymysql 插件(因为数据需要从 mysql 中提取)
pip install pymysql

接着我就按照 AutoKeras 官网提供的例子进行了训练,但训练其实遇到了很多的问题。

第一次训练时我直接调用 TextClassifier 这个高级 API,然而在训练到第三循环时就报错了,如下图:

Search: Running Trial #3

Value             |Best Value So Far |Hyperparameter
bert              |transformer       |text_block_1/block_type
0                 |0                 |classification_head_1/dropout
adam_weight_decay |adam              |optimizer
2e-05             |0.001             |learning_rate
512               |None              |text_block_1/bert_block_1/max_sequence_length

Downloading data from https://storage.googleapis.com/keras-nlp/models/bert_base_en_uncased/v1/vocab.txt
Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/urllib/request.py", line 1350, in do_open
    h.request(req.get_method(), req.selector, req.data, headers,
...
ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1124)

....
    raise Exception(error_msg.format(origin, e.errno, e.reason))
Exception: URL fetch failure on https://storage.googleapis.com/keras-nlp/models/bert_base_en_uncased/v1/vocab.txt: None -- [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1124)

Trial 3 Complete [00h 00m 00s]

上面的报错说 block_type 在使用 bert 类型的时候就出现了错误,疑似是需要通过网络下载某些东西之后才能继续。既然就在原代码中加入以下两行代码来规避掉 https 的验证,如下图:

# 引入 ssl 模块
import ssl
# 设置 ssl 验证
ssl._create_default_https_context = ssl._create_unverified_context

加入以上代码后又可以继续训练了,接着又出现了以下报错,如下图:

Traceback (most recent call last):
  File "/Users/yuanzhenhui/Documents/code_space/git/processing/python/autokeras-env/phw2-industry-bot/model_train.py", line 130, in <module>
    main()
...
    raise e.with_traceback(filtered_tb) from None
  File "/Users/yuanzhenhui/Documents/code_space/git/processing/python/autokeras-env/lib/python3.8/site-packages/tensorflow/python/eager/execute.py", line 53, in quick_execute
    tensors = pywrap_tfe.TFE_Py_Execute(ctx._handle, device_name, op_name,
tensorflow.python.framework.errors_impl.InvalidArgumentError: Graph execution error:

indices[18] = -1 is not in [0, 50)
         [[{{node embedding_lookup}}]]
         [[IteratorGetNext]] [Op:__inference_test_function_7479]
Segmentation fault: 11

经过网上的搜索发现,这个问题是测试数据跟训练数据出现较大差异时造成的。

这是因为我的训练数据、测试数据和验证数据都是独立构造出来的,虽然都是存放在同一张表中,但由于数据量较为庞大,因此难以保证所有数据向量都一致的情况这仍然是数据质量的问题。由于并不知道具体那条数据存在问题,于是只能缩减取数的范围后进入下一轮训练,如下图:

Search: Running Trial #4

Value             |Best Value So Far |Hyperparameter
vanilla           |vanilla           |text_block_1/block_type
none              |none              |text_block_1/embedding_1/pretraining
64                |64                |text_block_1/embedding_1/embedding_dim
0.25              |0.25              |text_block_1/embedding_1/dropout
5                 |5                 |text_block_1/conv_block_1/kernel_size
False             |False             |text_block_1/conv_block_1/separable
False             |False             |text_block_1/conv_block_1/max_pooling
1                 |1                 |text_block_1/conv_block_1/num_blocks
1                 |1                 |text_block_1/conv_block_1/num_layers
256               |256               |text_block_1/conv_block_1/filters_0_0
512               |512               |text_block_1/conv_block_1/filters_0_1
0                 |0                 |text_block_1/conv_block_1/dropout
64                |64                |text_block_1/conv_block_1/filters_1_0
256               |256               |text_block_1/conv_block_1/filters_1_1
0                 |0                 |classification_head_1/dropout
adam              |adam              |optimizer
0.001             |0.001             |learning_rate

Traceback (most recent call last):
  File "/Users/yuanzhenhui/Documents/code_space/git/processing/python/autokeras-env/lib/python3.8/site-packages/keras_tuner/src/engine/base_tuner.py", line 273, in _try_run_and_update_trial
    self._run_and_update_trial(trial, *fit_args, **fit_kwargs)
...
    max_tokens = self.max_tokens or hp.Choice(
  File "/Users/yuanzhenhui/Documents/code_space/git/processing/python/autokeras-env/lib/python3.8/site-packages/keras_tuner/src/engine/hyperparameters/hyperparameters.py", line 300, in Choice
    return self._retrieve(hp)
  File "/Users/yuanzhenhui/Documents/code_space/git/processing/python/autokeras-env/lib/python3.8/site-packages/keras_tuner/src/engine/hyperparameters/hyperparameters.py", line 208, in _retrieve
    return self.values[hp.name]
KeyError: 'text_block_1/max_tokens'

Trial 4 Complete [00h 00m 04s]

Best val_loss So Far: 4.101563930511475
Total elapsed time: 00h 24m 03s

又来了一个新问题,“实际 tokens 长度大于最大 tokens 长度”导致无法继续训练下去。其实这个问题才是 AutoML 较为致命的。因为 AutoML 会自动调整参数,这也许会将部分参数调整过大,导致最终超出了硬件可支持的阈值。而且这事儿出现概率还挺高的,因此你最好提前设定最大值让 AutoML 不要自动给你调这个参数了,或者你提供足够的资源其实也行。毕竟谁都不想训练好几天最终因为超出阈值终止训练。不过还好在 AutoKeras 中是提供参数选择是否对训练好的内容进行覆盖的,如果不覆盖那么原来训练好的数据还是会保留。

言归正传,上面这个报错只需要将 max_tokens 参数调大就可以了(下面将提供完成代码)。

最后我想说的是,做这个训练还是要用 GPU 来做吧,虽然 AutoKeras 也继承了 Tensorflow 可以使用 CPU 来进行训练,但是速度太慢了。因此还是建议各位在做训练的时候先找一台 Windows 的机器,里面装好 Nvidia 显卡配置好 CUDA 和 cuDNN。我自己亲测,快的不是一丁半点。

好了,上关键代码如下图:

...
def ak_qa_train_main(page, page_size):
    ...
    if tr_data.shape[0] != 0:
        # 自定义训练模型整理
        text_input = ak.TextInput()
        
        # 直接使用 textblock 来对数据进行训练
        text_output = text_block_model(text_input)
        model = ak.AutoModel(inputs=text_input, outputs=text_output, project_name=auto_model_path, overwrite=True)
        
        # 训练模型
        model_fit = model.fit(tr_data[:, 0], tr_data[:, 1], batch_size=32, validation_split=0.15)
        
        print('history dict:', model_fit.history)
        
        # 将训练好的模型导出
        model.export_model().save(export_model_path, save_format="tf")
    ...

def text_block_model(input_node):
    output_cnn_block = ak.TextBlock(max_tokens=200000)(input_node)

    output_rnn_block = ak.TextToIntSequence(output_sequence_length=32, max_tokens=200000)(input_node)
    output_rnn_block = ak.Embedding()(output_rnn_block)
    output_rnn_block = ak.Normalization()(output_rnn_block)
    
    output_rnn_block = ak.RNNBlock(layer_type="lstm", return_sequences=True)(output_rnn_block)
    output_rnn_block = ak.DenseBlock()(output_rnn_block)
    output_block = ak.Merge()([output_cnn_block, output_rnn_block])
    return ak.ClassificationHead()(output_block)
...

以上代码中 ak_qa_train_main 内代码为第一处关键代码,这里我并没有用到 AutoKeras 的高级 API 进行训练(经过反复的试验发现高级 API 存在大量使用约束)而采用了自定义模型(AutoModel)的方式进行训练,因此我必须在训练前先定义好训练模型。

训练模型需要一个数据输入,而由于我们是文本的训练数据,因此需要实例化一个 TextInput 作为训练数据输入。

而 text_block_model 方法则作为训练流程被使用(此处为第二处关键代码,下面会详细说明),它的返回将会作为训练结果进行输出。这样我们就有了输入和输出了,之后就可以将其指定到 AutoModel 的对应参数中。

AutoModel 执行之后将会得到一个 model 对象,有了 model 对象就能够进行真实的训练了,这时你只需要调用 fit API 就能执行训练。其中 fit 的第一个参数应该传入“问题”数据集,第二个参数传入“答案”数据集,第三个参数 batch_size 就是一次性提取训练数据的批次大小。

之后我们需要通过 model_fit.history 查看一下模型的损失(loss)和准确度(accuracy),用于判断模型是否适用。最后我们会通过 model.export_model().save() 来保存模型,然后通过 loss 和 accuracy 判断究竟保留哪个模型,删除掉那个模型。

这样我们就已经将训练的基础配置和调用代码写好了,是不是非常简单。

那么接下来我们就来说说第二处关键代码 text_block_model ,如下图:

def text_block_model(input_node):
    output_cnn_block = ak.TextBlock(max_tokens=200000)(input_node)

    output_rnn_block = ak.TextToIntSequence(output_sequence_length=32, max_tokens=200000)(input_node)
    output_rnn_block = ak.Embedding()(output_rnn_block)
    output_rnn_block = ak.Normalization()(output_rnn_block)
    
    output_rnn_block = ak.RNNBlock(layer_type="lstm", return_sequences=True)(output_rnn_block)
    output_rnn_block = ak.DenseBlock()(output_rnn_block)
    output_block = ak.Merge()([output_cnn_block, output_rnn_block])
    return ak.ClassificationHead()(output_block)

这段代码主要是描述整个模型的训练结构的。

首先在接收到输入数据后,数据将会传入 TextBlock 进行 CNN 数据特征提取。这里的 TextBlock 是 AutoKeras 的高级 API ,它会在训练过程中自动调整。同时,TextBlock 也提供了 max_tokens 参数,通过查看源码得知默认 max_tokens 只有 5000,如下图:
image.png
这样索性调整到 200000 应该够用。

注意!!!

这个是重点,使用 TextBlock 是需要它对问答数据进行数据特征提取,这使得 TextBlock 的存在非常重要的。而且 TextBlock 能自动调整参数,在不清楚那种参数能够更好的提取到特征的情况下,TextBlock 能够自动帮助我找到所需的模型参数,这非常方便。

ok,除了 TextBlock 外我还写了一个 RNN 训练分支。首先数据会先通过 TextToIntSequence 将文本转换为数字序列,这里将句子的最大长度(output_sequence_length)设置为 32,避免自动调参时这个参数设置过高的情况。此外,TextToIntSequence 也有提供 max_tokens 参数的,顺手将这个参数也设置为 200000 吧。

然后通过 Embedding 将数字序列转换为稠密向量,之后经过 Normalization 对稠密向量进行归一化处理,之后就可以送去给 RNNBlock 进行 RNN 训练了,这里指定了使用 lstm 类型进行训练,就不需要 AutoKeras 自动选择 gru 了。训练之后的数据将会经过 DenseBlock 使用全连接层生成下一个词,最后将 TextBlock 输出和 RNN 训练输出通过 Merge 方法进行合并,最后通过 ClassificationHead 进行汇聚输出。

由于没有设置训练回数,因此不可能将默认训练的 100 次输出都展示出来,这里就只截取其中一个比较有代表性的结果,如下图:

Search: Running Trial #9

Value             |Best Value So Far |Hyperparameter
transformer       |transformer       |text_block_1/block_type
none              |none              |embedding_1/pretraining
128               |128               |embedding_1/embedding_dim
0.25              |0.25              |embedding_1/dropout
True              |True              |rnn_block_1/bidirectional
2                 |2                 |rnn_block_1/num_layers
False             |False             |dense_block_1/use_batchnorm
2                 |2                 |dense_block_1/num_layers
32                |32                |dense_block_1/units_0
0                 |0                 |dense_block_1/dropout
32                |32                |dense_block_1/units_1
add               |add               |merge_1/merge_type
0.25              |0.25              |classification_head_1/dropout
adam              |adam              |optimizer
0.001             |0.001             |learning_rate
none              |none              |text_block_1/transformer_1/pretraining
128               |128               |text_block_1/transformer_1/embedding_dim
8                 |8                 |text_block_1/transformer_1/num_heads
2048              |2048              |text_block_1/transformer_1/dense_dim
0                 |0                 |text_block_1/transformer_1/dropout
1024              |None              |text_block_1/dense_block_1/units_2
256               |128               |text_block_1/text_to_int_sequence_1/output_sequence_length
flatten           |global_avg        |text_block_1/spatial_reduction_1/reduction_type
True              |False             |text_block_1/dense_block_1/use_batchnorm
1                 |1                 |text_block_1/dense_block_1/num_layers
1024              |512               |text_block_1/dense_block_1/units_0
0.5               |0                 |text_block_1/dense_block_1/dropout
64                |256               |text_block_1/dense_block_1/units_1

Epoch 1/1000
75/75 [==============================] - 12s 115ms/step - loss: 8.0654 - accuracy: 0.0000e+00 - val_loss: 467.1426 - val_accuracy: 0.0000e+00
Epoch 2/1000
75/75 [==============================] - 8s 103ms/step - loss: 6.8244 - accuracy: 0.0967 - val_loss: 272.3265 - val_accuracy: 0.0000e+00
Epoch 3/1000
75/75 [==============================] - 6s 86ms/step - loss: 2.3318 - accuracy: 0.5792 - val_loss: 353.9221 - val_accuracy: 0.0000e+00
Epoch 4/1000
75/75 [==============================] - 6s 86ms/step - loss: 0.5466 - accuracy: 0.9150 - val_loss: 392.8975 - val_accuracy: 0.0000e+00
Epoch 5/1000
75/75 [==============================] - 8s 104ms/step - loss: 0.2716 - accuracy: 0.9563 - val_loss: 268.3076 - val_accuracy: 0.0000e+00
Epoch 6/1000
75/75 [==============================] - 6s 86ms/step - loss: 0.1708 - accuracy: 0.9708 - val_loss: 304.3133 - val_accuracy: 0.0000e+00
Epoch 7/1000
75/75 [==============================] - 6s 87ms/step - loss: 0.1353 - accuracy: 0.9742 - val_loss: 352.0239 - val_accuracy: 0.0000e+00
Epoch 8/1000
75/75 [==============================] - 6s 87ms/step - loss: 0.0840 - accuracy: 0.9850 - val_loss: 313.1510 - val_accuracy: 0.0000e+00
Epoch 9/1000
75/75 [==============================] - 6s 86ms/step - loss: 0.0726 - accuracy: 0.9858 - val_loss: 315.7093 - val_accuracy: 0.0000e+00
Epoch 10/1000
75/75 [==============================] - 6s 86ms/step - loss: 0.0571 - accuracy: 0.9896 - val_loss: 328.4327 - val_accuracy: 0.0000e+00
Epoch 11/1000
75/75 [==============================] - 6s 86ms/step - loss: 0.0457 - accuracy: 0.9921 - val_loss: 278.0609 - val_accuracy: 0.0000e+00
Epoch 12/1000
75/75 [==============================] - 6s 86ms/step - loss: 0.0606 - accuracy: 0.9896 - val_loss: 463.8227 - val_accuracy: 0.0000e+00
Epoch 13/1000
75/75 [==============================] - 6s 86ms/step - loss: 0.0290 - accuracy: 0.9942 - val_loss: 336.2177 - val_accuracy: 0.0000e+00
Epoch 14/1000
75/75 [==============================] - 6s 86ms/step - loss: 0.0212 - accuracy: 0.9962 - val_loss: 320.1093 - val_accuracy: 0.0000e+00
Epoch 15/1000
75/75 [==============================] - 8s 103ms/step - loss: 0.0166 - accuracy: 0.9962 - val_loss: 257.0939 - val_accuracy: 0.0000e+00
Epoch 16/1000
75/75 [==============================] - 6s 86ms/step - loss: 0.0179 - accuracy: 0.9954 - val_loss: 371.0593 - val_accuracy: 0.0000e+00
Epoch 17/1000
75/75 [==============================] - 6s 86ms/step - loss: 0.0153 - accuracy: 0.9967 - val_loss: 347.0213 - val_accuracy: 0.0000e+00
Epoch 18/1000
75/75 [==============================] - 6s 86ms/step - loss: 0.0158 - accuracy: 0.9975 - val_loss: 348.9128 - val_accuracy: 0.0000e+00
Epoch 19/1000
75/75 [==============================] - 6s 86ms/step - loss: 0.0222 - accuracy: 0.9942 - val_loss: 387.7633 - val_accuracy: 0.0000e+00
Epoch 20/1000
75/75 [==============================] - 6s 86ms/step - loss: 0.0113 - accuracy: 0.9987 - val_loss: 371.1013 - val_accuracy: 0.0000e+00
Epoch 21/1000
75/75 [==============================] - 6s 86ms/step - loss: 0.0067 - accuracy: 0.9996 - val_loss: 271.1282 - val_accuracy: 0.0000e+00
Epoch 22/1000
75/75 [==============================] - 6s 86ms/step - loss: 0.0147 - accuracy: 0.9975 - val_loss: 355.8381 - val_accuracy: 0.0000e+00
Epoch 23/1000
75/75 [==============================] - 8s 103ms/step - loss: 0.0046 - accuracy: 1.0000 - val_loss: 204.0495 - val_accuracy: 0.0000e+00
Epoch 24/1000
75/75 [==============================] - 6s 86ms/step - loss: 0.0083 - accuracy: 0.9992 - val_loss: 272.5107 - val_accuracy: 0.0000e+00
Epoch 25/1000
75/75 [==============================] - 6s 86ms/step - loss: 0.0062 - accuracy: 0.9992 - val_loss: 314.7820 - val_accuracy: 0.0000e+00
Epoch 26/1000
75/75 [==============================] - 6s 87ms/step - loss: 0.0186 - accuracy: 0.9975 - val_loss: 384.4933 - val_accuracy: 0.0000e+00
Epoch 27/1000
75/75 [==============================] - 6s 86ms/step - loss: 0.0121 - accuracy: 0.9987 - val_loss: 426.2129 - val_accuracy: 0.0000e+00
Epoch 28/1000
75/75 [==============================] - 6s 87ms/step - loss: 0.0061 - accuracy: 0.9996 - val_loss: 496.2940 - val_accuracy: 0.0000e+00
Epoch 29/1000
75/75 [==============================] - 6s 86ms/step - loss: 0.0148 - accuracy: 0.9975 - val_loss: 494.6873 - val_accuracy: 0.0000e+00
Epoch 30/1000
75/75 [==============================] - 6s 86ms/step - loss: 0.0141 - accuracy: 0.9975 - val_loss: 678.3535 - val_accuracy: 0.0000e+00
Epoch 31/1000
75/75 [==============================] - 6s 87ms/step - loss: 0.0123 - accuracy: 0.9975 - val_loss: 675.3771 - val_accuracy: 0.0000e+00
Epoch 32/1000
75/75 [==============================] - 6s 86ms/step - loss: 0.0124 - accuracy: 0.9979 - val_loss: 683.1956 - val_accuracy: 0.0000e+00
Epoch 33/1000
75/75 [==============================] - 6s 87ms/step - loss: 0.0090 - accuracy: 0.9992 - val_loss: 617.5909 - val_accuracy: 0.0000e+00

Trial 9 Complete [00h 03m 46s]
val_loss: 204.0495147705078

Best val_loss So Far: 7.96969747543335
Total elapsed time: 00h 13m 37s

这个是第 9 次训练的输出,其他输出都跟这个差不多就不截取出来了。可以看到训练损失率低,准确度高,但是验证的损失率高,准确率低。这可不是什么好事儿,这个结果证明目前的模型存在过拟合的情况(估计是因为训练的数据太少所致的)。过拟合会导致模型过度依赖于训练数据的特定特征和噪声,而未能泛化到其他数据。

话虽这样,但至少证明方向是对的,如果继续走这条路的话后面就加大泛化数据训练就好。但这个并非最终目标,后面我会用 transformer 对中药材数据进行重新训练,届时将会再增加训练数据量级,等有具体结果我会再更新人工智能系列的文章,我们 transformer 再见。

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

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

相关文章

前端秘法引言(配置vscode, 以及html的基础)

目录 一.配置环境vscode 二.配置插件 三.vscode的实用小技巧 四.标题段落换行标签 五.格式化标签 一.配置环境vscode vscode官网https://code.visualstudio.com/ 点击右上角的download 根据不同的操作系统进行下载安装,我这里选的是Windows x64 安装好后打开,点击左上角的…

React官网摘抄

https://react.dev/learn 1、组件名称大写 2、变量&#xff0c;用{} vue中用{{}} react中用{}3、遍历 4、state使用

Python算法题集_LRU 缓存

Python算法题集_LRU 缓存 题146&#xff1a;LRU 缓存1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【队列字典】2) 改进版一【有序字典】3) 改进版二【双向链表字典】 4. 最优算法 本文为Python算法题集之一的代码示例 题146&#xff1a;LRU …

基于AI Agent探讨:安全领域下的AI应用范式

先说观点&#xff1a;关于AI应用&#xff0c;通常都会聊准召。但在安全等模糊标准的场景下&#xff0c;事实上不存在准召的定义。因此&#xff0c;AI的目标应该是尽可能的“像人”。而想要评价有多“像人”&#xff0c;就先需要将人的工作数字化。而AI Agent是能够将数字化、自…

C++ //练习 6.27 编写一个函数,它的参数是initializer_list<int>类型的对象,函数的功能是计算列表中所有元素的和。

C Primer&#xff08;第5版&#xff09; 练习 6.27 练习 6.27 编写一个函数&#xff0c;它的参数是initializer_list类型的对象&#xff0c;函数的功能是计算列表中所有元素的和。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块…

现代化端口扫描工具RustScan

今天是大年初五&#xff0c;喜迎财神 &#xff0c;祝大家✔️顺风顺水 ✔️诸事如意 ✔️财源滚滚 ✔️大吉大利 顺便提一下&#xff0c;老苏的博客启用了新域名&#xff1a; https://laosu.tech 什么是 RustScan &#xff1f; RustScan 是一款现代化的端口扫描器。能快速找到端…

学生成绩管理系统|基于Springboot的学生成绩管理系统设计与实现(源码+数据库+文档)

学生成绩管理系统目录 目录 基于Springboot的学生成绩管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、管理员功能模块 2、学生功能模块 3、教师功能模块 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源…

选台灯的正确指标?分享考公必备的护眼台灯

台灯作为家居类不可或缺的一种照明灯具&#xff0c;在我们的日常生活中发挥着重要作用&#xff0c;不管是学生党学习阅读&#xff0c;还是办公族加班工作等等&#xff0c;都离不开它的存在。不过台灯也是有着优劣之分的&#xff0c;如果使用了一款质量不好的台灯&#xff0c;时…

CTFshow web(php命令执行59-67)

web59 <?php /* # -*- coding: utf-8 -*- # Author: Lazzaro # Date: 2020-09-05 20:49:30 # Last Modified by: h1xa # Last Modified time: 2020-09-07 22:02:47 # email: h1xactfer.com # link: https://ctfer.com */ // 你们在炫技吗&#xff1f; if(isset($_POST…

AutoGen实战应用(三):多代理协作的数据可视化

之前我完成了关于AutoGen的两篇博客&#xff0c;还没有读过这两篇博客的朋友可以先阅读以下&#xff0c;这样有助于对AutoGen的初步了解&#xff1a; AutoGen实战应用(一)&#xff1a;代码生成、执行和调试_autogen 支持的model-CSDN博客 AutoGen实战应用(二)&#xff1a;多代…

Imgui(1) | 基于imgui-SFML改进自由落体小球

Imgui(1) | 基于imgui-SFML改进自由落体小球 0. 简介 使用 SFML 做2D图形渲染的同时&#xff0c;还想添加一个按钮之类的 GUI Widget, 需要用 Dear Imgui。由于 Imgui 对于2D图形渲染并没有提供类似 SFML 的 API, 结合它们两个使用是一个比较好的方法, 找到了 imgui-SFML 这个…

nvm 安装nodejs教程【详细】

目录 一、安装nvm 二、配置镜像 三、安装nodejs 安装 查看正在用的nodejs版本 切换版本 一、安装nvm 双击安装包&#xff1a; 无脑下一步即可&#xff0c;当然你可以自定义你自己的安装目录。 安装完后&#xff0c;打开环境变量&#xff0c;你会发现nvm为我们自动配置好…

【51单片机】定时器(江科大)

7.1定时器 1.定时器介绍: 51单片机的定时器属于单片机的内部资源,其电路的连接和运转均在单片机内部完成 2. 定时器作用: (1)用于计时系统,可实现软件计时,或者使程序每隔一固定时间完成一项操作 (2)替代长时间的Delay,提高CPU的运行效率和处理速度 定时器在单片机内部就像一个…

Rust入门:如何在windows + vscode中关闭程序codelldb.exe

在windows中用vscode单步调试rust程序的时候&#xff0c;发现无论是按下stop键&#xff0c;还是运行完程序&#xff0c;调试器codelldb.exe一直霸占着主程序不退出&#xff0c;如果此时对代码进行修改&#xff0c;后续就没法再编译调试了。 目前我也不知道要怎么处理这个事&am…

javaspringbootMySQL高考志愿选择系统68335-计算机毕业设计项目选题推荐(附源码)

目 录 摘要 第1章 绪论 1.1 研究背景与意义 1.2 研究现状 1.3论文结构与章节安排 第2章 相关技术 2.1开发技术 2.2 Java简介 2.3 MVVM模式 2.4 B/S结构 2.5 MySQL数据库 2.6 SpringBoot框架介绍 第3章 系统分析 3.1 可行性分析 3.2 系统流程分析 3.2.1 数…

机械革命混合模式和独显直连互相切换

原文&#xff1a;https://blog.iyatt.com/?p13773 默认状态是混合输出&#xff0c;在任务管理器中可以看到两个 GPU&#xff0c;分别是核显和独显 从混合模式切换到独显直连可以通过机械革命电竞控制台&#xff08;重装过系统的需要去官网下载安装驱动&#xff09; 打开后…

4核8G服务器支持多少人同时在线访问?

腾讯云4核8G服务器支持多少人在线访问&#xff1f;支持25人同时访问。实际上程序效率不同支持人数在线人数不同&#xff0c;公网带宽也是影响4核8G服务器并发数的一大因素&#xff0c;假设公网带宽太小&#xff0c;流量直接卡在入口&#xff0c;4核8G配置的CPU内存也会造成计算…

神经网络 | CNN 与 RNN——深度学习主力军

Hi&#xff0c;大家好&#xff0c;我是半亩花海。本文主要将卷积神经网络&#xff08;CNN&#xff09;和循环神经网络&#xff08;RNN&#xff09;这两个深度学习主力军进行对比。我们知道&#xff0c;从应用方面上来看&#xff0c;CNN 用于图像识别较多&#xff0c;而 RNN 用于…

leetcode(数组)128.最长连续序列(c++详细解释)DAY8

文章目录 1.题目示例提示 2.解答思路3.实现代码结果 4.总结 1.题目 给定一个未排序的整数数组 nums &#xff0c;找出数字连续的最长序列&#xff08;不要求序列元素在原数组中连续&#xff09;的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 示例 1&a…

《UE5_C++多人TPS完整教程》学习笔记14 ——《P15 创建我们自己的子系统(Creating Our Own Subsystem)》

本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P15 创建我们自己的子系统&#xff08;Creating Our Own Subsystem&#xff09;》 的学习笔记&#xff0c;该系列教学视频为 Udemy 课程 《Unreal Engine 5 C Multiplayer Shooter》 的中文字幕翻译版&#xff0c;UP主&…