tensorflow 学习笔记(三):神经网络八股
本节内容:
前两节使用 Tensorflow2 的原生代码大叫神经网络。本节使用 keras 搭建神经网络(八股:六步法,有 Sequential 和 class 两种)。
文章目录
- 一、搭建网络八股 sequential
- 1.1、keras 介绍
- 1.2、六步法搭建 keras 神经网络
- 1.3、函数用法
- 1.3.1、Sequential() 函数
- 1.3.2、compile() 函数
- 1.3.3、fit() 函数
- 1.3.4、model.summary()
- 1.4、鸢尾花分类代码复现
- 二、类 class 搭建神经网络
- 三、MNIST 手写数字识别数据集
- 3.1、使用 Sequential 搭建神经网络
- 3.2、使用 clas 搭建神经网络
- 四、FASHION 衣裤识别数据集及训练
一、搭建网络八股 sequential
1.1、keras 介绍
tf.keras 是 Tensorflow2 引入的高封装度框架,可以用于快速搭建神经网络模型。
keras 官方文档:https://keras.io/zh/
两种学习 API 的方法:
- 1)在 PyCharm 集成开发环境中查看框架源码:将鼠标放置在函数上按住 Ctrl 键会显示函数的基本信息,包括封装函数的类、函数入口参数,函数功能等等。
- 2)在 Tensorflow 官网中查询函数文档:通过左边的检索寻找目标函数。如:查询 model.fit() 函数,打开 tf.keras 中的 Model 类,右方目录列出了 Model 类所包含的函数,点击 fit() 函数可以看到对于函数的介绍,包括输入参数具体介绍、函数功能等等。
1.2、六步法搭建 keras 神经网络
1)import 相关模块。如 import tensorflow as tf 。
2)指定输入网络的训练集 train 和测试集 test,如指定训练集的输入 x_train 和标签 y_train,以及测试集的输入 x_test 和标签 y_test。
3)逐层搭建网络结构,相当于走了一边前向传播 models.Sequential。
model = tf.keras.models.Sequential()# 另外一种方法:class MyModel
class MyModel(Model): def __init__(self): super(MyModel, self).__init__() 初始化网络结构,搭建出神经网络所需的各种网络结构块def call(self, x): 调用网络结构块,实现前向传播return y
model = MyModel()
4)在 compile() 中配置训练方法,选择训练时使用的优化器、损失函数和评价指标。
model.compile()
5)在 model.fit() 中执行训练过程,告知训练集和测试集的输入值和标签、每个 batch 的大小 batch_size、数据集的迭代次数 epoch。
model.fit()
6)打印网络结构,统计参数数目。
model.summary()
1.3、函数用法
1.3.1、Sequential() 函数
Sequential() 可以认为是一个容器,这个容器里面封装了一个神经网络结构。在 Sequential() 函数中要描述从输入层到输出层的每一层的网络结构,每一层的网络结构可以是拉直层 Flatten() 或者全连接层 Dense()。
# 描述各层网络
model = tf.keras.model.Sequential([网络结构])
网络结构举例:
- 拉直层:这一层不含计算,只是形状转换,把输入特征拉直变成一维数组,可以变换张量的尺寸。
tf.keras.layers.Flatten()
- 全连接层:又叫 Dense 层。
# 其中激活函数 activation 用字符串给出,可选用:relu、softmax、sigmoid、tanh
# kernel_regularizer 可选用:tf.keras.regularizers.l1()、tf.keras.regularizers.l2()
tf.keras.layers.Dense(神经元个数,activation = "激活函数",kernel_regularizer = 哪种正则化
)
- 卷积层:卷积神经网络
tf.keras.layers.Conv2D(filters=卷积核个数,kernel_size=卷积核尺寸,strides=卷积步长,padding= "valid" or "same")
- LSTM 层:循环神经网络
tf.keras.layers.LSTM()
1.3.2、compile() 函数
用于配置神经网络的训练方法,告知训练时使用的优化器、损失函数和准确率评测标准。
model.compile(optimizer=优化器,loss=损失函数,metrics=["准确率"])
1)optimizer 可以是以字符串形式给出的优化器名字,比如 sgd、adagrad、adadelta、adam。也可以是函数形式,使用函数形式可以设置学习率、动量等超参数。建议入门时,先使用左边字符串形式的优化器名字,等掌握了整个框架后,可通过TensorFlow官网查询这些函数的具体用法,调节超参数。
https://tensorflow.google.cn/api_docs/python/tf/keras/optimizers/experimental/SGD
‘sgd’ or tf.keras.optimizers.SGD(lr=学习率,decay=学习率衰减率,momentum=动量参数)‘adagrad’ or tf.keras.optimizers.Adagrad(lr=学习率,decay=学习率衰减率)‘adadelta’ or tf.keras.optimizers.Adadelta(lr=学习率,decay=学习率衰减率)‘adam’ or tf.keras.optimizers.Adam (lr=学习率,beta_1=0.9,beta_2=0.999)
2)loss 可以是字符串给出的损失函数名字,如:mse、spare_categorical_crossentropy。也可以是函数形式。
‘mse’ or tf.keras.losses.MeanSquaredError()
‘sparse_categorical_crossentropy' or tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False) # from_logits 是否是原始输出,即未经过概率分布的输出
损失函数常需要经过 softmax 函数将输出转化为概率分布的形式。from_logits 用来标注该损失函数是否需要转换为概率的形式,取 False 表示转化为概率分布,取 True 表示没有转化为概率分布,直接输出。
3)Metrics 告知网络评测指标。
# y_是标签,y是网络输出结果
‘accuracy’ :y_和y都是数值,如y_=[1] y=[1]
‘categorical_accuracy’ :y_和y都是独热码(概率分布),如y_=[0,1,0] y=[0.256,0.695,0.048]
‘sparse_categorical_accuracy’ :y_是数值,y是独热码(概率分布),如y_=[1] y=[0.256,0.695,0.048]
1.3.3、fit() 函数
fit() 函数执行训练过程。
model.fit (训练集的输入特征, 训练集的标签, batch_size= , # 每次喂入神经网络的样本数epochs= , # 要迭代多少次数据集# 以下函数 validation_data 和 validation_split 二选一validation_data=(测试集的输入特征,测试集的标签),validation_split=从训练集划分多少比例给测试集,validation_freq = 多少次epoch测试一次 # 每多少次 epoch 迭代使用测试集验证一次结果)
1.3.4、model.summary()
summary() 可以打印出网络的结构和参数统计。

1.4、鸢尾花分类代码复现
# 1:首先 import 相关模块
import tensorflow as tf
from sklearn import datasets
import numpy as np# train、test 分别交代训练集中的输入特征 x_train 和训练集的标签 y_train
# 测试集的输入特征 x_test 和测试集的标签 y_test 也可以像 x_train 和 y_train 一样直接在这里给定,也可以在 fit 中按比例从训练集中划分
x_train = datasets.load_iris().data
y_train = datasets.load_iris().target# 以下 5 行代码实现数据集的乱序
np.random.seed(116)
np.random.shuffle(x_train)
np.random.seed(116)
np.random.shuffle(y_train)
tf.random.set_seed(116)# 在 sequential 中搭建网络结构:神经元个数、激活函数、正则化方法
model = tf.keras.models.Sequential([tf.keras.layers.Dense(3, activation='softmax', kernel_regularizer=tf.keras.regularizers.l2())
])# 在 compile 中配置训练方法:选择 SGD 优化器,学习率设置为 0.1、选择损失函数、由于神经网络末端使用了 softmax 函数,使得输出是概率分布而不是原始输出,所以 from_logits 是 false
# 由于鸢尾花数据集给的标签是 0 1 2,是数值。神经网络前向传播的输出是概率分布,所以这里选择 sparse_categorical_accuracy 作为评测指标。
model.compile(optimizer=tf.keras.optimizers.SGD(lr=0.1),loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),metrics=['sparse_categorical_accuracy'])# 在 fit 中执行训练过程:训练集输入特征、训练集标签、训练时一次喂入神经网络多少组数据 batch_size、数据集迭代循环的次数、validation_split 告知从训练集中选择 20% 的数据作为测试集、validation_freq 表示每迭代 20 次训练集要在测试集中验证一次准确率。
model.fit(x_train, y_train, batch_size=32, epochs=500, validation_split=0.2, validation_freq=20)# 用 summary 打印网络结构和参数统计
model.summary()

