0 总述

简要概述所显示的仪表板(顶部导航栏中的选项卡):

  • Scalars显示损失和准确率指标在每个时期如何变化。 您还可以使用它来跟踪训练速度,学习率和其他标量值。
  • Graphs 可帮助您可视化模型。 在这种情况下,将显示层的Keras图,这可以帮助您确保正确构建。
  • DistributionsHistograms 显示张量随时间的分布。 这对于可视化权重和偏差并验证它们是否以预期的方式变化很有用。

1 Scalars:记录训练过程中各标量的变化

1.1 概述

参考文档

机器学习总是涉及理解关键指标,例如损失 (loss) ,以及它们如何随着训练的进行而变化。 例如,这些指标可以帮助您了解模型是否过拟合,或者是否不必要地训练了太长时间。 您可能需要比较不同训练中的这些指标,以帮助调试和改善模型。

1.2 代码样例

在代码的注释中有详细解释各部分流程:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2022/7/14 11:10
# @Author : hqc
# @File : scalars_usage.py
# @Software: PyCharm### import necessary modulesimport tensorflow as tf
from tensorflow import keras
import datetimeimport numpy as np
print("TensorFlow version: ", tf.__version__)### set data to training regressiondata_size = 1000
# 80% of the data is for training.
train_pct = 0.8
train_size = int(data_size * train_pct)# Create some input data between -1 and 1 and randomize it.
x = np.linspace(-1, 1, data_size) # create 1000 number between (-1, 1) evenly
np.random.shuffle(x)# Generate the output data.
# y = 0.5x + 2 + noise
# noise is created by a normal distribution with mean-value of 0 and standard deviation of 0.05
# shape of '(data_size, )' means one-dimensional array with 1000 elements
y = 0.5 * x + 2 + np.random.normal(0, 0.05, (data_size, ))# Split into test and train pairs.
x_train, y_train = x[:train_size], y[:train_size] # the top 800 figures
x_test, y_test = x[train_size:], y[train_size:] # the last 200 figures### Training the model and logging loss# set the log directory and define a tensorboard callback
logdir = "logs/scalars/" + datetime.datetime.now().strftime("%Y%m%d-%H%M%S")
tensorboard_callback = keras.callbacks.TensorBoard(log_dir=logdir)# create a model with 2 dense layer
model = keras.models.Sequential([keras.layers.Dense(16, input_dim=1),keras.layers.Dense(1),
])
# compile the model
model.compile(loss='mse', # keras.losses.mean_squared_erroroptimizer=keras.optimizers.SGD(learning_rate=0.2),
)
print("Training ... With default parameters, this takes less than 10 seconds.")# training
training_history = model.fit(x_train, # inputy_train, # outputbatch_size=train_size,verbose=0, # Suppress chatty output; use Tensorboard insteadepochs=100,validation_data=(x_test, y_test),callbacks=[tensorboard_callback],
)
print("Average test loss: ", np.average(training_history.history['loss']))

1.3 运行查看

命令行中输入:PS D:\research\python learning\tensorflow learning> tensorboard --logdir tensorboard/logs/scalars

可查看到页面:

可见,对于训练和验证,损失都在持续降低,最后慢慢稳定下来,这意味着这个模型的指标非常好!

1.4 实际验证

给定 (60, 25, 2), 方程式 y = 0.5x + 2 应该会输出 (32, 14.5, 3). 模型会输出一样的结果吗?
加入以下代码:

### predict a real data
print(model.predict([60, 25, 2]))
# 理想的输出结果是:
# [[32.0]
#  [14.5]
#  [ 3.0]]

输出结果如下:可见很符合!

1.5 高阶应用:记录自定义的标量

重新训练回归模型并记录自定义学习率。如以下步骤所示:

  1. 使用 tf.summary.create_file_writer() 创建文件编写器。
  2. 定义自定义学习率函数。 这将传递给 Keras LearningRateScheduler 回调。
  3. 在学习率函数内部,使用 tf.summary.scalar() 记录自定义学习率。
  4. LearningRateScheduler 回调传递给 Model.fit()。

