【4】tf实现神经网络模型

news2024/11/25 21:17:43

1 M-P神经元与神经网络前向传输

1.1 训练单个神经元

一个含有两个输入的神经元,指定一个输入x1=x2=1,期望y能输出0.3。要求不断的输入x1=x2=1,然后不断的训练权重w与偏置b值,训练一万次后,再次输入x1与x2输出y的值是否为0.3

# 导入TensorFlow库,并重新命名为tf,以下代码调用TensorFlow时使用tf
import tensorflow  as tf
# 声明输入x的占位符,矩阵大小为1行2列
x = tf.placeholder(tf.float32, [1, 2])
# w是图中权重的变量是一个2行1列的矩阵。矩阵的初值为符合正太分布随机值的变量
w = tf.Variable(tf.truncated_normal([2, 1]), name="weight")
# b计算偏置值,初值为的符合正太分布随机值的变量
b = tf.Variable(tf.truncated_normal([1]), name="bias")
# 将加权值加上偏置值传入sigmod激活函数中
y = tf.nn.sigmoid(tf.matmul(x, w) + b)
# 实际的y值,此处仅定义占位。在运算过程中进行赋值
y_ = tf.placeholder(tf.float32, [1])
# 计算实际值与通过w与b计算出的y值做误差计算
cross_entropy = tf.reduce_mean(tf.square(y_ - y))
# 通过误差使用梯度下降更新w与b值
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)
# 初始化所有变量值
init = tf.global_variables_initializer()
# 在会话中运行程序,计算出w与b值
with tf.Session() as sess:
    sess.run(init)
    for line in range(10000):
        sess.run(train_step, feed_dict={x: [[1, 1]], y_: [0.3]})
        print(line + 1, sess.run(w, feed_dict={x: [[1, 1]]}))
    # 将x1与x2代入经过训练的模型中,并打印出y可与原y值进行比较
    print(sess.run(y, feed_dict={x: [[1, 1]]}))

1.2 神经网络前向传输

# 导入tensorflow的类库
import tensorflow as tf

# 声明一个常量
x = tf.constant([[0.7, 0.9]])
# 声明两个权重矩阵
w1 = tf.Variable(tf.random_normal([2, 3], stddev=1, seed=1))
w2 = tf.Variable(tf.random_normal([3, 1], stddev=1, seed=1))
# 实现矩阵乘法
a = tf.matmul(x, w1)
y = tf.matmul(a, w2)
# 在会话中运行计算图
with tf.Session() as sess:
    init_op = tf.global_variables_initializer()
    sess.run(init_op)
    print(sess.run(y))

2训练BP神经网络模型参数

2.1 神经网络前行传输过程

2.2 训练神经网络模型

 如有一个判断零件是否合格的神经网络模型,输入零件的长度和质量,从而检测文件是否合格,要求训练一个神经网络模型,最终输出训练后的w值。

# 导入tensorflow库,并重新命名为tf。以下代码调用tensorflow时使用tf
import tensorflow as tf
# numpy工具包生成模拟数据集,使用RandomState获得随机数生成器
from numpy.random import RandomState

######定义神经网络的结构和向前出参数的输出结果。
batch_size = 8
# w1是图中权重的变量是一个2行3列的矩阵。矩阵的初值为符合正太分布随机值的变量
w1 = tf.Variable(tf.random_normal([2, 3], stddev=1, seed=1))
# w2是图中权重的变量是一个3行1列的矩阵。矩阵的初值为符合正太分布随机值的变量
w2 = tf.Variable(tf.random_normal([3, 1], stddev=1, seed=1))
# x输入值的占位符,此处仅定义占位。在运算过程中进行赋值
x = tf.placeholder(tf.float32, shape=(None, 2), name='x-input')
# 实际的y_值,此处仅定义占位。在运算过程中进行赋值
y_ = tf.placeholder(tf.float32, shape=(None, 1), name='y-input')
# 前向计算y值
a = tf.matmul(x, w1)
y = tf.matmul(a, w2)