法2:也可以像 x_train 和 y_train 一样直接给定

以上是测试集 test 的两种划分方式。
二、类 class 搭建神经网络
使用 Sequential 可以搭建出上层输出就是下层输入的顺序网络结构,但是无法写出一些带有跳连的非顺序网络结构,此时可以选择用类 class 搭建神经网络结构,可以使用 class 类搭建一个神经网络结构。
class MyModel(Model): # MyModel为声明的神经网络的名字,括号中的Model表示创建的类需要继承TensorFlow库中的Model类
# 类中需要定义两个函数def __init__(self): # 类的构造函数,用于初始化类的参数super(MyModel, self).__init__() # 初始化父类的参数初始化网络结构,搭建出神经网络所需的各种网络结构块def call(self, x): #调用__init__()函数完成初始化的网络块,实现前向传播并返回推理值调用网络结构块,实现前向传播return ymodel = MyModel()
可以认为 init 函数准备出搭建网络所需的各种积木,call 函数调用 init 中搭建好的积木,实现前向传播。
使用 class 方式搭建 iris 网络结构:
class IrisModel(Model):def __init__(self):super(IrisModel, self).__init__()# 在__init__函数中定义了要在call函数中调用的具有三个神经元的全连接网络Denseself.d1 = Dense(3, activation='softmax', kernel_regularizer=tf.keras.regularizers.l2()) # d1是给这一层起的名字,每一层都用self.引导def call(self, x):y = self.d1(x) # 在call函数中调用self.d1实现了从输入x输出y的前向传播return y
# 对于鸢尾花的例子,前向传播只经过一层网络,这层网络结构快已经在 __init__ 函数中定义好了,直接 self.d1 调用,输入 x 输出 y,返回 y
搭建好网络结构后,只需要使用 Model = MyModel() 构建类的对象,就可以使用该模型了。
model = IrisModel() # 实例化
完整代码如下:
import tensorflow as tf
from tensorflow.keras.layers import Dense
# 添加 model 模块
from tensorflow.keras import Model
from sklearn import datasets
import numpy as npx_train = datasets.load_iris().data
y_train = datasets.load_iris().targetnp.random.seed(116)
np.random.shuffle(x_train)
np.random.seed(116)
np.random.shuffle(y_train)
tf.random.set_seed(116)# 定义了 IrisModel 类
class IrisModel(Model):def __init__(self):super(IrisModel, self).__init__()# 具有三个神经元的全连接网络 Denseself.d1 = Dense(3, activation='softmax', kernel_regularizer=tf.keras.regularizers.l2())def call(self, x):# 在 call 函数中调用了 self.d1 实现了输入 x 到输出 y 的前向传播y = self.d1(x)return y# 实例化 model
model = IrisModel()model.compile(optimizer=tf.keras.optimizers.SGD(lr=0.1),loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),metrics=['sparse_categorical_accuracy'])model.fit(x_train, y_train, batch_size=32, epochs=500, validation_split=0.2, validation_freq=20)
model.summary()
三、MNIST 手写数字识别数据集
数据集介绍:MNIST 数据集一共有 7 万张图片,都是 28 * 28 像素点的手写数字图片。其中 6 万张用于训练,1 万张用于测试。