完整代码:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2022/7/14 11:10
# @Author : hqc
# @File : scalars_usage.py
# @Software: PyCharm### import necessary modulesimport tensorflow as tf
from tensorflow import keras
import datetimeimport numpy as np
print("TensorFlow version: ", tf.__version__)### set data to training regressiondata_size = 1000
# 80% of the data is for training.
train_pct = 0.8
train_size = int(data_size * train_pct)# Create some input data between -1 and 1 and randomize it.
x = np.linspace(-1, 1, data_size) # create 1000 number between (-1, 1) evenly
np.random.shuffle(x)# Generate the output data.
# y = 0.5x + 2 + noise
# noise is created by a normal distribution with mean-value of 0 and standard deviation of 0.05
# shape of '(data_size, )' means one-dimensional array with 1000 elements
y = 0.5 * x + 2 + np.random.normal(0, 0.05, (data_size, ))# Split into test and train pairs.
x_train, y_train = x[:train_size], y[:train_size] # the top 800 figures
x_test, y_test = x[train_size:], y[train_size:] # the last 200 figures### set the log directory and define a tensorboard callback
logdir = "logs/scalars/" + datetime.datetime.now().strftime("%Y%m%d-%H%M%S")
tensorboard_callback = keras.callbacks.TensorBoard(log_dir=logdir)### log custom scalars
# create a writer
file_writer = tf.summary.create_file_writer(logdir + "/metrics")
file_writer.set_as_default() # when migrate tf1 to tf2, this is useful# define a learning_rate fn
def lr_schedule(epoch):"""Returns a custom learning rate that decreases as epochs progress."""learning_rate = 0.2if epoch > 10:learning_rate = 0.02if epoch > 20:learning_rate = 0.01if epoch > 50:learning_rate = 0.005tf.summary.scalar('learning rate', data=learning_rate, step=epoch) # used to log itreturn learning_rate# define a lr callback
lr_callback = keras.callbacks.LearningRateScheduler(lr_schedule)### create a model with 2 dense layer
model = keras.models.Sequential([keras.layers.Dense(16, input_dim=1),keras.layers.Dense(1),
])
### compile the model
model.compile(loss='mse', # keras.losses.mean_squared_erroroptimizer=keras.optimizers.SGD(learning_rate=0.2),
)
print("Training ... With default parameters, this takes less than 10 seconds.")### training
training_history = model.fit(x_train, # inputy_train, # outputbatch_size=train_size,verbose=0, # Suppress chatty output; use Tensorboard insteadepochs=100,validation_data=(x_test, y_test),callbacks=[tensorboard_callback, lr_callback],
)
print("Average test loss: ", np.average(training_history.history['loss']))### predict a real data
print(model.predict([60, 25, 2]))
# 理想的输出结果是:
# [[32.0]
#  [14.5]
#  [ 3.0]]

运行后发现:log里边多了一个metrics文件夹,这就是保存自定义学习率的地方

运行结果查看:

可见可以查看到学习率的训练过程变化~

2 Image:显示图像数据

2.1 概述

参考文档

使用 TensorFlow Image Summary API,您可以轻松地在 TensorBoard 中记录张量和任意图像并进行查看。这在采样和检查输入数据,或可视化层权重生成的张量方面非常实用。您还可以将诊断数据记录为图像,这在模型开发过程中可能会有所帮助。

在本教程中,您将了解如何使用 Image Summary API 将张量可视化为图像。您还将了解如何获取任意图像,将其转换为张量并在 TensorBoard 中进行可视化。教程将通过一个简单而真实的示例,向您展示使用图像摘要了解模型性能。