######定义损失函数以及选择反向传播优化的算法
# 计算损失,本实训使用均方误差计算损失函数
loss_value = tf.reduce_mean(tf.square(y_ - y))
# 反向优化参数,Adam梯度下降算法根据损失函数
train_step = tf.train.AdamOptimizer(0.001).minimize(loss_value)

######生成会话并且在训练数据上反复进行反向传播优化算法# 利用numpy提供的随机函数生成x数据
rdm = RandomState(1)
dataset_size = 128
X = rdm.rand(dataset_size, 2)
# 通过x计算y值
Y = [[int(x1 + x2 < 1)] for (x1, x2) in X] # 列表解析式
# 训练准备工作
with tf.Session() as sess:
    init_op = tf.global_variables_initializer() # 初始化变量
    sess.run(init_op)
    print("*********训练之前的初始权重weights的值:")
    print(sess.run(w1))
    print(sess.run(w2))
    STEPS = 5000
    print("*******开始训练**************")
    # 将数据分批次进入训练模型中
    for i in range(STEPS):
        start = (i * batch_size) % dataset_size
        end = min(start + batch_size, dataset_size)
        # Tensorflow的Session才是真正开始训练的过程,将x与y值送入PlaceHolder(占位符)中
        sess.run(train_step, feed_dict={x: X[start:end], y_: Y[start:end]})
        # 每运行1000次后,打印训练结果
        if i % 1000 == 0:
            loss = sess.run(loss_value, feed_dict={x: X, y_: Y})
            print("After %d training step(s) , loss_value on all data is %f" % (i, loss))
    print("*********训练之后的权重weights的值:")
    print(sess.run(w1))
    print(sess.run(w2))

3 激活函数实现非线性化

3.1  使用sigmoid激活函数

定义一个二维张量,通过sigmoid激活函数将其映射到0-1范围内,并输出映射后的值。

# 导入tensorflow类库,简称为tf
import tensorflow as tf

# 定义输入数据
input_data = tf.Variable([[0, 10, -10], [1, 2, 3]], dtype=tf.float32)
# 使用sigmoid激活函数
output = tf.nn.sigmoid(input_data)
init_op = tf.global_variables_initializer()
# 创建会话,并使用上下文管理器管理会话
with tf.Session() as sess:
    sess.run(init_op)
    # 在会话中运行节点,实现输出
    print(sess.run(output))

3.2使用tanh激活函数

定义一个张量,使用tanh激活函数将其映射到-1~1之间,并输出映射后的值。

# 导入tensorflow类库,简称为tf
import tensorflow.compat.v1 as tf
tf.disable_eager_execution()
# 定义输入tensor
input = tf.constant([-2, -8, 2, 8], dtype=tf.float32)
# 使用tanh激活函数
output = tf.nn.tanh(input)
# 创建会话,并在上下文中输出
with tf.Session() as sess:
    # 打印输出节点
    print(sess.run(output))

3.3使用relu激活函数

定义一个张量[-10,0,4,8],使用relu激活函数使其能自动的忽略负值,并输出映射后的值。

# 导入tensorflow类库,简称为tf
import tensorflow as tf

# 定义输入tensor
input = tf.constant([-10, 0, 4, 8], dtype=tf.float32)
# 使用relu激活函数
output = tf.nn.relu(input)
# 创建会话,并在上下文中输出
with tf.Session() as sess:
    # 打印输出节点
    print(sess.run(output))

4 损失函数

4.1 分类问题的损失函数

softmax

定义一个张量,通过softmax输出属于各个类别的概率。

# 导入tensorflow类库,简称为tf
import tensorflow.compat.v1 as tf
tf.disable_eager_execution()
# 定义一个常量
s = tf.constant([1, 1, 2, 3, 4, 5, 10], dtype=tf.float32)
# 使用sofmax函数输出类别概率
sm = tf.nn.softmax(s)
# 创建一个会话,使用上下文管理器管理会话
with tf.Session()as sess:
    # 在会话中输出结果
    print(sess.run(sm))