import tensorflow as tf
from matplotlib import pyplot as plt# 导入数据集
mnist = tf.keras.datasets.mnist # keras 函数库提供了使用 mnist 数据集的接口
# x_train 是训练集输入特征,y_train 是训练集标签,x_test 是测试集输入特征,y_test 是测试集标签
(x_train, y_train), (x_test, y_test) = mnist.load_data() # load_data() 直接从 mnist 中读取测试集和训练集# 送入神经网络时要把数据拉直成一维数组,把 784 个像素点的灰度值作为输入特征送入神经网络
tf.keras.layers.Flatten()# 可视化训练集输入特征的第一个元素
# 以下两句话把训练集中的第一个样本 x_train[0] 可视化出来
plt.imshow(x_train[0], cmap='gray') # 绘制灰度图
plt.show()
以上代码生成如下:
import tensorflow as tf
from matplotlib import pyplot as plt# 导入 MNIST 数据集
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()# 可视化训练集输入特征的第一个元素
plt.imshow(x_train[0], cmap='gray') # 绘制灰度图
plt.show()# 打印出训练集中第一个样本的输入特征
print("x_train[0]:\n", x_train[0])
# 打印出训练集中第一个样本的标签
print("y_train[0]:\n", y_train[0])# 打印出整个训练集输入特征形状
print("x_train.shape:\n", x_train.shape)
# 打印出整个训练集标签的形状
print("y_train.shape:\n", y_train.shape)
# 打印出整个测试集输入特征的形状
print("x_test.shape:\n", x_test.shape)
# 打印出整个测试集标签的形状
print("y_test.shape:\n", y_test.shape)
3.1、使用 Sequential 搭建神经网络
import tensorflow as tfmnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
# 对输入网络的输入特征进行归一化,使原来 0 到 255 之间的灰度值变为 0 到 1之间的数值
# 把输入特征的数值变小更适合神经网络的吸收
x_train, x_test = x_train / 255.0, x_test / 255.0# 用 sequential 搭建神经网络
model = tf.keras.models.Sequential([tf.keras.layers.Flatten(), # 先把输入特征拉直为一维数组,也就是拉直为 748 个数值tf.keras.layers.Dense(128, activation='relu'), # 定义第一层网络有 128 个神经元,用 relu 激活函数tf.keras.layers.Dense(10, activation='softmax') # 定义第二层网络有 10 个神经元,用 softmax 函数使输出符合概率分布
])# 用 compile 配置训练方法
model.compile(optimizer='adam', # 优化器选择 admaloss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False), # 损失函数选择 SparseCategoricalCrossentropymetrics=['sparse_categorical_accuracy']) # 数据集中的标签是数值,神经网络输出 y 是概率分布,所以这里选择 sparse_categorical_accuracy# fit 中执行训练过程,参数依次为:训练集输入特征、训练集标签、每次喂入网络 32 组数据、数据集迭代 5 次、【测试集输入特征、测试集标签】、每迭代一次训练集执行一次测试集的评测
model.fit(x_train, y_train, batch_size=32, epochs=5, validation_data=(x_test, y_test), validation_freq=1)# 打印出网络结构和参数统计
model.summary()# 我们所说的准确率是使用测试集计算出的准确率,也就是看的这里:val_sparse_categorical_accuracy: 0.9787
执行结果说明:
- 1)MNIST 数据集有 60000 张图片用来训练,batch_size=32,所以每轮要迭代 60000/32=1875次,共迭代 5 轮,即 5 epochs。
- 2)训练时每个 step 给出的是训练集 accuracy,不具有参考价值。有实际评判价值的是 validation_freq 中设置的、隔若干轮输出的测试集 accuracy。