2.2 可视化一张图片代码样例

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2022/7/14 12:40
# @Author : hqc
# @File : image_usage.py
# @Software: PyCharm### import necessary modulesfrom datetime import datetime
import io # related to file reading and writing
import itertools # used to operate the iterator
#from packaging import version # 语义化版本
#from six.moves import range # six is used to compatible with py2 and py3import tensorflow as tf
from tensorflow import kerasimport matplotlib.pyplot as plt
import numpy as np
import sklearn.metrics # 评价指标print("TensorFlow version: ", tf.__version__)### download Fashion-MNIST dataset
# Download the data. The data is already divided into train and test.
# The labels are integers representing classes.
fashion_mnist = keras.datasets.fashion_mnist
(train_images, train_labels), (test_images, test_labels) = \fashion_mnist.load_data()# Names of the integer classes, i.e., 0 -> T-short/top, 1 -> Trouser, etc.
class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat','Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']### make sure the shape of train data
print("Shape: ", train_images[0].shape)
print("Label: ", train_labels[0], "->", class_names[train_labels[0]])
# Shape:  (28, 28)
# Label:  9 -> Ankle boot'''
tf.summary.image() API needs to contain 4-tensors:(batch_size, height, width, channels)
so we should reshape train data, because we just log one image so batch_size set to -1;
and the image is gray-scaled, so channels set to 1.
'''
# Reshape the image for the Summary API.
img = np.reshape(train_images[0], (-1, 28, 28, 1))### set the log directory
logdir = "logs/images/" + datetime.now().strftime("%Y%m%d-%H%M%S")
# Creates a file writer for the log directory.
file_writer = tf.summary.create_file_writer(logdir)# Using the file writer, log the reshaped image.
with file_writer.as_default():tf.summary.image("images", img, step=0)

到此为止,运行之后便可以查看单个图像了:可以调节亮度和对比度

2.3 加上可视化25张图片代码样例

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2022/7/14 12:40
# @Author : hqc
# @File : image_usage.py
# @Software: PyCharm### import necessary modulesfrom datetime import datetime
import io # related to file reading and writing
import itertools # used to operate the iterator
#from packaging import version # 语义化版本
#from six.moves import range # six is used to compatible with py2 and py3import tensorflow as tf
from tensorflow import kerasimport matplotlib.pyplot as plt
import numpy as np
import sklearn.metrics # 评价指标print("TensorFlow version: ", tf.__version__)### download Fashion-MNIST dataset
# Download the data. The data is already divided into train and test.
# The labels are integers representing classes.
fashion_mnist = keras.datasets.fashion_mnist
(train_images, train_labels), (test_images, test_labels) = \fashion_mnist.load_data()# Names of the integer classes, i.e., 0 -> T-short/top, 1 -> Trouser, etc.
class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat','Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']### make sure the shape of train data
print("Shape: ", train_images[0].shape)
print("Label: ", train_labels[0], "->", class_names[train_labels[0]])
# Shape:  (28, 28)
# Label:  9 -> Ankle boot'''
tf.summary.image() API needs to contain 4-tensors:(batch_size, height, width, channels)
so we should reshape train data, because we just log one image so batch_size set to -1;
and the image is gray-scaled, so channels set to 1.
'''
# Reshape a image for the Summary API.
img = np.reshape(train_images[0], (-1, 28, 28, 1))
# Reshape 25 images for the Summary API.
images = np.reshape(train_images[0:25], (-1, 28, 28, 1))### set the log directory
logdir = "logs/images/" + datetime.now().strftime("%Y%m%d-%H%M%S")
# Creates a file writer for the log directory.
file_writer = tf.summary.create_file_writer(logdir)# Using the file writer, log the reshaped image.
with file_writer.as_default():tf.summary.image("image", img, step=0)tf.summary.image("25 training data examples", images, max_outputs=25, step=0)

可见,可视化成功!

2.4 记录matplotlib生成的图像

需要一些样板代码来将图转换为张量,随后便可继续处理。
完整代码如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2022/7/14 13:49
# @Author : hqc
# @File : plot_to_image_usage.py
# @Software: PyCharm### import necessary modulesfrom datetime import datetime
import io # related to file reading and writing
import itertools # used to operate the iterator
#from packaging import version # 语义化版本
#from six.moves import range # six is used to compatible with py2 and py3import tensorflow as tf
from tensorflow import kerasimport matplotlib.pyplot as plt
import numpy as np
import sklearn.metrics # 评价指标print("TensorFlow version: ", tf.__version__)### download Fashion-MNIST dataset
# Download the data. The data is already divided into train and test.
# The labels are integers representing classes.
fashion_mnist = keras.datasets.fashion_mnist
(train_images, train_labels), (test_images, test_labels) = \fashion_mnist.load_data()# Names of the integer classes, i.e., 0 -> T-short/top, 1 -> Trouser, etc.
class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat','Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']### set the log directory
logdir = "logs/plots/" + datetime.now().strftime("%Y%m%d-%H%M%S")
# Creates a file writer for the log directory.
file_writer = tf.summary.create_file_writer(logdir)### convert plot to image
def plot_to_image(figure):"""Converts the matplotlib plot specified by 'figure' to a PNG image andreturns it. The supplied figure is closed and inaccessible after this call."""# Save the plot to a PNG in memory.buf = io.BytesIO()plt.savefig(buf, format='png')#plt.close(figure)# Closing the figure prevents it from being displayed directly inside the notebook.buf.seek(0) # read from the top of this file# Convert PNG buffer to TF imageimage = tf.image.decode_png(buf.getvalue(), channels=4)# Add the batch dimensionimage = tf.expand_dims(image, 0)return imagedef image_grid():"""Return a 5x5 grid of the MNIST images as a matplotlib figure."""# Create a figure to contain the plot.figure = plt.figure(figsize=(10,10))for i in range(25):# Start next subplot.plt.subplot(5, 5, i + 1, title=class_names[train_labels[i]])plt.xticks([])plt.yticks([])plt.grid(False)plt.imshow(train_images[i], cmap=plt.cm.binary)return figure# Prepare the plot
figure = image_grid()
# Convert to image and log
with file_writer.as_default():tf.summary.image("Training data", plot_to_image(figure), step=0)

运行结果查看:

2.5 高阶应用:模型训练中构建图像分类器

这种方式看不大懂,仅附上能够运行的完整代码及运行结果

完整代码:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2022/7/14 14:50
# @Author : hqc
# @File : model_with_image_usage.py
# @Software: PyCharm### import necessary modulesfrom datetime import datetime
import io # related to file reading and writing
import itertools # used to operate the iterator
#from packaging import version # 语义化版本
from six.moves import range # six is used to compatible with py2 and py3import tensorflow as tf
from tensorflow import kerasimport matplotlib.pyplot as plt
import numpy as np
import sklearn.metrics # 评价指标print("TensorFlow version: ", tf.__version__)### download Fashion-MNIST dataset
# Download the data. The data is already divided into train and test.
# The labels are integers representing classes.
fashion_mnist = keras.datasets.fashion_mnist
(train_images, train_labels), (test_images, test_labels) = \fashion_mnist.load_data()# Names of the integer classes, i.e., 0 -> T-short/top, 1 -> Trouser, etc.
class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat','Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']### define and compile a model
model = keras.models.Sequential([keras.layers.Flatten(input_shape=(28, 28)),keras.layers.Dense(32, activation='relu'),keras.layers.Dense(10, activation='softmax')
])model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy']
)def plot_confusion_matrix(cm, class_names):"""Returns a matplotlib figure containing the plotted confusion matrix.Args:cm (array, shape = [n, n]): a confusion matrix of integer classesclass_names (array, shape = [n]): String names of the integer classes"""figure = plt.figure(figsize=(8, 8))plt.imshow(cm, interpolation='nearest', cmap=plt.cm.Blues)plt.title("Confusion matrix")plt.colorbar()tick_marks = np.arange(len(class_names))plt.xticks(tick_marks, class_names, rotation=45)plt.yticks(tick_marks, class_names)# Normalize the confusion matrix.cm = np.around(cm.astype('float') / cm.sum(axis=1)[:, np.newaxis], decimals=2)# Use white text if squares are dark; otherwise black.threshold = cm.max() / 2.for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])):color = "white" if cm[i, j] > threshold else "black"plt.text(j, i, cm[i, j], horizontalalignment="center", color=color)plt.tight_layout()plt.ylabel('True label')plt.xlabel('Predicted label')return figure### set the log directory
logdir = "logs/model/" + datetime.now().strftime("%Y%m%d-%H%M%S")
# Define the basic TensorBoard callback.
tensorboard_callback = keras.callbacks.TensorBoard(log_dir=logdir)
file_writer_cm = tf.summary.create_file_writer(logdir + '/cm')### convert plot to image
def plot_to_image(figure):"""Converts the matplotlib plot specified by 'figure' to a PNG image andreturns it. The supplied figure is closed and inaccessible after this call."""# Save the plot to a PNG in memory.buf = io.BytesIO()plt.savefig(buf, format='png')#plt.close(figure)# Closing the figure prevents it from being displayed directly inside the notebook.buf.seek(0) # read from the top of this file# Convert PNG buffer to TF imageimage = tf.image.decode_png(buf.getvalue(), channels=4)# Add the batch dimensionimage = tf.expand_dims(image, 0)return imagedef log_confusion_matrix(epoch, logs):# Use the model to predict the values from the validation dataset.test_pred_raw = model.predict(test_images)test_pred = np.argmax(test_pred_raw, axis=1)# Calculate the confusion matrix.cm = sklearn.metrics.confusion_matrix(test_labels, test_pred)# Log the confusion matrix as an image summary.figure = plot_confusion_matrix(cm, class_names=class_names)cm_image = plot_to_image(figure)# Log the confusion matrix as an image summary.with file_writer_cm.as_default():tf.summary.image("Confusion Matrix", cm_image, step=epoch)# Define the per-epoch callback.
cm_callback = keras.callbacks.LambdaCallback(on_epoch_end=log_confusion_matrix)# Train the classifier.
model.fit(train_images,train_labels,epochs=5,verbose=0, # Suppress chatty outputcallbacks=[tensorboard_callback, cm_callback],validation_data=(test_images, test_labels),
)

运行结果:

3 Graph:查看模型图

3.1 概述

官方文档

TensorBoard 的 GRAPH仪表盘 是检查 TensorFlow 模型的强大工具。您可以快速查看模型结构的预览图,并确保其符合您的预期想法。 您还可以查看操作级图以了解 TensorFlow 如何理解您的程序。检查操作级图可以使您深入了解如何更改模型。例如,如果训练进度比预期的慢,则可以重新设计模型。

本教程简要概述了如何在 TensorBoard 的 GRAPH仪表板中生成图诊断数据并将其可视化。您将为 Fashion-MNIST 数据集定义和训练一个简单的 Keras 序列模型,并学习如何记录和检查模型图。您还将使用跟踪API为使用新的 tf.function 注释创建的函数生成图数据。

本节以minst训练为例,见tensorboard可视化工具使用示例(tf2.6)。

3.2 执行图:op-level graph

默认情况下,TensorBoard 显示 op-level图。(在左侧,您可以看到已选择 “Default” 标签。)请注意,图是倒置的。 数据从下到上流动,因此与代码相比是上下颠倒的。 但是,您可以看到该图与 Keras 模型定义紧密匹配,并具有其他计算节点的额外边缘。

图通常很大,因此您可以操纵图的可视化效果:

  • 滚动来放大和缩小
  • 拖动进行图的平移
  • 双击进行节点扩展(一个节点可以是其他节点的容器)

您还可以通过单击节点来查看元数据。这使您可以查看输入,输出,形状和其他详细信息。

3.3 概念图

除了执行图,TensorBoard 还显示一个“概念图”。 这只是 Keras 模型的视图。 如果您要重新使用保存的模型并且想要检查或验证其结构,这可能会很有用。

要查看概念图,请选择 “keras” 标签。 在此示例中,您将看到一个折叠的 Sequential 节点。 双击节点以查看模型的结构:

3.4 高阶应用:tf.function的图

到目前为止的示例已经描述了 Keras 模型的图,其中这些图是通过定义 Keras 层并调用 Model.fit() 创建的。

您可能会遇到需要使用 tf.function 注释来[autograph]的情况,即将 Python 计算函数转换为高性能 TensorFlow 图。对于这些情况,您可以使用 TensorBoard 中的 TensorFlow Summary Trace API 记录签名函数以进行可视化。

要使用 Summary Trace API ,请执行以下操作:

  • 使用 tf.function 定义和注释功能
  • 在函数调用站点之前立即使用 tf.summary.trace_on()
  • 通过传递 profiler=True 将配置文件信息(内存,CPU时间)添加到图中
  • 使用摘要文件编写器,调用 tf.summary.trace_export() 保存日志数据

然后,您可以使用 TensorBoard 查看函数的行为。

完整代码如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2022/7/13 20:48
# @Author : hqc
# @File : tensorboard_usage.py
# @Software: PyCharm# import necessary modules
import tensorflow as tf
from datetime import datetime# The function to be traced.
@tf.function
def my_func(x, y):# A simple hand-rolled layer.return tf.nn.relu(tf.matmul(x, y))# Set up logging.
stamp = datetime.now().strftime("%Y%m%d-%H%M%S")
logdir = 'logs/func/%s' % stamp
writer = tf.summary.create_file_writer(logdir)# Sample data for your function.
x = tf.random.uniform((3, 3))
y = tf.random.uniform((3, 3))# Bracket the function call with
# tf.summary.trace_on() and tf.summary.trace_export().
tf.summary.trace_on(graph=True, profiler=True)
# Call only one tf.function when tracing.
z = my_func(x, y)
with writer.as_default():tf.summary.trace_export(name="my_func_trace",step=0,profiler_outdir=logdir)

查看运行结果:

4 Text:查看文本信息

4.1 概述

官方文档

可以很简单地在tensorboard中查看任意文本。

4.2 记录单条文本

完整代码如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2022/7/14 16:03
# @Author : hqc
# @File : text_single_usage.py
# @Software: PyCharm### import necessary modulesimport tensorflow as tf
from datetime import datetimeprint("TensorFlow version: ", tf.__version__)### define your text
my_text = "Hello world! 												

tensorboard使用界面介绍以及使用方法(看这篇就够了,都有源码可以直接测试)相关推荐

  1. redis详细介绍附实例代码--看一篇就够了

    自己开发了一个股票智能分析软件,功能很强大,需要的点击下面的链接获取: https://www.cnblogs.com/bclshuai/p/11380657.html redis介绍详解附实例代码- ...

  2. lombok时运行编译无法找到get/set方法 看这篇就够了

    今天项目突然运行的时候报错,提示找不到get和set方法,这个时候我就检查了项目,在编译器(idea)是没有报错的.说明编译没问题,只是运行过不去. 后面就开始用我的方法解决这个问题,一步一步排查. ...

  3. .NET Core实战项目之CMS 第二章 入门篇-快速入门ASP.NET Core看这篇就够了

    本来这篇只是想简单介绍下ASP.NET Core MVC项目的(毕竟要照顾到很多新手朋友),但是转念一想不如来点猛的(考虑到急性子的朋友),让你通过本文的学习就能快速的入门ASP.NET Core.既 ...

  4. [译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了

    园子里关于ASP.NET Core Web API的教程很多,但大多都是使用EF+Mysql或者EF+MSSQL的文章.甚至关于ASP.NET Core Web API中使用Dapper+Mysql组 ...

  5. 面试率 90% 的JS事件循环Event Loop,看这篇就够了!! !

    面试率 90% 的JS事件循环Event Loop,看这篇就够了!! ! 事件循环(Event Loop)大家应该并不陌生,它是前端极其重要的基础知识.在平时的讨论或者面试中也是一个非常高频的话题. ...

  6. python中tkinter模块窗口操作_Python GUI之tkinter窗口视窗教程大集合(看这篇就够了)...

    本篇博文搬到个人博客:[洪卫の博客](https://sunhwee.com)上面去了,想要获得最佳阅读体验,欢迎前往 [https://sunhwee.com](洪卫の博客), 建议用电脑查看教程文 ...

  7. [个人向]超快速了解微信小程序:看这篇就够了!(注册、语言、框架、配额等简要说明)

    [个人向]超快速了解微信小程序看这篇就够了+相关简要说明 本文精炼微信小程序开发文档相关内容,旨在对初次接触并准备开发小程序的童鞋(比如自己)提供一个快速了解攻略.其中包括注册相关.语言.框架模式.相 ...

  8. React入门看这篇就够了

    2019独角兽企业重金招聘Python工程师标准>>> 摘要: 很多值得了解的细节. 原文:React入门看这篇就够了 作者:Random Fundebug经授权转载,版权归原作者所 ...

  9. ASP.NET Core WebApi使用Swagger生成api说明文档看这篇就够了

    引言 在使用asp.net core 进行api开发完成后,书写api说明文档对于程序员来说想必是件很痛苦的事情吧,但文档又必须写,而且文档的格式如果没有具体要求的话,最终完成的文档则完全取决于开发者 ...

最新文章

  1. pytorch 维度练习
  2. 玩转Autorun.inf
  3. 解决'pip' 不是内部或外部命令,也不是可运行的程序或批处理文件的问题
  4. C++中class与struct的区别
  5. 谁来代替博客园——寄生博客
  6. 常量的定义与使用 1006 c#
  7. 实现服务器和客户端数据交互,Java Socket有妙招
  8. FastDFS安装脚本
  9. 不可识别的字符转义序列_大庆事业单位车牌识别道闸多少钱,感应小区车牌识别道闸系统...
  10. 编程基本功:工作完成之后,还有做好、做精、做美、做顶、做宗等境界
  11. API接口测试用例设计
  12. 明清时期中央朝廷与地方关系中的江南著姓望族
  13. c语言case用法注意,switch-case基本用法与注意事项
  14. win10系统如何设置局域网服务器,win10系统如何设置局域网共享
  15. Secure Multiparty Computation (MPC)
  16. 唐威:用rust写椭圆曲线算法
  17. 与计算机学男生谈恋爱,和什么专业男生谈恋爱比较惨?
  18. yolov4-tiny使用jetson nano进行目标检测+tensorrt+CSI+USB摄像头检测
  19. CSS background-image
  20. 交换机、路由器、网关的概念,并知道各自的用途

热门文章

  1. 面向对象编程小项目,语音播报计算器
  2. 计算机系统软件和应用软件的区别
  3. 即插即用demo系列——文本相似度比较
  4. 有关mean iou 言简意赅的介绍 及python 代码实现
  5. 计算机设备的工作原理,计算机工作原理
  6. ESP8266 WIFI ARDUINO单芯片 APP/微信远程控制继电器等 设备源码及说明
  7. 分辨率自动调节html,网页根据分辨率自适应
  8. Python AutoCAD 注释
  9. 视频AI融合视频平台(LiveMedia视频监控平台)
  10. 网易云课堂web安全第一天