交叉熵损失函数

 计算两个张量之间的交叉熵,并将交叉熵结果输出。

# 导入tensorflow类库,简称为tf
import tensorflow.compat.v1 as tf
tf.disable_eager_execution()
# 定义输入的tensor
input_data = tf.Variable([[0.2, 0.1, 0.9], [0.3, 0.4, 0.6]], dtype=tf.float32)
# 定义标签
labels = tf.constant([[1, 0, 0], [0, 1, 0]], dtype=tf.float32)
# 计算交叉熵
cross_entropy = -tf.reduce_mean(labels * tf.log(tf.clip_by_value(input_data, 1e-10, 1.0)))
with tf.Session() as sess:
    init = tf.global_variables_initializer()
    sess.run(init)
    # 输出两个交叉熵
    print(sess.run(cross_entropy))

4.2回归问题的损失函数

均方误差

# 导入tensorflow类库,简称为tf
import tensorflow.compat.v1 as tf
tf.disable_eager_execution()
# 定义张量a
a = tf.constant([[4.0, 4.0, 4.0], [3.0, 3.0, 3.0], [1.0, 1.0, 1.0]])
# 定义张量b
b = tf.constant([[1.0, 1.0, 1.0], [1.0, 1.0, 1.0], [2.0, 2.0, 2.0]])
# 计算均方误差
mse = tf.reduce_mean(tf.square(a - b))
with tf.Session() as sess:
    # 输出均方误差的值
    print(sess.run(mse))

 5 梯度下降

5.1 梯度下降

使用梯度下降法实现y=x2,x初始值为5,求y的最小值。学习率设置为0.001,每1000轮更新一次y的值。

# 导入tensorflow类库,简称为tf
import tensorflow.compat.v1 as tf
tf.disable_eager_execution()
# 定义训练的轮数
TRAINING_STEPS = 10000
# 定义学习率
LEARNING_RATE = 0.001
# 定义x变量
x = tf.Variable(tf.constant(5, dtype=tf.float32), name="x")
# 实现模型
y = tf.square(x)
# 使用随机梯度下降最小化y
train_op = tf.train.GradientDescentOptimizer(LEARNING_RATE).minimize(y)
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    for i in range(TRAINING_STEPS):
        # 输出每一步训练的值
        sess.run(train_op)
        if i % 1000 == 0:
            x_value = sess.run(x)
            print("After %s iteration(s): x%s is %f." % (i + 1, i + 1, x_value))

5.2 反向传播

 

构建房屋预测模型,打印每轮训练的数据。

# 导入tensorflow类库,简称为tf
import tensorflow.compat.v1 as tf
tf.disable_eager_execution()
# 定义网络权重
W = tf.Variable(tf.ones([2, 1]), tf.float32)
# 定义网络偏置项
b = tf.Variable([5.0], tf.float32)
# 定义输入占位符
x = tf.placeholder(tf.float32, [None, 2])
# 定义输出占位符
y = tf.placeholder(tf.float32)
# 定义向前传输模型
y_ = tf.matmul(x, W) + b
# 定义损失函数
loss = tf.reduce_sum(tf.square(y_ - y))
# 定义优化器
optimizer = tf.train.AdamOptimizer(0.01)
train = optimizer.minimize(loss)
# 输入数据
x_train = [[2104, 3], [1600, 3], [2400, 3], [1416, 2], [3000, 4]]
# 输入标签
y_train = [400, 330, 369, 232, 540]
init = tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init)
    # 训练40000轮
    for i in range(40000):
        curr_W, curr_b, _ = sess.run([W, b, train], {x: x_train, y: y_train})
        if i % 500 == 0:
            print("Step:%s W: %s b: %s" % (i, curr_W, curr_b,))
    # 训练完成后,输出损失函数和w及b
    curr_W, curr_b, curr_loss = sess.run([W, b, loss], {x: x_train, y: y_train})
    print("W: %s b: %s loss: %s" % (curr_W, curr_b, curr_loss))

