tensorflow2(快速入门)

版本问题

导包

import tensorflow as tf

加载数据

加载并准备 MNIST 数据集。将样本数据从整数转换为浮点数:

mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0

搭建模型

通过堆叠层来构建 tf.keras.Sequential 模型。

model = tf.keras.models.Sequential([tf.keras.layers.Flatten(input_shape=(28, 28)),tf.keras.layers.Dense(128, activation='relu'),tf.keras.layers.Dropout(0.2),tf.keras.layers.Dense(10)
])
  1. Flatten 层:

    • 作用: 将输入的二维数据(如图像)展平为一维。这对于将图像数据传递给全连接层(Dense layer)是必要的,因为全连接层通常接受一维输入。
    • 参数input_shape (tuple) - 输入数据的形状。这里 (28, 28) 表示输入数据是 28x28 的二维数组(如 MNIST 图像)。
  2. Dense 层:

    • 作用: 全连接层,每个神经元与前一层的每一个神经元都连接。它对输入数据进行线性变换,并通过激活函数引入非线性。
    • 参数:
      • units (int) - 神经元的数量。这决定了该层的输出维度。例如,这里是 128。
      • activation (str or function) - 激活函数,用于引入非线性。这里使用的是 'relu'(Rectified Linear Unit),它将负值置为零,正值保持不变。
  3. Dropout 层:

    • 作用: 用于正则化,防止模型过拟合。它在训练过程中随机“丢弃”或忽略一定比例的神经元,减少过拟合的风险。
    • 参数:
      • rate (float) - 表示丢弃的比例。在这里,0.2 表示在训练过程中,有 20% 的神经元会被随机忽略。
  4. Dense 层(输出层):

    • 作用: 这是模型的输出层,用于生成最终的预测结果。这里的输出层没有激活函数,意味着它将计算线性输出值。
    • 参数:
      • units (int) - 神经元的数量。这里是 10,通常对应于分类问题中的类别数(例如 MNIST 数据集中有 10 个数字类别)。

对于每个样本,模型都会返回一个包含 logits 或 log-odds 分数的向量,每个类一个。

predictions = model(x_train[:1]).numpy()
predictions

[[-0.06230168 -0.4859897  -0.4349398   0.502046    0.8077229   0.466933
  -0.27846724 -0.13608396 -0.27969462  0.17068624]]

在深度学习模型中,特别是在分类任务中,model(x_train[:1]).numpy() 返回的是模型对于输入样本的预测结果。这些结果通常是 logits 或 log-odds 分数,具体的理解如下:

  • Logits: Logits 是模型的原始输出值,通常是经过最后一层线性变换得到的。它们表示每个类别的相对得分,并且通常不会直接用于概率预测。Logits 可以看作是每个类的未归一化的得分。

model(x_train[:1]) 调用模型对输入 x_train[:1](一个样本)的预测,返回的是 logits。这些 logits 是一个包含每个类分数的向量。

例如,假设模型是一个用于 MNIST 手写数字分类的神经网络,并且模型的最后一层是一个全连接层,其输出维度为 10(因为 MNIST 有 10 个类别)。对于一个输入样本,model(x_train[:1]) 可能返回一个形如 [[-0.5, 2.3, 0.1, ..., 1.2]] 的数组,这里的每个值都代表了对应类别的 logits。

为了从 logits 转换为概率,通常会使用 Softmax 函数。Softmax 函数将 logits 转换为概率分布,使得所有类别的概率和为 1

tf.nn.softmax 函数将这些 logits 转换为每个类的概率

print(tf.nn.softmax(predictions).numpy())

[[0.07015824 0.18569683 0.05213543 0.04906429 0.13317907 0.02939027
  0.10510781 0.115359   0.10000554 0.15990353]]

注:可以将 tf.nn.softmax 烘焙到网络最后一层的激活函数中。虽然这可以使模型输出更易解释,但不建议使用这种方式,因为在使用 softmax 输出时不可能为所有模型提供精确且数值稳定的损失计算。

使用 losses.SparseCategoricalCrossentropy 为训练定义损失函数,它会接受 logits 向量和 True 索引,并为每个样本返回一个标量损失。

loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)

此损失等于 true 类的负对数概率:如果模型确定类正确,则损失为零。

tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True) 是 TensorFlow 中用于多分类任务的损失函数。在训练过程中,它用于衡量模型预测的类别概率分布与真实类别标签之间的差距。让我们详细解释一下这段代码和其含义:

这里 SparseCategoricalCrossentropy 是一个损失函数,专门用于处理类别标签为整数索引(而不是 one-hot 编码)的分类任务。

  • from_logits=True: 这个参数表示模型的输出是 logits(未经 softmax 激活的原始预测分数)。如果 from_logits=False,则表示模型的输出已经经过 softmax 激活,变成了概率分布。在这种情况下,损失函数会内部应用 softmax 来计算类别概率。

SparseCategoricalCrossentropy 计算的是交叉熵损失,它衡量的是模型预测的概率分布与实际标签分布之间的差异。具体来说,它计算了 true 类别的负对数概率。这个损失函数的公式如下:

loss = -log(softmax(z)_{i})

其中:

  • z \) 是模型输出的 logits 向量。
  • 真实标签 i 是 logits 向量中实际的类别索引。
  1. Logits 输入: 模型输出的是一个 logits 向量,每个元素表示一个类别的未归一化的预测分数。假设有三个类别,模型的 logits 输出可能是[2.0,1.0,0.1]。

  2. Softmax 应用: 损失函数内部会对 logits 应用 softmax 函数,将其转换为概率分布。对于上述 logits,softmax 计算的结果可能是[0.7,0.2,0.1]。

  3. 计算负对数概率: 根据实际标签,找到正确类别的概率并取其负对数。例如,如果真实标签是类别 0,对应的概率是 0.7,损失就是 −log(0.7)。

在深度学习中,使用 from_logits=True 的 SparseCategoricalCrossentropy 损失函数意味着模型输出的是 logits(即未经 softmax 归一化的原始预测分数)。

  1. 选择合适的输出层

    • 没有激活函数:模型的最后一层(输出层)应该是一个全连接层(Dense 层),但不需要应用 softmax 激活函数。这样,网络输出的是 logits。

    • 示例代码

      import tensorflow as tf# 假设分类任务有 10 个类别
      num_classes = 10model = tf.keras.Sequential([tf.keras.layers.Dense(128, activation='relu', input_shape=(784,)),tf.keras.layers.Dense(num_classes)  # 这里没有激活函数
      ])
      

    在上述示例中,Dense(num_classes) 输出了一个形状为 (batch_size, num_classes) 的 logits 张量。

  2. 定义损失函数

    • 使用 from_logits=True 的 SparseCategoricalCrossentropy 损失函数来计算损失。

    • 示例代码

      loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
  3. 编译

  •  在开始训练之前,使用 Keras Model.compile 配置和编译模型。将 optimizer 类设置为 adam,将 loss 设置为您之前定义的 loss_fn 函数,并通过将 metrics 参数设置为 accuracy 来指定要为模型评估的指标。

    model.compile(optimizer='adam',loss=loss_fn,metrics=['accuracy'])

训练模型

  • 训练模型时,确保目标标签(ground truth labels)是整数索引(而不是 one-hot 编码)。

  • 示例代码

    model.fit(train_data, train_labels, epochs=5, batch_size=32)

使用 from_logits=True 的好处

  1. 数值稳定性

    • 避免数值不稳定性:直接对 logits 应用 softmax 可能导致数值不稳定性,尤其是在极端值的情况下(例如 logits 的绝对值非常大)。使用 from_logits=True 的损失函数内部会更稳定地处理这个过程,减轻数值不稳定问题。
  2. 性能优化

    • 更高效的计算:损失函数会内部处理 softmax 和交叉熵的计算,这可以避免在模型中额外计算 softmax。尤其在训练大型模型时,这可以减少计算开销和内存使用。
  3. 简化模型设计

    • 模型更简洁:在模型中不需要额外添加 softmax 层,使得模型结构更简洁。这样可以减少模型复杂度和潜在的错误来源。

让我们更详细地讨论 model.compile 方法的参数,并通过一些实际场景的例子来说明它们的用途。

1. optimizer

描述: 优化器是训练过程中用于更新模型权重的算法。不同的优化器具有不同的更新规则。

常见选择:

  • 'adam': 自适应动量优化器,通常效果很好,适合大多数任务。
  • 'sgd': 随机梯度下降,常与动量(momentum)一起使用。
  • 'rmsprop': 根均方根传播,适用于处理稀疏梯度问题。

