tensoflow2.6训练自己的图像分类
包括建立Squential模型和keras内置模型
import warningsfrom PIL import Imagewarnings.filterwarnings("ignore")
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'from tensorflow.keras import (models,layers,callbacks,utils,)
import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np
import pathlibdef load_dataset():""" 载入数据\n"""data_dir = "flower_photos"data_dir = pathlib.Path(data_dir)image_count = len(list(data_dir.glob('*/*.jpg')))print('total images number:',image_count)roses = list(data_dir.glob('roses/*'))aimage = Image.open(str(roses[1]))# aimage.show()batch_size = 32train_ds = utils.image_dataset_from_directory(data_dir,validation_split=0.2,subset="training",seed=123,image_size=(img_height, img_width),batch_size=batch_size)val_ds = utils.image_dataset_from_directory(data_dir,validation_split=0.2,subset="validation",seed=123,image_size=(img_height, img_width),batch_size=batch_size)class_names = train_ds.class_namesprint('class names:',class_names)return train_ds,val_ds,class_namesdef show_some_images():plt.figure()for images, labels in train_ds.take(2):for i in range(16):ax = plt.subplot(4,4,i+1)plt.imshow(images[i].numpy().astype('uint8'))plt.title(classnames[labels[i]])plt.axis('off')plt.show()def create_a_sequenceModel():""" 建立一个模型 """num_classes = 5# model = models.Sequential([# # tf.keras.layers.Rescaling(1./255, input_shape=(img_height,img_width,3)),# layers.Conv2D(16,3,padding='same',activation='relu',input_shape=(img_height,img_width,3)),# layers.MaxPooling2D(),# layers.Dropout(0.2),# layers.Conv2D(32,3,padding='same',activation='relu'),# layers.MaxPooling2D(),# layers.Dropout(0.2),# layers.Conv2D(64,3,padding='same',activation='relu'),# layers.MaxPooling2D(),# layers.Flatten(),# layers.Dense(128,activation='relu'),# layers.Dense(num_classes),# ])#todo: create a model from kerasmodel = tf.keras.applications.xception.Xception(input_shape=(img_height,img_width,3),include_top=True,weights=None,classes=5)return modelif __name__ == '__main__':img_height = 180img_width = 180train_ds, val_ds, classnames = load_dataset()# show_some_images()# for image_batch, labels_batch in train_ds:# print(image_batch.shape)# print(labels_batch.shape)# breakAUTOTUNE = tf.data.AUTOTUNEtrain_ds = train_ds.cache().shuffle(1000).prefetch(buffer_size=AUTOTUNE)val_ds = val_ds.cache().prefetch(buffer_size=AUTOTUNE)#todo: standardize the datanormalization_layer = tf.keras.layers.Rescaling(1./255)normalized_ds = train_ds.map(lambda x,y:(normalization_layer(x),y))image_batch, labels_batch = next(iter(normalized_ds))first_image = image_batch[0]print('min and max:',np.min(first_image),np.max(first_image))model = create_a_sequenceModel()model.compile(optimizer='adam',loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),metrics=['accuracy'])model.summary()#todo: set callbackslogdir = 'logs/'if not os.path.exists(logdir):os.mkdir(logdir)checkpoint_path = logdir+"EP{epoch:03d}_acc{accuracy:.3f}-vac{val_accuracy:.3f}.h5"checkpoint_dir = os.path.dirname(checkpoint_path)cp_callback = callbacks.ModelCheckpoint(filepath=checkpoint_path,save_best_only=True,save_weights_only=True,verbose=1)#todo: train the modelepochs = 10history = model.fit(train_ds,validation_data=val_ds,epochs=epochs,callbacks=[cp_callback])
total images number: 3670
Found 3670 files belonging to 5 classes.
Using 2936 files for training.
Found 3670 files belonging to 5 classes.
Using 734 files for validation.
class names: ['daisy', 'dandelion', 'roses', 'sunflowers', 'tulips']
min and max: 0.0 1.0
Model: "xception"
__________________________________________________________________________________________________Layer (type) Output Shape Param # Connected to
==================================================================================================input_1 (InputLayer) [(None, 180, 180, 3 0 [] )] block1_conv1 (Conv2D) (None, 89, 89, 32) 864 ['input_1[0][0]'] block1_conv1_bn (BatchNormaliz (None, 89, 89, 32) 128 ['block1_conv1[0][0]'] ation) block1_conv1_act (Activation) (None, 89, 89, 32) 0 ['block1_conv1_bn[0][0]'] block1_conv2 (Conv2D) (None, 87, 87, 64) 18432 ['block1_conv1_act[0][0]'] block1_conv2_bn (BatchNormaliz (None, 87, 87, 64) 256 ['block1_conv2[0][0]'] ation) block1_conv2_act (Activation) (None, 87, 87, 64) 0 ['block1_conv2_bn[0][0]'] block2_sepconv1 (SeparableConv (None, 87, 87, 128) 8768 ['block1_conv2_act[0][0]'] 2D) block2_sepconv1_bn (BatchNorma (None, 87, 87, 128) 512 ['block2_sepconv1[0][0]'] lization) block2_sepconv2_act (Activatio (None, 87, 87, 128) 0 ['block2_sepconv1_bn[0][0]'] n) block2_sepconv2 (SeparableConv (None, 87, 87, 128) 17536 ['block2_sepconv2_act[0][0]'] 2D) block2_sepconv2_bn (BatchNorma (None, 87, 87, 128) 512 ['block2_sepconv2[0][0]'] lization) conv2d (Conv2D) (None, 44, 44, 128) 8192 ['block1_conv2_act[0][0]'] block2_pool (MaxPooling2D) (None, 44, 44, 128) 0 ['block2_sepconv2_bn[0][0]'] batch_normalization (BatchNorm (None, 44, 44, 128) 512 ['conv2d[0][0]'] alization) add (Add) (None, 44, 44, 128) 0 ['block2_pool[0][0]', 'batch_normalization[0][0]'] block3_sepconv1_act (Activatio (None, 44, 44, 128) 0 ['add[0][0]'] n) block3_sepconv1 (SeparableConv (None, 44, 44, 256) 33920 ['block3_sepconv1_act[0][0]'] 2D) block3_sepconv1_bn (BatchNorma (None, 44, 44, 256) 1024 ['block3_sepconv1[0][0]'] lization) block3_sepconv2_act (Activatio (None, 44, 44, 256) 0 ['block3_sepconv1_bn[0][0]'] n) block3_sepconv2 (SeparableConv (None, 44, 44, 256) 67840 ['block3_sepconv2_act[0][0]'] 2D) block3_sepconv2_bn (BatchNorma (None, 44, 44, 256) 1024 ['block3_sepconv2[0][0]'] lization) conv2d_1 (Conv2D) (None, 22, 22, 256) 32768 ['add[0][0]'] block3_pool (MaxPooling2D) (None, 22, 22, 256) 0 ['block3_sepconv2_bn[0][0]'] batch_normalization_1 (BatchNo (None, 22, 22, 256) 1024 ['conv2d_1[0][0]'] rmalization) add_1 (Add) (None, 22, 22, 256) 0 ['block3_pool[0][0]', 'batch_normalization_1[0][0]'] block4_sepconv1_act (Activatio (None, 22, 22, 256) 0 ['add_1[0][0]'] n) block4_sepconv1 (SeparableConv (None, 22, 22, 728) 188672 ['block4_sepconv1_act[0][0]'] 2D) block4_sepconv1_bn (BatchNorma (None, 22, 22, 728) 2912 ['block4_sepconv1[0][0]'] lization) block4_sepconv2_act (Activatio (None, 22, 22, 728) 0 ['block4_sepconv1_bn[0][0]'] n) block4_sepconv2 (SeparableConv (None, 22, 22, 728) 536536 ['block4_sepconv2_act[0][0]'] 2D) block4_sepconv2_bn (BatchNorma (None, 22, 22, 728) 2912 ['block4_sepconv2[0][0]'] lization) conv2d_2 (Conv2D) (None, 11, 11, 728) 186368 ['add_1[0][0]'] block4_pool (MaxPooling2D) (None, 11, 11, 728) 0 ['block4_sepconv2_bn[0][0]'] batch_normalization_2 (BatchNo (None, 11, 11, 728) 2912 ['conv2d_2[0][0]'] rmalization) add_2 (Add) (None, 11, 11, 728) 0 ['block4_pool[0][0]', 'batch_normalization_2[0][0]'] block5_sepconv1_act (Activatio (None, 11, 11, 728) 0 ['add_2[0][0]'] n) block5_sepconv1 (SeparableConv (None, 11, 11, 728) 536536 ['block5_sepconv1_act[0][0]'] 2D) block5_sepconv1_bn (BatchNorma (None, 11, 11, 728) 2912 ['block5_sepconv1[0][0]'] lization) block5_sepconv2_act (Activatio (None, 11, 11, 728) 0 ['block5_sepconv1_bn[0][0]'] n) block5_sepconv2 (SeparableConv (None, 11, 11, 728) 536536 ['block5_sepconv2_act[0][0]'] 2D) block5_sepconv2_bn (BatchNorma (None, 11, 11, 728) 2912 ['block5_sepconv2[0][0]'] lization) block5_sepconv3_act (Activatio (None, 11, 11, 728) 0 ['block5_sepconv2_bn[0][0]'] n) block5_sepconv3 (SeparableConv (None, 11, 11, 728) 536536 ['block5_sepconv3_act[0][0]'] 2D) block5_sepconv3_bn (BatchNorma (None, 11, 11, 728) 2912 ['block5_sepconv3[0][0]'] lization) add_3 (Add) (None, 11, 11, 728) 0 ['block5_sepconv3_bn[0][0]', 'add_2[0][0]'] block6_sepconv1_act (Activatio (None, 11, 11, 728) 0 ['add_3[0][0]'] n) block6_sepconv1 (SeparableConv (None, 11, 11, 728) 536536 ['block6_sepconv1_act[0][0]'] 2D) block6_sepconv1_bn (BatchNorma (None, 11, 11, 728) 2912 ['block6_sepconv1[0][0]'] lization) block6_sepconv2_act (Activatio (None, 11, 11, 728) 0 ['block6_sepconv1_bn[0][0]'] n) block6_sepconv2 (SeparableConv (None, 11, 11, 728) 536536 ['block6_sepconv2_act[0][0]'] 2D) block6_sepconv2_bn (BatchNorma (None, 11, 11, 728) 2912 ['block6_sepconv2[0][0]'] lization) block6_sepconv3_act (Activatio (None, 11, 11, 728) 0 ['block6_sepconv2_bn[0][0]'] n) block6_sepconv3 (SeparableConv (None, 11, 11, 728) 536536 ['block6_sepconv3_act[0][0]'] 2D) block6_sepconv3_bn (BatchNorma (None, 11, 11, 728) 2912 ['block6_sepconv3[0][0]'] lization) add_4 (Add) (None, 11, 11, 728) 0 ['block6_sepconv3_bn[0][0]', 'add_3[0][0]'] block7_sepconv1_act (Activatio (None, 11, 11, 728) 0 ['add_4[0][0]'] n) block7_sepconv1 (SeparableConv (None, 11, 11, 728) 536536 ['block7_sepconv1_act[0][0]'] 2D) block7_sepconv1_bn (BatchNorma (None, 11, 11, 728) 2912 ['block7_sepconv1[0][0]'] lization) block7_sepconv2_act (Activatio (None, 11, 11, 728) 0 ['block7_sepconv1_bn[0][0]'] n) block7_sepconv2 (SeparableConv (None, 11, 11, 728) 536536 ['block7_sepconv2_act[0][0]'] 2D) block7_sepconv2_bn (BatchNorma (None, 11, 11, 728) 2912 ['block7_sepconv2[0][0]'] lization) block7_sepconv3_act (Activatio (None, 11, 11, 728) 0 ['block7_sepconv2_bn[0][0]'] n) block7_sepconv3 (SeparableConv (None, 11, 11, 728) 536536 ['block7_sepconv3_act[0][0]'] 2D) block7_sepconv3_bn (BatchNorma (None, 11, 11, 728) 2912 ['block7_sepconv3[0][0]'] lization) add_5 (Add) (None, 11, 11, 728) 0 ['block7_sepconv3_bn[0][0]', 'add_4[0][0]'] block8_sepconv1_act (Activatio (None, 11, 11, 728) 0 ['add_5[0][0]'] n) block8_sepconv1 (SeparableConv (None, 11, 11, 728) 536536 ['block8_sepconv1_act[0][0]'] 2D) block8_sepconv1_bn (BatchNorma (None, 11, 11, 728) 2912 ['block8_sepconv1[0][0]'] lization) block8_sepconv2_act (Activatio (None, 11, 11, 728) 0 ['block8_sepconv1_bn[0][0]'] n) block8_sepconv2 (SeparableConv (None, 11, 11, 728) 536536 ['block8_sepconv2_act[0][0]'] 2D) block8_sepconv2_bn (BatchNorma (None, 11, 11, 728) 2912 ['block8_sepconv2[0][0]'] lization) block8_sepconv3_act (Activatio (None, 11, 11, 728) 0 ['block8_sepconv2_bn[0][0]'] n) block8_sepconv3 (SeparableConv (None, 11, 11, 728) 536536 ['block8_sepconv3_act[0][0]'] 2D) block8_sepconv3_bn (BatchNorma (None, 11, 11, 728) 2912 ['block8_sepconv3[0][0]'] lization) add_6 (Add) (None, 11, 11, 728) 0 ['block8_sepconv3_bn[0][0]', 'add_5[0][0]'] block9_sepconv1_act (Activatio (None, 11, 11, 728) 0 ['add_6[0][0]'] n) block9_sepconv1 (SeparableConv (None, 11, 11, 728) 536536 ['block9_sepconv1_act[0][0]'] 2D) block9_sepconv1_bn (BatchNorma (None, 11, 11, 728) 2912 ['block9_sepconv1[0][0]'] lization) block9_sepconv2_act (Activatio (None, 11, 11, 728) 0 ['block9_sepconv1_bn[0][0]'] n) block9_sepconv2 (SeparableConv (None, 11, 11, 728) 536536 ['block9_sepconv2_act[0][0]'] 2D) block9_sepconv2_bn (BatchNorma (None, 11, 11, 728) 2912 ['block9_sepconv2[0][0]'] lization) block9_sepconv3_act (Activatio (None, 11, 11, 728) 0 ['block9_sepconv2_bn[0][0]'] n) block9_sepconv3 (SeparableConv (None, 11, 11, 728) 536536 ['block9_sepconv3_act[0][0]'] 2D) block9_sepconv3_bn (BatchNorma (None, 11, 11, 728) 2912 ['block9_sepconv3[0][0]'] lization) add_7 (Add) (None, 11, 11, 728) 0 ['block9_sepconv3_bn[0][0]', 'add_6[0][0]'] block10_sepconv1_act (Activati (None, 11, 11, 728) 0 ['add_7[0][0]'] on) block10_sepconv1 (SeparableCon (None, 11, 11, 728) 536536 ['block10_sepconv1_act[0][0]'] v2D) block10_sepconv1_bn (BatchNorm (None, 11, 11, 728) 2912 ['block10_sepconv1[0][0]'] alization) block10_sepconv2_act (Activati (None, 11, 11, 728) 0 ['block10_sepconv1_bn[0][0]'] on) block10_sepconv2 (SeparableCon (None, 11, 11, 728) 536536 ['block10_sepconv2_act[0][0]'] v2D) block10_sepconv2_bn (BatchNorm (None, 11, 11, 728) 2912 ['block10_sepconv2[0][0]'] alization) block10_sepconv3_act (Activati (None, 11, 11, 728) 0 ['block10_sepconv2_bn[0][0]'] on) block10_sepconv3 (SeparableCon (None, 11, 11, 728) 536536 ['block10_sepconv3_act[0][0]'] v2D) block10_sepconv3_bn (BatchNorm (None, 11, 11, 728) 2912 ['block10_sepconv3[0][0]'] alization) add_8 (Add) (None, 11, 11, 728) 0 ['block10_sepconv3_bn[0][0]', 'add_7[0][0]'] block11_sepconv1_act (Activati (None, 11, 11, 728) 0 ['add_8[0][0]'] on) block11_sepconv1 (SeparableCon (None, 11, 11, 728) 536536 ['block11_sepconv1_act[0][0]'] v2D) block11_sepconv1_bn (BatchNorm (None, 11, 11, 728) 2912 ['block11_sepconv1[0][0]'] alization) block11_sepconv2_act (Activati (None, 11, 11, 728) 0 ['block11_sepconv1_bn[0][0]'] on) block11_sepconv2 (SeparableCon (None, 11, 11, 728) 536536 ['block11_sepconv2_act[0][0]'] v2D) block11_sepconv2_bn (BatchNorm (None, 11, 11, 728) 2912 ['block11_sepconv2[0][0]'] alization) block11_sepconv3_act (Activati (None, 11, 11, 728) 0 ['block11_sepconv2_bn[0][0]'] on) block11_sepconv3 (SeparableCon (None, 11, 11, 728) 536536 ['block11_sepconv3_act[0][0]'] v2D) block11_sepconv3_bn (BatchNorm (None, 11, 11, 728) 2912 ['block11_sepconv3[0][0]'] alization) add_9 (Add) (None, 11, 11, 728) 0 ['block11_sepconv3_bn[0][0]', 'add_8[0][0]'] block12_sepconv1_act (Activati (None, 11, 11, 728) 0 ['add_9[0][0]'] on) block12_sepconv1 (SeparableCon (None, 11, 11, 728) 536536 ['block12_sepconv1_act[0][0]'] v2D) block12_sepconv1_bn (BatchNorm (None, 11, 11, 728) 2912 ['block12_sepconv1[0][0]'] alization) block12_sepconv2_act (Activati (None, 11, 11, 728) 0 ['block12_sepconv1_bn[0][0]'] on) block12_sepconv2 (SeparableCon (None, 11, 11, 728) 536536 ['block12_sepconv2_act[0][0]'] v2D) block12_sepconv2_bn (BatchNorm (None, 11, 11, 728) 2912 ['block12_sepconv2[0][0]'] alization) block12_sepconv3_act (Activati (None, 11, 11, 728) 0 ['block12_sepconv2_bn[0][0]'] on) block12_sepconv3 (SeparableCon (None, 11, 11, 728) 536536 ['block12_sepconv3_act[0][0]'] v2D) block12_sepconv3_bn (BatchNorm (None, 11, 11, 728) 2912 ['block12_sepconv3[0][0]'] alization) add_10 (Add) (None, 11, 11, 728) 0 ['block12_sepconv3_bn[0][0]', 'add_9[0][0]'] block13_sepconv1_act (Activati (None, 11, 11, 728) 0 ['add_10[0][0]'] on) block13_sepconv1 (SeparableCon (None, 11, 11, 728) 536536 ['block13_sepconv1_act[0][0]'] v2D) block13_sepconv1_bn (BatchNorm (None, 11, 11, 728) 2912 ['block13_sepconv1[0][0]'] alization) block13_sepconv2_act (Activati (None, 11, 11, 728) 0 ['block13_sepconv1_bn[0][0]'] on) block13_sepconv2 (SeparableCon (None, 11, 11, 1024 752024 ['block13_sepconv2_act[0][0]'] v2D) ) block13_sepconv2_bn (BatchNorm (None, 11, 11, 1024 4096 ['block13_sepconv2[0][0]'] alization) ) conv2d_3 (Conv2D) (None, 6, 6, 1024) 745472 ['add_10[0][0]'] block13_pool (MaxPooling2D) (None, 6, 6, 1024) 0 ['block13_sepconv2_bn[0][0]'] batch_normalization_3 (BatchNo (None, 6, 6, 1024) 4096 ['conv2d_3[0][0]'] rmalization) add_11 (Add) (None, 6, 6, 1024) 0 ['block13_pool[0][0]', 'batch_normalization_3[0][0]'] block14_sepconv1 (SeparableCon (None, 6, 6, 1536) 1582080 ['add_11[0][0]'] v2D) block14_sepconv1_bn (BatchNorm (None, 6, 6, 1536) 6144 ['block14_sepconv1[0][0]'] alization) block14_sepconv1_act (Activati (None, 6, 6, 1536) 0 ['block14_sepconv1_bn[0][0]'] on) block14_sepconv2 (SeparableCon (None, 6, 6, 2048) 3159552 ['block14_sepconv1_act[0][0]'] v2D) block14_sepconv2_bn (BatchNorm (None, 6, 6, 2048) 8192 ['block14_sepconv2[0][0]'] alization) block14_sepconv2_act (Activati (None, 6, 6, 2048) 0 ['block14_sepconv2_bn[0][0]'] on) avg_pool (GlobalAveragePooling (None, 2048) 0 ['block14_sepconv2_act[0][0]'] 2D) predictions (Dense) (None, 5) 10245 ['avg_pool[0][0]'] ==================================================================================================
Total params: 20,871,725
Trainable params: 20,817,197
Non-trainable params: 54,528
__________________________________________________________________________________________________
Epoch 1/10
92/92 [==============================] - ETA: 0s - loss: 1.2336 - accuracy: 0.5215
Epoch 00001: val_loss improved from inf to 1.61000, saving model to logs/EP001_acc0.521-vac0.176.h5
92/92 [==============================] - 107s 1s/step - loss: 1.2336 - accuracy: 0.5215 - val_loss: 1.6100 - val_accuracy: 0.1757
Epoch 2/10
内置还有
InceptionV3、ResNet50模型、VGG19模型、VGG16模型、MobileNetV2等模型
tensoflow2.6训练自己的图像分类相关推荐
- MATLAB与深度学习(二)— 训练神经网络(图像分类识别)
MATLAB与深度学习(二)- 训练神经网络(图像分类识别) 上一篇,我们介绍了与深度学习相关的MATLAB工具包.这一篇,我们将介绍如何训练神经网络和相关的基础知识.本文借鉴和引用了网上许多前辈的经 ...
- 当神经网络遇上量子计算:谷歌证明量子神经网络可训练图像分类
晓查 发自 凹非寺 量子位 报道 | 公众号 QbitAI 谷歌人工智能量子(Google AI Quantum)团队最近发表了两篇论文,介绍了他们在理解量子计算机学习任务方面取得的新进展. 量子计 ...
- Keras少量样本训练强大图像分类模型
原文:Building powerful image classification models using very little data 作者:Francois Chollet,2016.6.2 ...
- 图像分类训练tricks
图像分类训练tricks 1. 优化器 2. 学习率及学习率下降策略 2. 1 选择合适的学习率 3. weight_decay 4. label_smoothing 5. 通过验证集和测试集的准确度 ...
- 在物体检测任务上进行预训练的实验分析
©PaperWeekly 原创 · 作者|费玥姣 学校|西湖大学博士生 研究方向|视频预测 论文标题:An Analysis of Pre-Training on Object Detection 论 ...
- 基于Keras2《面向小数据集构建图像分类模型》——Kaggle猫狗数据集
概述 在本文中,将使用VGG-16模型提供一种面向小数据集(几百张到几千张图片)构造高效.实用的图像分类器的方法并给出试验结果. 本文将探讨如下几种方法: 从图片中直接训练一个小网络(作为基准方法) ...
- 五、在测试集上评估图像分类算法精度(Datawhale组队学习)
文章目录 配置环境 准备图像分类数据集和模型文件 测试集图像分类预测结果 表格A-测试集图像路径及标注 表格B-测试集每张图像的图像分类预测结果,以及各类别置信度 可视化测试集中被误判的图像 测试集总 ...
- 图像分类篇:pytorch实现ResNet
一.ResNet详解 ResNet网络是在2015年由微软实验室提出的,斩获当年ImageNet竞赛中分类任务第一名,目标检测第一名,获得COCO数据集中目标检测第一名,图像分类第一名. 在ResNe ...
- 采用预训练模型来训练新的模型
一.为什么需要使用预训练模型? 当可用的数据集较少时,我们从头开始训练的自己的卷积神经网络,想要将模型的精度会十分困难,如果我们想要进一步提高精度,因此下一步我们需要使用预训练的模型. 想要将深度学习 ...
最新文章
- ADSL自动更换IP地址源代码
- JSP是不是Java发展史上的一大败笔?
- 奥巴马就职委员会选择微软Silverlight技术
- 你必须知道的28个HTML5特征、窍门和技术
- debian linux系统下载工具,Debian For Linux
- 聊一聊Flutter Engine线程管理与Dart Isolate机制
- ubuntu/linux运行shell脚本sudo自动输入密码(亲测可以)
- boost.asio openssl zlib protobuf icu vs2015编译
- hadoop概念介绍
- 泉州海事学校计算机,泉州海事学校寝室图片、校园环境好吗?
- 比深度学习更值得信赖的模型ART
- IOS-程序员和设计师必备的20个CSS工具
- MFC下如何定义全局变量和全局函数
- C语言中可变参函数介绍与示例
- 内联元素与内联块状元素
- DoG算子和LoG算子
- Lingo求解线性规划案例1——生产计划问题
- 三菱机械臂demo程序
- C++、高响应比优先算法
- 从“化学家”到开发者,从甲骨文到TDengine,我人生的两次重要抉择