6 优化模型

6.1指数衰减学习率

使用指数衰减学习率,定义一个全局变量,每训练一次,全局变量的值加1。

# 导入tensorflow类库,简称为tf
import tensorflow.compat.v1 as tf
tf.disable_eager_execution()
# 定义全局训练的步数
global_step = tf.Variable(0, trainable=False)
# 定义学习率为0.1
initial_learning_rate = 0.1
# 定义指数衰减学习率
learning_rate = tf.train.exponential_decay(learning_rate=initial_learning_rate, global_step=global_step, decay_steps=10,
decay_rate=0.85)
# 使用梯度下降法
op = tf.train.GradientDescentOptimizer(learning_rate)
# 每次训练完成之后加1
add_global = global_step.assign_add(1)
init = tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init)
    for step in range(20):
    # 每次训练完成之后打印学习率
        g, rate = sess.run([add_global, learning_rate])
        print(g, rate)

6.2正则化及正则化集合

L1正则化、L2正则化

 定义一个矩阵,利用L1正则化、L2正则化和两者的正则化,打印正则化后的值。

# 导入tensorflow类库,简称为tf
import tensorflow.compat.v1 as tf
from tf_slim import l1_regularizer, l2_regularizer, l1_l2_regularizer
tf.disable_eager_execution()
# 声明w为二维矩阵
W = tf.constant([[1.0, -2.0], [-3.0, 4.0]])
# 建立session上下文
with tf.Session() as sess:
    # 为L1正则化,(1+2+3+4)*0.5 = 5.0
    print(sess.run(l1_regularizer(.5)(W)))
    # 为L2正则化,(1+4+9+16)*0.5=7.5
    print(sess.run(l2_regularizer(.5)(W)))
    # 为L1 + L2正则化,5.0 + 7.5 = 12.5
    print(sess.run(l1_l2_regularizer(.5, .5)(W)))

正则化集合:

通过正则化集合的方式将正则化添加到整个神经网络中。

# 导入tensorflow类库,简称为tf
import tensorflow.compat.v1 as tf
from tf_slim import l2_regularizer

tf.disable_eager_execution()
# 获取一层神经网络的权重,并将权重的L2正则化损失加入到集合中
def get_weight(shape, lamda):
    # 定义变量
    var = tf.Variable(tf.random_normal(shape=shape), dtype=tf.float32)
    # 将变量的L2正则化损失添加到集合中
    tf.add_to_collection("losses", l2_regularizer(lamda)(var))
    return var

if __name__ == "__main__":
    # 定义输入节点
    x = tf.placeholder(tf.float32, shape=(None, 2))
    # 定义输出节点
    y_ = tf.placeholder(tf.float32, shape=(None, 1))
    # 定义每次迭代数据的大小
    batch_size = 8
    # 定义五层神经网络,并设置每一层神经网络的节点数目
    layer_dimension = [2, 10, 10, 10, 1]
    # 获取神经网络的层数
    n_layers = len(layer_dimension)
    # 定义神经网络第一层的输入
    cur_layer = x
    # 当前层的节点个数
    in_dimension = layer_dimension[0]
    # 通过循环来生成5层全连接的神经网络结构
    for i in range(1, n_layers):
        # 定义神经网络上一层的输出,下一层的输入
        out_dimension = layer_dimension[i]
        # 定义当前层中权重的变量,并将变量的L2损失添加到计算图的集合中
        weight = get_weight([in_dimension, out_dimension], 0.001)
        # 定义偏置项
        bias = tf.Variable(tf.constant(0.1, shape=[out_dimension]))
        # 使用RELU激活函数
        cur_layer = tf.nn.relu(tf.matmul(cur_layer, weight) + bias)
        # 定义下一层神经网络的输入节点数
        in_dimension = layer_dimension[i]
        # 定义均方差的损失函数
        mse_loss = tf.reduce_mean(tf.square(y_ - cur_layer))
        # 将均方差孙函数添加到集合
        tf.add_to_collection("losses", mse_loss)
        # 获取整个模型的损失函数,tf.get_collection("losses")返回集合中定义的损失
        # 将整个集合中的损失相加得到整个模型的损失函数
        loss = tf.add_n(tf.get_collection("losses"))