示例场景:

  • 场景: 在训练一个用于图像分类的卷积神经网络(CNN)。希望模型在训练时快速收敛且能处理各种学习率的情况。
  • 代码:
    model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
    

2. loss

描述: 损失函数用来衡量模型预测结果与实际标签之间的差距。在训练过程中,优化器会最小化这个损失函数。

常见选择:

  • 'categorical_crossentropy': 适用于多类别分类任务,目标是 one-hot 编码
  • 'sparse_categorical_crossentropy': 适用于多类别分类任务,目标是整数标签
  • 'mean_squared_error': 适用于回归任务,计算预测值与实际值的均方误差。

示例场景:

  • 场景: 进行房价预测任务,目标是通过特征预测房屋价格。目标是连续的实数。
  • 代码:
    model.compile(optimizer='adam', loss='mean_squared_error', metrics=['mae'])
    

3. loss_weights

描述: 如果模型有多个输出,可以为每个输出指定不同的损失权重。这对训练复杂模型很有用。

示例场景:

  • 场景: 你在进行多任务学习,一个模型同时进行图像分类和物体检测。你希望分类任务的损失对总损失的贡献比检测任务大。
  • 代码:
    model.compile(optimizer='adam', loss=['categorical_crossentropy', 'mean_squared_error'],loss_weights=[0.7, 0.3],metrics=['accuracy'])
    

4. metrics

描述: 评估指标用于监控模型在训练和验证过程中的性能。它们不影响模型训练,但提供了有关模型性能的有用信息。

常见选择:

  • 'accuracy': 常用于分类任务,表示预测准确率。
  • 'mae': 平均绝对误差,常用于回归任务。
  • 'mse': 均方误差,回归任务的另一个常用指标。

示例场景:

  • 场景: 在训练一个二分类模型,如垃圾邮件分类器。希望监控模型的准确率。
  • 代码:
    model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
    

5. loss_reduction

描述: 指示如何将损失值从单个样本聚合成批次损失值。主要用于处理自定义损失函数时的行为控制。

示例场景:

  • 场景: 使用自定义损失函数,并希望控制损失聚合的方式(例如,取平均或求和)。
  • 代码:
    model.compile(optimizer='adam', loss=tf.keras.losses.MeanSquaredError(reduction=tf.keras.losses.Reduction.SUM))
    

6. weighted_metrics

描述: 计算加权指标,可以根据样本权重调整指标值。

示例场景:

  • 场景: 在处理类别不平衡的数据集时,你希望按样本权重计算指标。
  • 代码:
    model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'], weighted_metrics=['accuracy'])
    

7. run_eagerly

描述: 如果设置为 True,模型将以 Eager Execution 模式运行,这有助于调试,但可能导致训练速度变慢。

示例场景:

  • 场景: 你在调试模型,并需要逐步检查每一步的执行情况。
  • 代码:
    model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', run_eagerly=True)
    

8. steps_per_execution

描述: 在每次 tf.function 执行时,处理的步骤数。可以提高训练效率,减少上下文切换的开销。

示例场景:

  • 场景: 你希望在大型数据集上进行训练,通过每次执行多个步骤来优化训练速度。
  • 代码:
    model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', steps_per_execution=10)
    

训练、保存、调用模型

我们详细讨论 model.fit 方法的所有参数,并结合实际场景进行解释。接着,我们讲解如何保存训练后的模型、如何调用和预测新数据。下面是 model.fit 方法及其参数的详细说明。