3.2、使用 clas 搭建神经网络
import tensorflow as tf
from tensorflow.keras.layers import Dense, Flatten
from tensorflow.keras import Modelmnist = 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# 与 sequential 搭建神经相比,只有实例化 model 的方法不同
class MnistModel(Model):# __init__ 函数中定义了 call 函数中所用到的层def __init__(self):super(MnistModel, self).__init__()self.flatten = Flatten()self.d1 = Dense(128, activation='relu')self.d2 = Dense(10, activation='softmax')# cell 函数中从输入 x 到输出 y,走过一次前向传播返会输出 ydef call(self, x):x = self.flatten(x)x = self.d1(x)y = self.d2(x)return y# 实例化 model,其余代码和 Sequential 实现手写数字识别模型训练的代码是完全一样的
model = MnistModel()model.compile(optimizer='adam',loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),metrics=['sparse_categorical_accuracy'])model.fit(x_train, y_train, batch_size=32, epochs=5, validation_data=(x_test, y_test), validation_freq=1)
model.summary()# 随着训练集迭代轮数的增加,手写数字识别准确率不断提高
四、FASHION 衣裤识别数据集及训练
Fashion_mnist 数据集与 MNIST 数据集几乎一样,一共有 7w 张图片,每张图片都是 28 行 28 列像素点的灰度值数据。其中 6w 张用于训练和1w 张用于测试,图片被分为十类(如T恤、裤子、套头衫等等),每张图片为28×28的分辨率(像素点的灰度值数据)。