7 实例:预测泰坦尼克号生存率

# 导入panda类库
import pandas as pd
# 导入selection类库
from sklearn.model_selection import train_test_split
# 导入tensorflow类库
import tensorflow.compat.v1 as tf
# 导入numpy类库
import numpy as np
tf.disable_eager_execution()
# 读取数据文件
data = pd.read_csv("Titanic数据集/train.csv")
# 对数据文件数据进行预处理
data['Sex'] = data['Sex'].apply(lambda s: 1 if s == 'male' else 0)
data = data.fillna(0)
dataset_X = data[['Sex', 'Age', 'Pclass', 'SibSp', 'Parch', 'Fare']]
dataset_X = dataset_X.values
data['Deceased'] = data['Survived'].apply(lambda s: int(not s))
dataset_Y = data[['Deceased', 'Survived']]
dataset_Y = dataset_Y.values
X_train, X_val, y_train, y_val = train_test_split(dataset_X, dataset_Y, test_size=0.2, random_state=1)

# 声明占位符
X = tf.placeholder(tf.float32, shape=[None, 6])
y = tf.placeholder(tf.float32, shape=[None, 2])
# 声明变量
W = tf.Variable(tf.random_normal([6, 2]), name='weights')
# 声明偏置项目
bias = tf.Variable(tf.zeros([2]), name='bias')
# 实现节点计算
y_pred = tf.nn.softmax(tf.matmul(X, W) + bias)
# 计算交叉熵
cross_entropy = -tf.reduce_sum(y * tf.log(y_pred + 1e-10), reduction_indices=1)
# 计算损失函数
cost = tf.reduce_mean(cross_entropy)
# 使用梯度下降最小化损失函数
train_op = tf.train.GradientDescentOptimizer(0.001).minimize(cost)

# 建立会话
with tf.Session()as sess:
    # 初始化所有变量
    tf.global_variables_initializer().run()
    # 训练100轮
    for epoch in range(100):
        total_loss = 0.
        for i in range(len(X_train)):
        # 向神经网络中喂入数据
            feed = {X: [X_train[i]], y: [y_train[i]]}
        # 计算损失函数
            _, loss = sess.run([train_op, cost], feed_dict=feed)
        if epoch % 10 == 0:
            print('Epoch: %04d, total loss=%.5f' % (epoch + 1, loss))
    print('Training complete!')
    pred = sess.run(y_pred, feed_dict={X: X_val})
    # 计算预测是否正确
    correct = np.equal(np.argmax(pred, 1), np.argmax(y_val, 1))
    # 计算所有准确率
    accuracy = np.mean(correct.astype(np.float32))
    print("Accuracy on validation set: %.9f" % accuracy)

Epoch: 0001, total loss=0.01460
Epoch: 0011, total loss=0.00436
Epoch: 0021, total loss=0.00371
Epoch: 0031, total loss=0.00315
Epoch: 0041, total loss=0.00263
Epoch: 0051, total loss=0.00221
Epoch: 0061, total loss=0.00182
Epoch: 0071, total loss=0.00149
Epoch: 0081, total loss=0.00123
Epoch: 0091, total loss=0.00103
Training complete!
Accuracy on validation set: 0.670391083

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

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

相关文章

Linux 进程的睡眠和唤醒详解

概要 在Linux中&#xff0c;仅等待CPU时间的进程称为就绪进程&#xff0c;它们被放置在一个运行队列中&#xff0c;一个就绪进程的状 态标志位为 TASK_RUNNING。一旦一个运行中的进程时间片用完&#xff0c; Linux 内核的调度器会剥夺这个进程对CPU的控制权&#xff0c;并且从…