model.fit 方法的参数

  1. x

    • 类型: 训练数据(通常是 NumPy 数组、TensorFlow 张量或其他形式的输入数据)。
    • 作用: 作为模型训练的输入数据。
    • 示例场景: 你正在训练一个图像分类模型,x_train 是包含图像数据的数组。
  2. y

    • 类型: 训练数据的标签(通常是 NumPy 数组、TensorFlow 张量或其他形式的标签)。
    • 作用: 作为模型训练的目标数据。
    • 示例场景: 对应于 x_trainy_train 是图像数据对应的分类标签。
  3. batch_size

    • 类型: 整数或 None。
    • 作用: 定义每次梯度更新的样本数。默认值为 32。
    • 示例场景: 你有一个大的数据集,选择较小的 batch_size 可以使内存占用更少,但可能会导致训练速度变慢。
    • 代码:
      model.fit(x_train, y_train, epochs=5, batch_size=64)
      
  4. epochs

    • 类型: 整数。
    • 作用: 定义训练过程中模型的迭代次数。
    • 示例场景: 你希望模型经过 5 次完整的训练周期,以期获得更好的训练效果。
    • 代码:
      model.fit(x_train, y_train, epochs=5)
      
  5. verbose

    • 类型: 整数(0, 1, 2)。
    • 作用: 设置训练过程的日志显示模式。0 表示无输出,1 表示进度条,2 表示每个 epoch 后一行日志。
    • 示例场景: 你希望在训练过程中查看详细的进度信息。
    • 代码:
      model.fit(x_train, y_train, epochs=5, verbose=1)
      
  6. validation_split

    • 类型: 浮点数,介于 0 和 1 之间。
    • 作用: 从训练数据中分割出一部分数据作为验证集。比如设置为 0.2 表示将 20% 的训练数据用于验证。
    • 示例场景: 你希望在每个 epoch 后评估模型性能,但没有单独的验证集数据。
    • 代码:
      model.fit(x_train, y_train, epochs=5, validation_split=0.2)
      
  7. validation_data

    • 类型: 元组 (x_val, y_val),x_val 和 y_val 是验证数据和对应的标签。
    • 作用: 提供单独的验证集数据,用于在每个 epoch 后评估模型。
    • 示例场景: 你有一个专门的验证集 x_val 和 y_val,希望在训练过程中使用它来监控模型性能。
    • 代码:
      model.fit(x_train, y_train, epochs=5, validation_data=(x_val, y_val))
      
  8. shuffle

    • 类型: 布尔值或字符串 (‘batch’)。
    • 作用: 是否在每个 epoch 前打乱训练数据。默认值是 True
    • 示例场景: 如果训练数据有序且存在偏差,你可能希望打乱数据以提高模型泛化能力。
    • 代码:
      model.fit(x_train, y_train, epochs=5, shuffle=True)
      
  9. class_weight

    • 类型: 字典或 None。
    • 作用: 为不同类别指定不同的权重,用于处理类别不平衡问题。
    • 示例场景: 你的数据集中某些类别的样本远少于其他类别,想要调整训练过程中对这些类别的重视程度。
    • 代码:
      class_weight = {0: 1., 1: 5.}
      model.fit(x_train, y_train, epochs=5, class_weight=class_weight)
      
  10. sample_weight

    • 类型: 数组或 None。
    • 作用: 为每个训练样本指定不同的权重。
    • 示例场景: 你有一个训练数据集,其中某些样本比其他样本更重要。
    • 代码:
      sample_weight = np.array([1, 2, 1, 1, ...])
      model.fit(x_train, y_train, epochs=5, sample_weight=sample_weight)
      
  11. initial_epoch

    • 类型: 整数。
    • 作用: 从指定的 epoch 开始训练,可以用来继续训练。
    • 示例场景: 你之前训练了模型到第 10 个 epoch,现在希望继续从第 11 个 epoch 开始训练。
    • 代码:
      model.fit(x_train, y_train, epochs=15, initial_epoch=10)
      
  12. steps_per_epoch

    • 类型: 整数。
    • 作用: 每个 epoch 包含的步骤数,通常用于 tf.data 数据集。
    • 示例场景: 你在使用自定义数据集时,想指定每个 epoch 训练的步骤数。
    • 代码:
      model.fit(x_train, y_train, epochs=5, steps_per_epoch=100)
      
  13. validation_steps

    • 类型: 整数。
    • 作用: 每个验证 epoch 包含的步骤数,通常用于 tf.data 数据集。
    • 示例场景: 你在使用自定义验证集时,指定每个验证 epoch 的步骤数。
    • 代码:
      model.fit(x_train, y_train, epochs=5, validation_data=(x_val, y_val), validation_steps=50)
      
  14. max_queue_size

    • 类型: 整数。
    • 作用: 数据预取队列的大小。用于控制数据加载的并发性。
    • 示例场景: 你希望加快数据加载速度,通过调整队列大小来优化数据预取。
    • 代码:
      model.fit(x_train, y_train, epochs=5, max_queue_size=10)
      
  15. workers

    • 类型: 整数。
    • 作用: 用于数据加载的线程数。
    • 示例场景: 你希望使用多个线程来提高数据加载速度。
    • 代码:
      model.fit(x_train, y_train, epochs=5, workers=4)
      
  16. use_multiprocessing

    • 类型: 布尔值。
    • 作用: 是否使用多进程数据加载。
    • 示例场景: 在数据预处理或加载过程中,你希望通过多进程加速数据读取。
    • 代码:
      model.fit(x_train, y_train, epochs=5, use_multiprocessing=True)
      