**训练衣服、裤子等图片的识别模型:**与训练MNIST数据集的不同之处就是加载数据集的代码不同,在此不再赘述。
fashion = tf.keras.datasets.fashion_mnist
(x_train, y_train),(x_test, y_test) = fashion.load_data() # 可以使用.load_data()直接从fashion数据集中读取训练集和测试集

最后识别准确率为 87.50%。
相关文章:
tensorflow 学习笔记(三):神经网络八股
本节内容: 前两节使用 Tensorflow2 的原生代码大叫神经网络。本节使用 keras 搭建神经网络(八股:六步法,有 Sequential 和 class 两种)。 文章目录一、搭建网络八股 sequential1.1、keras 介绍1.2、六步法搭建 keras …...
华为OD机试真题Python实现【射击比赛】真题+解题思路+代码(20222023)
射击比赛 题目 给定一个射击比赛成绩单 包含多个选手若干次射击的成绩分数 请对每个选手按其最高三个分数之和进行降序排名 输出降序排名后的选手 ID 序列 条件如下: 一个选手可以有多个射击成绩的分数 且次序不固定如果一个选手成绩小于三个 则认为选手的所有成绩无效 排名忽…...
【YBT2023寒假Day12 C】树的计数 II(prufer)(结论)(数学)
树的计数 II 题目链接:YBT2023寒假Day12 C 题目大意 给你一个长度为 n 的排列 p,问你有多少个不同的有标号无根树,满足如果 i,j 有边那 pi,pj 也有边。 思路 首先可以把排列变成置换环。 注意到是树,发现一个置换中似乎不太可…...
深入浅出C++ ——多态
文章目录一、多态的概念二、多态的定义及实现1. 多态的构成条件2. 虚函数3. 虚函数的重写4. virtual的使用:5. 虚函数重写的两个例外:6. C11 override 和 final7. 重载、重写、重定义的对比三、抽象类四、多态的原理1. 虚函数表2. 多态的原理3. 静态绑定…...
华为OD机试真题Python实现【整数编码】真题+解题思路+代码(20222023)
整数编码 题目 实现一个整数编码方法 使得待编码的数字越小 编码后所占用的字节数越小 编码规则如下 编码时7位一组,每个字节的低 7 位用于存储待编码数字的补码字节的最高位表示后续是否还有字节,置1表示后面还有更多的字节,置0表示当前字节为最后一个字节采用小端序编码…...
FPGA纯Vhdl实现MIPI CSI2RX视频解码输出,OV13850采集,提供工程源码和技术支持
目录1、前言2、Xilinx官方主推的MIPI解码方案3、纯Vhdl方案解码MIPI4、vivado工程介绍5、上板调试验证6、福利:工程代码的获取1、前言 FPGA图像采集领域目前协议最复杂、技术难度最高的应该就是MIPI协议了,MIPI解码难度之高,令无数英雄竞折腰…...
7 个 JavaScript Web API 来构建你不知道的未来网站
随着技术的日新月异,为开发人员提供了令人难以置信的新工具和API。但据了解,在100 多个 API中,只有5%被开发人员积极使用。让我们来看看一些有用的Web API,它们可以帮助您将网站推向月球!🌕🚀1.…...
跟ChatGPT,聊聊ChatGPT
不仅“上知天文、下知地理”,似乎还能对答如流、出口成诗,甚至还能写剧本、编音乐、写代码——最近,一款名叫ChatGPT的人工智能聊天机器人火爆全球。由此,一系列关于新一代技术变革、人工智能替代人力、巨头企业扎堆入局AI的讨论在…...
Java 数组(详细教学 基础篇)
一、数组的基本要素 标识符:数组的名称数组元素:数组中存放的数据元素下标:对数组元素进行编号,数组下标从0开始来访问元素类型:数组元素的数据类型 二、数组的五种赋值方法和使用方法 声明数组 int[] arr;//开辟三个…...
python装饰器原理 | 常用装饰器使用(@cache, @lru_cache)
🚀 关于python的装饰器原理介绍可看这里,讲的挺简洁易懂:python装饰器原理 ⭐ 弄懂装饰器原理后,来学学常用装饰器。 文章目录1、cache, lru_cache1、cache, lru_cache 也就是一种装饰在被执行的函数上,将其执行的结果…...
[oeasy]python0090_极客起源_wozniac_苹果公司_Jobs_Wozniac
极客起源 回忆上次内容 上次回顾了 DEC公司的兴起 从IBM的大型机 到DEC的小型机Mini Computer 再到DEC的终端 VT-100 计算机基础元器件发生了进化 从ENIAC的 电子管到PDP系列的 晶体管 新的器件 体积小了价格低了稳定性 提高了而且 连成了网络 ARPA网 就是 最初的Internet …...
Spring基础总结(下)
简介 本章节通过手写一个简单的 Spring 框架来加深对 Spring 框架源码以及设计思想的理解; 实现步骤 BeanScope 枚举代码 public enum BeanScope { sigleton, prototype; }AppConfig 配置类 // 定义包扫描路径 ComponentScan("com.dufu.spring"…...
设计模式面试题
设计模式分为 创建型 工厂模式 单例 原型行为性 责任链 迭代器 命令中介型结构性 适配器 代理 门面 装饰器 组合 桥接单例设计模式 懒汉式 用到时再创建,省内存 饿汉式 类创建时就创建,会占用内存 内部类 用到时再创建,省内存 线程池、数据…...
需要知道的一些API接口的基础知识
API是应用程序编程接口(Application Programming Interface)的缩写,能够起到两个软件组件之间的连接器或中介的作用。此类接口往往通过一组明确的协议,来表示各种原始的请求和响应。API文档可以向开发人员展示请求和响应是如何形成…...
互融云数字资产管理平台综合解决方案
自十八大以来,发展数字经济逐步成为了国家战略。从2015年国务院印发《促进大数据发展行动纲要》,到2020年4月中央发布《关于构建更加完善的要素市场化配置体制机制的意见》,再到2022年底出台《中共中央、国务院关于构建数据基础制度更好发挥数…...
记住这12个要点,你也能打造出让HR和技术主管前一亮的前端简历
第一篇章:吸引HR 如果你想在众多简历中脱颖而出,需要注意以下几点: 1、突出你的亮点: 给你的简历一个吸引人的文件命名和头部,突出你的关键技能和经验。 2、采用简洁的语言: 用简单易懂的语言来描述你的…...
AQS学习:ReentrantLock源码解析
前言 多线程知识中理解了ReentrantLock之后,对于整个AQS也会有大概的理解,后面再去看其它锁的源码就会比较容易。下面带大家一块来学习ReentrantLock源码。 概述 ReentrantLock是可重入的互斥锁,虽然具有与synchronized相同功能࿰…...
RocketMQ源码分析消息消费机制—-消费端消息负载均衡机制与重新分布
1、消息消费需要解决的问题 首先再次重复啰嗦一下 RocketMQ 消息消费的一些基本元素的关系 主题 —》 消息队列(MessageQueue) 1 对多。 主题 —》 消息生产者,一般主题会由多个生产者组成,生产者组。 主题 —》 消息消费者,一般一个主题…...
华为OD机试真题Python实现【数据分类】真题+解题思路+代码(20222023)
数据分类 题目 对一个数据a进行分类, 分类方法是,此数据a(4 个字节大小)的 4 个字节相加对一个给定值b取模, 如果得到的结果小于一个给定的值c则数据a为有效类型,其类型为取模的值。 如果得到的结果大于或者等于c则数据a为无效类型。 比如一个数据a = 0x01010101,b = 3…...
vue项目中引入字体包
问题: 项目开发过程中,因UI的显示要求,需要引入一些字体,那如何引入外部字体呢?很简单,只需要以下3步 一 下载对应的字体包文件,放置到我们的项目中 比如我需要PingFangSC的系列字体&#…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...
【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...
Redis:现代应用开发的高效内存数据存储利器
一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...
Golang——9、反射和文件操作
反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一:使用Read()读取文件2.3、方式二:bufio读取文件2.4、方式三:os.ReadFile读取2.5、写…...