QGIS实现tiff影像栅格数据切片教程

实现栅格切片的方式有很多种,geoserver可以,qgis可以。自己写代码也可以,方式非常多。这篇文章介绍一下如何使用QGIS实现栅格切片。 首先我们要去下载一个qgis软件。下载地址如下: Welcome to the QGIS project! 随后我们打开软件,然后把要切片的栅格数据(tiff文件或者…

【Python 随练】逆序打印数字

题目&#xff1a; 给一个不多于 5 位的正整数&#xff0c;要求&#xff1a; 一、求它是几位数&#xff0c; 二、逆序打印出各位数字。 简介&#xff1a; 在本篇博客中&#xff0c;我们将解决一个关于正整数的问题。根据题目要求&#xff0c;我们需要判断给定的正整数是几位数…

你的仓库VS别人家的仓库,有什么不同?

导读&#xff1a; 近年来&#xff0c;随着新技术的蓬勃发展&#xff0c;企业的仓储管理水平大大提高&#xff0c;PDA、RFID、AGV、立体仓库、智能分拣线等各项新技术的应用层出不穷。然而&#xff0c;着眼于制造型企业&#xff0c;却发现仍有许多仓库处在比较原始、传统、粗放…

[译] DeepSpeed:所有人都能用的超大规模模型训练工具

我们于今年 2 月份发布了 DeepSpeed。这是一个开源深度学习训练优化库&#xff0c;其中包含的一个新的显存优化技术—— ZeRO&#xff08;零冗余优化器&#xff09;&#xff0c;通过扩大规模&#xff0c;提升速度&#xff0c;控制成本&#xff0c;提升可用性&#xff0c;极大地…

如何绘制甘特图?这个软件来帮你

最好用的甘特图软件是什么&#xff1f;先看效果&#xff0c;再放教程&#xff1a; 这是大家用的比较多的excel做出的甘特图&#xff1a; 这是我做的动态甘特图&#xff1a; 两种方法&#xff0c;分享给大家&#xff0c;按需选择即可。 第一种&#xff1a;用Excel制作甘特图 用…

nx安装cuda与cudnn

本文参考 Jetson xavier nx 安装CUDA10.2&#xff0c;和cudnn8.0_jetson安装cuda_三羊木木的博客-CSDN博客 NX安装cuda和cudnn_nx cuda_viatea的博客-CSDN博客 进入nx系统后&#xff0c;输入 sudo apt-get update 更新源 目录 1 cuda 2 cudnn 1 cuda sudo apt-get ins…

如何注册GitHub账号

一、注册GitHub账号 1、浏览器URL中输入地址: https://github.com/ 2、跳转至GitHub官网 3、点击右上角sign up按钮 4、填写注册信息 这个大意是产品更新时消息会通过邮箱发给你&#xff0c;根据需求选择y or n 5、验证账户 有的小伙伴会出现错误信息 Unable to verify you…

考研算法28天:优化版插入排序(折半插入排序)【二分,插入排序】

算法介绍 算法介绍就是说我们原先写的插入排序的这段代码 for(int i1;i<n;i){//开始向前遍历&#xff0c;如果发现前面的元素比//x大的话&#xff0c;就将前面的元素放到x的后面int x q[i],ji;while( j && q[j-1]>x ){q[j] q[j-1];j--;}q[j] x;}我们里面那层…

Redis_6.2.12下载及安装(CentOS7)

文章目录 Redis安装-CentOS71、下载地址2、下载安装流程2.1 安装依赖2.2 官网下载tar包2.3 进入解压目录并编译2.4 启动Redis服务2.5 全局使用redis-cli、redis-server2.6 防火墙开启6379端口查看防火墙状态以及启动、关闭配置firewalld-cmd开启防火墙端口 3、设置开机自动启动…

SpringBoot集成百度人脸识别

SpringBoot集成百度人脸识别 1、概述2、账号申请账号登录注册创建应用 3、抽取模板工具AipFacePropertiesAipFaceTemplateapplication.yml 4、测试 ​ 人脸识别&#xff08;Face Recognition&#xff09;基于图像或视频中的人脸检测、分析和比对技术&#xff0c;提供对您已获授…

如何使用 SpringBoot 创建 RESTful API

如何使用 SpringBoot 创建 RESTful API SpringBoot是一个流行的Java框架&#xff0c;它可以帮助我们快速构建应用程序。其中&#xff0c;创建RESTful API是SpringBoot的常见用例之一。在本文中&#xff0c;我们将介绍如何使用SpringBoot创建RESTful API。 什么是RESTful API …

不同业务场景、不同数据类型,对应亚马逊云科技不同数据库服务

小小的改变&#xff0c;标志一个新时代的全面开启&#xff0c;一个数据库的云原生时代。前不久&#xff0c;Gartner公布了一组数据&#xff0c;引起了不小的讨论度。在2022年全球数据库管理系统的市场份额排名中&#xff0c;作为纯云厂商的亚马逊云科技&#xff0c;超越了老牌传…

电脑如何录屏?3个方法教您win10电脑怎么录屏!

案例&#xff1a;有时手机录屏满足不了我的录制需求&#xff0c;我需要在电脑上录屏&#xff0c;但我对电脑不是特别熟悉&#xff0c;不知道如何在电脑上录屏。 很多小伙伴想在电脑上录制视频&#xff0c;但又不知道如何操作。win10电脑录屏怎么录&#xff1f;有没有简单且详细…

趋势分享 | 多云时代数据安全面临的挑战

IT 和数据管理研究和咨询公司 EMA&#xff08;Enterprise Management Associates&#xff09;早前发布的一份《多云环境下的数据安全》&#xff08;Data Security in a Multi-Cloud World&#xff09;研究报告&#xff0c;调查了来自十个以上不同行业垂直领域、公司规模在 500 …

Kotlin对象和单例模式:探索这种强大设计模式的好处

Kotlin对象和单例模式&#xff1a;探索这种强大设计模式的好处 在Kotlin中&#xff0c;使用关键字"object"来定义一个单例对象。所谓单例对象&#xff0c;就是在整个应用程序中只有一个实例存在。简单来说&#xff0c;就好像只有一个蜘蛛侠一样&#xff0c;不可能同时…

群晖NAS遇到断电如何自动关机

群晖NAS遇到断电时如何自动关机 前置条件实现功能的想法具体实施的步骤开启群晖Linux的SSH登陆安装Putty或是Xshell远程登陆上群晖创建计划任务 前置条件 需要一台UPS&#xff08;品牌功能不限&#xff0c;只需续航5分钟以上就可以&#xff09; 实现功能的想法 通过监控网卡…

基于Python+Django+mysql+html图书管理系统

基于PythonDjangomysqlhtml图书管理系统 一、系统介绍二、功能展示1.用户登陆2.用户注册3.密码修改4.图书查询5.图书添加6.图书修改7.图书删除 三、其它系统四、获取源码 一、系统介绍 该系统实现了 用户登陆、用户注册、密码修改、图书查询、图书添加&#xff0c;图书修改、图…

一场场网络时代的“墨攻”

编辑&#xff1a;阿冒 设计&#xff1a;沐由 公输般为楚造云梯之械成&#xff0c;将以攻宋。子墨子闻之&#xff0c;起于鲁&#xff0c;行十日十夜&#xff0c;而至于郢&#xff0c;见公输般。 子墨子解带为城&#xff0c;以牒为械&#xff0c;公输般九设攻城之机变&#xff0c…

Apifox 自动生成接口

不太好用&#xff0c;很卡 1 下载Apifox https://apifox.com/?utm_sourcebaidu_pinzhuan&utm_mediumsem&utm_campaignpinzhuan&utm_contentpinzhuan&utm_termapifox 2 配置插件 3 IDEA安装插件 安装Apifox Helper 4 配置Apifox Helper ① Apifox 服务器地…