训练完的模型如何保存和调用

保存模型:

  • 场景: 训练完成后,你希望将模型保存到磁盘以便下次使用。
  • 代码:
    model.save('my_model.h5')  # 保存为 HDF5 格式
    

加载模型:

  • 场景: 你希望加载之前保存的模型进行预测或进一步训练。
  • 代码:
    from tensorflow.keras.models import load_model
    model = load_model('my_model.h5')
    

使用模型进行预测

预测新数据:

  • 场景: 你有一些新的图像数据,希望使用训练好的模型进行分类。
  • 代码:
    predictions = model.predict(x_new)  # x_new 是新的图像数据
    

示例完整流程:

  1. 训练模型:

    model.fit(x_train, y_train, epochs=5, batch_size=32, validation_split=0.2)
    
  2. 保存模型:

    model.save('my_model.h5')
    
  3. 加载模型:

    from tensorflow.keras.models import load_model
    model = load_model('my_model.h5')
    
  4. 预测新数据:

    predictions = model.predict(x_new)
    

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

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

相关文章

Redis:AOF持久化

1. 简介 以日志的形式来记录每个写操作,将redis执行的每个写操作记录下来(读操作不记录),只需追加文件但不可以改写文件,redis启动之初会重新构建数据,即redis重启后会将日志中的所有写指令重新执行一遍以达…

WordPress主题追格企业官网主题免费开源版V1.1.6

追格企业官网主题免费开源版由追格开发的一款开源wordpress主题,专为企业建站和追格企业官网小程序(开源版)PC配套而设计,功能集新闻动态、留言反馈、产品与服务、公司简介、联系我们等模块。

Transformer,注意力机制。

🏆本文收录于《CSDN问答解惑-专业版》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收…

QT总结——图标显示坑

最近写代码遇到一个神仙大坑,我都怀疑我软件是不是坏了,这里记录一下。 写qt工程的时候我们一般会设置图标,这个图标是窗体的图标同时也是任务栏的图标,但是我发现生成的exe没有图标,这个时候就想着给他加一个图标&…

前端开发知识(一)-html

1.前端开发需掌握的内容: 2.前端开发的三剑客:html、css、javascript Vue可以简化JavaScpript流程。 Element(饿了么开发的) :前端组件库。 Ngix:前端服务器。 3.前端开发工具:vscode 1)按…

染色封锁问题

我们只要知道我们一个联通块中的点要么没有被河蟹占着&#xff0c;要么就要有河蟹&#xff0c;这不就是染色问题吗&#xff0c;我们只要取其中的最小值加到我们答案中就行&#xff0c;如果相邻的边颜色一样&#xff0c;就无解 #define _CRT_SECURE_NO_WARNINGS #include<bit…

visual studio性能探测器使用案列

visual studio性能探测器使用案列 在visual studio中&#xff0c;我们可以使用自带的工具对项目进行性能探测&#xff0c;具体如下 1.选择性能探查器 Vs2022/Vs2019中打开方式&#xff1a; Vs2017打开方式&#xff1a; 注意最好将解决方案配置为&#xff1a;Release Debu…

大语言模型系列-Transformer:深入探索与未来展望

大家好&#xff0c;我是一名测试开发工程师&#xff0c;已经开源一套【自动化测试框架】和【测试管理平台】&#xff0c;欢迎大家联系我&#xff0c;一起【分享测试知识&#xff0c;交流测试技术】 Transformer模型自其问世以来&#xff0c;便迅速在自然语言处理领域崭露头角&a…

声音克隆一键本地化部署 GPT-SoVITS

文章目录 GPT-SoVITS 介绍1:GPT-SoVITS安装2:GPT-SoVITS使用2.1 人声伴奏分离,去混响去延时工具2.2 语音切分工具2.3 语音降噪工具2.4 中文批量离线ASR工具2.5 语音文本校对标注工具GPT-SoVITS 介绍 GPT-SoVITS: 是一个由RVC变声器创始人“花儿不哭”推出的免费开源项目。…

Windows系统安全加固方案:快速上手系统加固指南 (下)

这里写目录标题 一、概述二、IP协议安全配置启用SYN攻击保护 三、文件权限3.1 关闭默认共享3.2 查看共享文件夹权限3.3 删除默认共享 四、服务安全4.1禁用TCP/IP 上的NetBIOS4.2 ### 禁用不必要的服务 五、安全选项5.1启动安全选项5.2禁用未登录前关机 六、其他安全配置**6.1防…

项目都做完了,领导要求国际化????--JAVA后端篇

springboot项目国际化相信各位小伙伴都会&#xff0c;很简单&#xff0c;但是怎么项目都做完了&#xff0c;领导却要求国际化文件就很头疼了 国际化的SpringBoot代码&#xff1a; 第一步&#xff1a;创建工具类 /*** 获取i18n资源文件** author bims*/ public class Message…

freesql简单使用操作mysql数据库

参考&#xff1a;freesql中文官网指南 | FreeSql 官方文档 这两天准备做一个测试程序&#xff0c;往一个系统的数据表插入一批模拟设备数据&#xff0c;然后还要模拟设备终端发送数据包&#xff0c;看看系统的承压能力。 因为系统使用的第三方框架中用到了freesql&#xff0c…

QT自定义无边框窗口(可移动控制和窗口大小调整)

QT是一个功能强大的跨平台开发框架&#xff0c;它提供了丰富的界面设计工具和组件。在界面开发中&#xff0c;QT窗口自带的标题栏无法满足我们的需求。我们就需要自定义无边框窗口&#xff0c;包括自定义标题栏和窗口大小调整功能。本文将介绍如何在QT中实现这些功能。 一、简…

linux离线安装mysql8(单机版)

文章目录 一、检查服务器是否有残留mysql资源&#xff0c;有的话就全删除1.1、查询mysql已安装的相关依赖&#xff1a;1.2、查找含有MySQL的目录 二、安装2.1、上传mysql安装包到文件夹下并解压2.2、移动及重命名2.3、mysql用户2.4、配置mysql所需的my.cnf文件2.5、给my.cnf配置…

推荐系统三十六式学习笔记:工程篇.常见架构24|典型的信息流架构是什么样的

目录 整体框架数据模型1.内容即Activity2.关系即连接 动态发布信息流排序数据管道总结 从今天起&#xff0c;我们不再单独介绍推荐算法的原理&#xff0c;而是开始进入一个新的模块-工程篇。 在工程实践的部分中&#xff0c;我首先介绍的内容是当今最热门的信息流架构。 信息…

脑网络布线成本优化——从Caja守恒原则到最小化成本的探索

脑网络布线成本优化——从Caja守恒原则到最小化成本的探索 Caja守恒原则的核心作用 Caja守恒原则&#xff0c;即大脑组织的布线成本最小化原则&#xff0c;是神经科学中的一个重要概念。它指出&#xff0c;大脑在组织结构上倾向于最小化连接神经元以构成环路或网络所涉及的布…

数据结构之探索“堆”的奥秘

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;数据结构&#xff08;Java版&#xff09; 目录 堆的概念 堆的创建 时间复杂度分析&#xff1a; 堆的插入与删除 优先级队列 PriorityQ…

Docker安装kkFileView实现在线文件预览

kkFileView为文件文档在线预览解决方案,该项目使用流行的spring boot搭建,易上手和部署,基本支持主流办公文档的在线预览,如doc,docx,xls,xlsx,ppt,pptx,pdf,txt,zip,rar,图片,视频,音频等等 官方文档地址:https://kkview.cn/zh-cn/docs/production.html 一、拉取镜像 do…

go-kratos 学习笔记(6) 数据库gorm使用

数据库是项目的核心&#xff0c;数据库的链接数据是data层的操作&#xff0c;选择了比较简单好用的gorm作为数据库的工具&#xff1b;之前是PHP开发&#xff0c;各种框架都是orm的操作&#xff1b;gorm还是很相似的&#xff0c;使用起来比较顺手 go-kratos官网的实例是ent&…

轻松搭建 VirtualBox + Vagrant + Linux 虚拟机

一、准备工作 首先&#xff0c;我们来了解一下搭建 VirtualBox Vagrant Linux 虚拟机所需的软件准备工作。 VirtualBox 的下载地址&#xff1a;您可以通过访问https://www.virtualbox.org/wiki/Downloads获取适用于您系统的版本。 Vagrant 的下载地址&#xff1a;前往http…