TensorFlow2进行CIFAR-10数据集动物识别,保存模型并且进行外部下载图片测试

首先,你已经安装好anaconda3、创建好环境、下载好TensorFlow2模块并且下载好jupyter了,那么我们就直接打开jupyter开始进行CIFAR10数据集的训练。

第一步:下载CIFAR10数据集

下载网址:http://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz

将数据集下载到合适的路径,方便模型训练的时候调用

第二步:导入该导的库

# tensorflow1.x
import tensorflow as tf
import numpy as np
import os
from matplotlib import pyplot as plt

第三步:加载刚刚下载的数据集,如果你下载了 cifar-10-python.tar.gz那么就先解压这个压缩包,将里面的文件放入一个文件夹,我这里放在为cifar-10-batches-py目录下,所有文件如图

 然后加载该数据集

import pickle

def unpickle(file):
    with open(file, 'rb') as fo:
        dict = pickle.load(fo, encoding='bytes')
    return dict

def load_data(path):
    # 读取训练数据
    train_images = []
    train_labels = []
    for i in range(1, 6):
        file = path + "/data_batch_{}".format(i)
        data = unpickle(file)
        train_images.append(data[b"data"])
        train_labels.append(data[b"labels"])
    train_images = np.concatenate(train_images)
    train_labels = np.concatenate(train_labels)
    # 读取测试数据
    file = path + "/test_batch"
    data = unpickle(file)
    test_images = data[b"data"]
    test_labels = np.array(data[b"labels"])
    # 转换数据类型
    train_images = train_images.astype(np.float32)
    test_images = test_images.astype(np.float32)
    y_train = np.array(train_labels)
    y_test = np.array(test_labels)
    # 将像素值缩放到[0, 1]范围内
    x_train = train_images/255.0
    x_test = test_images/255.0
    
    # 将标签数据转换为one-hot编码
#     train_labels = tf.keras.utils.to_categorical(train_labels, num_classes=10)
#     test_labels = tf.keras.utils.to_categorical(test_labels, num_classes=10)
    
    return (x_train, y_train), (x_test, y_test)


# 加载数据集
(train_images, train_labels), (test_images, test_labels) = load_data("../cifar_data/cifar-10-batches-py")
train_images = train_images.reshape(50000, 32, 32, 3)
test_images = test_images.reshape(10000, 32, 32, 3)

当然还有更简单的方法那就是使用TensorFlow内部模块下载数据集,如下

# 下载数据集
cifar10=tf.keras.datasets.cifar10

(x_train,y_train),(x_test,y_test)=cifar10.load_data()

x_train[0][0][0]
# 对图像images进行数字标准化
x_train=x_train.astype('float32')/255.0 
x_test = x_test.astype('float32')/ 255.0

第四步:数据集本来的标签是数字,我们可以将它转化成对应的类型名

label_dict={0:"airplane",1:"automobile",2:"bird",3:"cat",4:"deer",5:"dog", 6:"frog", 7:"horse", 8:"ship", 9:"truck"}

第五步:开始构建神经网络模型,这里我就简单构建一个类似AlexNet的卷积神网络模型

# 建立卷积神经网络CNN模型AlexNet
#建立Sequential线性堆叠模型
'''
Conv2D(filters=,kernel_size=,strides=,padding=,activation=,input_shape=,)
filters:卷积核数量,即输出的特征图数量。
kernel_size:卷积核大小,可以是一个整数或者一个元组,例如(3, 3)。
strides:卷积步长,可以是一个整数或者一个元组,例如(1, 1)。
padding:填充方式,可以是'same'或'valid'。'same'表示在输入图像四周填充0,保证输出特征图大小与输入图像大小相同;
        'valid'表示不填充,直接进行卷积运算。
activation:激活函数,可以是一个字符串、一个函数或者一个可调用对象。
input_shape:输入图像的形状
'''

'''
MaxPooling2D(pool_size=,strides=,padding=,)
pool_size:池化窗口大小,可以是一个整数或者一个元组,例如(2, 2)表示2x2的池化窗口。
'''


#this is a noe model,you just have to choose one or the other
def creatAlexNet():
    model = tf.keras.models.Sequential()#第1个卷积层
    model.add(tf.keras.layers.Conv2D(filters=32,
                                     kernel_size=(3,3), 
                                     input_shape=(32,32,3),
                                     activation='relu', padding='same'))
    # 防止过拟合
    model.add(tf.keras.layers.Dropout(rate=0.3))
    #第1个池化层
    model.add(tf.keras.layers.MaxPooling2D(pool_size=(2,2)))
    #第2个卷积层
    model.add(tf.keras.layers.Conv2D(filters = 64,kernel_size=(3,3), activation='relu', padding ='same'))
    # 防止过拟合
    model.add(tf.keras.layers.Dropout(rate=0.3))#第2个池化层
    model.add(tf.keras.layers.MaxPooling2D(pool_size=(2,2)))# 平坦层

    #第3个卷积层
    model.add(tf.keras.layers.Conv2D(filters = 128,kernel_size=(3,3), activation='relu', padding ='same'))
    # 防止过拟合
    model.add(tf.keras.layers.Dropout(rate=0.3))#第3个池化层
    model.add(tf.keras.layers.MaxPooling2D(pool_size=(2,2)))# 平坦层

    model.add(tf.keras.layers.Flatten())# 添加输出层
    model.add(tf.keras.layers.Dense(10,activation='softmax'))
    return model

第六步:开始加载模型

执行模型函数

model = creatAlexNet()

输出摘要

model.summary()

摘要结果如下: 

 超参数定义及模型训练

'''
model.compile(optimizer =,loss=,metrics=)
optimizer:指定优化器,可以传入字符串标识符(如'rmsprop'、'adam'等),也可以传入Optimizer类的实例。
loss:指定损失函数,可以传入字符串标识符(如'mse'、'categorical_crossentropy'等),也可以传入自定义的损失函数。
metrics:指定评估指标,可以传入字符串标识符(如'accuracy'、'mae'等),也可以传入自定义的评估函数或函数列表
'''

'''
model.fit(x=,y=,batch_size=,epochs=,verbose=,validation_data=,validation_split=,shuffle=,callbacks=)
x:训练数据,通常为一个形状为(样本数, 特征数)的numpy数组,也可以是一个包含多个numpy数组的列表。

y:标签,也是一个numpy数组或列表,长度应与x的第一维相同。

batch_size:批量大小,表示每次迭代训练的样本数,通常选择2的幂次方,比如32、64、128等。

epochs:训练轮数,一个轮数表示使用所有训练数据进行了一次前向传播和反向传播,通常需要根据实际情况调整。

verbose:输出详细信息,0表示不输出,1表示输出进度条,2表示每个epoch输出一次。

validation_data:验证数据,通常为一个形状与x相同的numpy数组,也可以是一个包含多个numpy数组的列表。

validation_split:切分验证集,将训练数据的一部分用作验证数据,取值范围在0到1之间,表示将训练数据的一部分划分为验证数据的比例。

shuffle:是否打乱训练数据,True表示每个epoch之前打乱数据,False表示不打乱数据。

callbacks:回调函数,用于在训练过程中定期保存模型、调整学习率等操作,
常用的回调函数包括ModelCheckpoint、EarlyStopping、ReduceLROnPlateau等。
'''

# 设置训练参数
train_epochs=10#训练轮数
batch_size=100#单次训练样本数(批次大小)

# 定义训练模式
model.compile(optimizer ='adam',#优化器
loss='sparse_categorical_crossentropy',#损失函数
              metrics=['accuracy'])#评估模型的方式
#训练模型
train_history = model.fit(x_train,y_train,validation_split = 0.2, epochs = train_epochs, 
                          batch_size = batch_size)

训练过程如下:

第七步:训练的损失率和成功率的可视化图

# 定义训练过程可视化函数
def visu_train_history(train_history,train_metric,validation_metric):
    plt.plot(train_history.history[train_metric])
    plt.plot(train_history.history[validation_metric])
    plt.title('Train History')
    plt.ylabel(train_metric)
    plt.xlabel('epoch')
    plt.legend(['train','validation'],loc='upper left')
    plt.show()

 损失率可视化

visu_train_history(train_history,'loss','val_loss')

 

成功率可视化 

visu_train_history(train_history,'accuracy','val_accuracy')

 

第八步:模型测试及评估

用测试集评估模型

# 评估模型
test_loss, test_acc = model.evaluate(x_test, y_test, verbose=2)
print('Test accuracy:', test_acc)

 模型测试,可视化测试

#model test
preds = model.predict(x_test)

可视化函数

# 定义显示图像数据及其对应标签的函数
# 图像列表
def plot_images_labels_prediction(images,# 标签列表
                                  labels,
                                  preds,#预测值列表
                                  index,#从第index个开始显示
                                  num = 5):  # 缺省一次显示5幅
    fig=plt.gcf()#获取当前图表,Get Current Figure 
    fig.set_size_inches(12,6)#1英寸等于2.54cm 
    if num > 10:#最多显示10个子图
        num = 10
    for i in range(0, num):
        ax = plt.subplot(2,5,i+1)#获取当前要处理的子图
        plt.tight_layout()
        ax.imshow(images[index])
        title=str(i)+','+label_dict[labels[index][0]]#构建该图上要显示的title信息
        if len(preds)>0:
            title +='=>' + label_dict[np.argmax(preds[index])]
        ax.set_title(title,fontsize=10)#显示图上的title信息
        index += 1 
    plt.show()

执行可视化函数

plot_images_labels_prediction(x_test,y_test, preds,15,30)

 结果如下:

第九步:模型保存及模型使用,测试外部图片

保存模型

# 保存模型
model_filename ='models/cifarCNNModel.h5'
model.save(model_filename)

加载模型,测试模型

方法一:使用TensorFlow内部模块加载图片,将dog.jpg路径换成你的图片路径

# 加载模型
loaded_model = tf.keras.models.load_model('models/cifarCNNModel.h5')

type = ("airplane", "automobile", "bird", "cat", "deer", "dog", "frog", "horse", "ship", "truck")
label_dict={0:"airplane",1:"automobile",2:"bird",3:"cat",4:"deer",5:"dog", 6:"frog", 7:"horse", 8:"ship", 9:"truck"}

# 加载外来图片
img = tf.keras.preprocessing.image.load_img(
    'dog.jpg', target_size=(32, 32)
)

# 转化为numpy数组
img_array = tf.keras.preprocessing.image.img_to_array(img)

# 归一化数据
img_array = img_array / 255.0

# 维度扩展
img_array = np.expand_dims(img_array, axis=0)

# 预测类别
predictions = loaded_model.predict(img_array)
pre_label = np.argmax(predictions)
plt.title("type:{}, pre_label:{}".format(label_dict[pre_label],pre_label))
plt.imshow(img, cmap=plt.get_cmap('gray'))

 结果如下,预测结果是正确的,我这里在浏览器下载的确实是一张狗的图片 

方法二:使用PIL的库加载图片进行预测 

from PIL import Image
import numpy as np

img = Image.open('./cat.jpg')
img = img.resize((32, 32))
img_arr = np.array(img) / 255.0
img_arr = img_arr.reshape(1, 32, 32, 3)
pred = model.predict(img_arr)
class_idx = np.argmax(pred)
plt.title("type:{}, pre_label:{}".format(label_dict[class_idx],class_idx))
plt.imshow(img, cmap=plt.get_cmap('gray'))

结果如下,也是正确的,我这张图片确实是一张猫的图片

 

 方法三:从网络上加载图片进行预测,将下面的网址换成你想要预测的图片网址

# 加载模型
loaded_model = tf.keras.models.load_model('models/cifarCNNModel.h5')
# 使用模型预测浏览器上的一张图片
type = ("airplane", "automobile", "bird", "cat", "deer", "dog", "frog", "horse", "ship", "truck")
label_dict={0:"airplane",1:"automobile",2:"bird",3:"cat",4:"deer",5:"dog", 6:"frog", 7:"horse", 8:"ship", 9:"truck"}

url = 'https://img1.baidu.com/it/u=1284172325,1569939558&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=580'
with urllib.request.urlopen(url) as url_response:
    img_array = np.asarray(bytearray(url_response.read()), dtype=np.uint8)
    img = cv2.imdecode(img_array, cv2.IMREAD_COLOR)
    img_array = cv2.resize(img, (32, 32))
    img_array = img_array / 255.0
    img_array = np.expand_dims(img_array, axis=0)
    
    predict_label = np.argmax(loaded_model.predict(img_array), axis=-1)[0]
    plt.imshow(img, cmap=plt.get_cmap('gray'))
    plt.title("Predict: {},Predict_label: {}".format(type[predict_label],predict_label))
    plt.xticks([])
    plt.yticks([])

结果如下, 这张就预测错了,明明是狗,预测成鸟(bird)去了

 

完整代码如下:

import tensorflow as tf
import numpy as np
import os
import matplotlib.pyplot as plt
import urllib
import cv2

# 下载数据集
cifar10=tf.keras.datasets.cifar10

(x_train,y_train),(x_test,y_test)=cifar10.load_data()

x_train[0][0][0]
# 对图像images进行数字标准化
x_train=x_train.astype('float32')/255.0 
x_test = x_test.astype('float32')/ 255.0

label_dict={0:"airplane",1:"automobile",2:"bird",3:"cat",4:"deer",5:"dog", 6:"frog", 7:"horse", 8:"ship", 9:"truck"}

# 建立卷积神经网络CNN模型AlexNet
#建立Sequential线性堆叠模型
'''
Conv2D(filters=,kernel_size=,strides=,padding=,activation=,input_shape=,)
filters:卷积核数量,即输出的特征图数量。
kernel_size:卷积核大小,可以是一个整数或者一个元组,例如(3, 3)。
strides:卷积步长,可以是一个整数或者一个元组,例如(1, 1)。
padding:填充方式,可以是'same'或'valid'。'same'表示在输入图像四周填充0,保证输出特征图大小与输入图像大小相同;
        'valid'表示不填充,直接进行卷积运算。
activation:激活函数,可以是一个字符串、一个函数或者一个可调用对象。
input_shape:输入图像的形状
'''

'''
MaxPooling2D(pool_size=,strides=,padding=,)
pool_size:池化窗口大小,可以是一个整数或者一个元组,例如(2, 2)表示2x2的池化窗口。
'''


#this is a noe model,you just have to choose one or the other
def creatAlexNet():
    model = tf.keras.models.Sequential()#第1个卷积层
    model.add(tf.keras.layers.Conv2D(filters=32,
                                     kernel_size=(3,3), 
                                     input_shape=(32,32,3),
                                     activation='relu', padding='same'))
    # 防止过拟合
    model.add(tf.keras.layers.Dropout(rate=0.3))
    #第1个池化层
    model.add(tf.keras.layers.MaxPooling2D(pool_size=(2,2)))
    #第2个卷积层
    model.add(tf.keras.layers.Conv2D(filters = 64,kernel_size=(3,3), activation='relu', padding ='same'))
    # 防止过拟合
    model.add(tf.keras.layers.Dropout(rate=0.3))#第2个池化层
    model.add(tf.keras.layers.MaxPooling2D(pool_size=(2,2)))# 平坦层

    #第3个卷积层
    model.add(tf.keras.layers.Conv2D(filters = 128,kernel_size=(3,3), activation='relu', padding ='same'))
    # 防止过拟合
    model.add(tf.keras.layers.Dropout(rate=0.3))#第3个池化层
    model.add(tf.keras.layers.MaxPooling2D(pool_size=(2,2)))# 平坦层

    model.add(tf.keras.layers.Flatten())# 添加输出层
    model.add(tf.keras.layers.Dense(10,activation='softmax'))
    return model

model = creatAlexNet()
model.summary()

'''
model.compile(optimizer =,loss=,metrics=)
optimizer:指定优化器,可以传入字符串标识符(如'rmsprop'、'adam'等),也可以传入Optimizer类的实例。
loss:指定损失函数,可以传入字符串标识符(如'mse'、'categorical_crossentropy'等),也可以传入自定义的损失函数。
metrics:指定评估指标,可以传入字符串标识符(如'accuracy'、'mae'等),也可以传入自定义的评估函数或函数列表
'''

'''
model.fit(x=,y=,batch_size=,epochs=,verbose=,validation_data=,validation_split=,shuffle=,callbacks=)
x:训练数据,通常为一个形状为(样本数, 特征数)的numpy数组,也可以是一个包含多个numpy数组的列表。

y:标签,也是一个numpy数组或列表,长度应与x的第一维相同。

batch_size:批量大小,表示每次迭代训练的样本数,通常选择2的幂次方,比如32、64、128等。

epochs:训练轮数,一个轮数表示使用所有训练数据进行了一次前向传播和反向传播,通常需要根据实际情况调整。

verbose:输出详细信息,0表示不输出,1表示输出进度条,2表示每个epoch输出一次。

validation_data:验证数据,通常为一个形状与x相同的numpy数组,也可以是一个包含多个numpy数组的列表。

validation_split:切分验证集,将训练数据的一部分用作验证数据,取值范围在0到1之间,表示将训练数据的一部分划分为验证数据的比例。

shuffle:是否打乱训练数据,True表示每个epoch之前打乱数据,False表示不打乱数据。

callbacks:回调函数,用于在训练过程中定期保存模型、调整学习率等操作,
常用的回调函数包括ModelCheckpoint、EarlyStopping、ReduceLROnPlateau等。
'''

# 设置训练参数
train_epochs=10#训练轮数
batch_size=100#单次训练样本数(批次大小)

# 定义训练模式
model.compile(optimizer ='adam',#优化器
loss='sparse_categorical_crossentropy',#损失函数
              metrics=['accuracy'])#评估模型的方式
#训练模型
train_history = model.fit(x_train,y_train,validation_split = 0.2, epochs = train_epochs, 
                          batch_size = batch_size)

# 定义训练过程可视化函数
def visu_train_history(train_history,train_metric,validation_metric):
    plt.plot(train_history.history[train_metric])
    plt.plot(train_history.history[validation_metric])
    plt.title('Train History')
    plt.ylabel(train_metric)
    plt.xlabel('epoch')
    plt.legend(['train','validation'],loc='upper left')
    plt.show()

visu_train_history(train_history,'accuracy','val_accuracy')

# 评估模型
test_loss, test_acc = model.evaluate(x_test, y_test, verbose=2)
print('Test accuracy:', test_acc)

#model test
preds = model.predict(x_test)

np.argmax(preds[0])

# 定义显示图像数据及其对应标签的函数
# 图像列表
def plot_images_labels_prediction(images,# 标签列表
                                  labels,
                                  preds,#预测值列表
                                  index,#从第index个开始显示
                                  num = 5):  # 缺省一次显示5幅
    fig=plt.gcf()#获取当前图表,Get Current Figure 
    fig.set_size_inches(12,6)#1英寸等于2.54cm 
    if num > 10:#最多显示10个子图
        num = 10
    for i in range(0, num):
        ax = plt.subplot(2,5,i+1)#获取当前要处理的子图
        plt.tight_layout()
        ax.imshow(images[index])
        title=str(i)+','+label_dict[labels[index][0]]#构建该图上要显示的title信息
        if len(preds)>0:
            title +='=>' + label_dict[np.argmax(preds[index])]
        ax.set_title(title,fontsize=10)#显示图上的title信息
        index += 1 
    plt.show()

plot_images_labels_prediction(x_test,y_test, preds,15,30)

# 保存模型
model_filename ='models/cifarCNNModel.h5'
model.save(model_filename)

# 加载模型
loaded_model = tf.keras.models.load_model('models/cifarCNNModel.h5')

type = ("airplane", "automobile", "bird", "cat", "deer", "dog", "frog", "horse", "ship", "truck")
label_dict={0:"airplane",1:"automobile",2:"bird",3:"cat",4:"deer",5:"dog", 6:"frog", 7:"horse", 8:"ship", 9:"truck"}

# 加载外来图片
img = tf.keras.preprocessing.image.load_img(
    'dog.jpg', target_size=(32, 32)
)

# 转化为numpy数组
img_array = tf.keras.preprocessing.image.img_to_array(img)

# 归一化数据
img_array = img_array / 255.0

# 维度扩展
img_array = np.expand_dims(img_array, axis=0)

# 预测类别
predictions = loaded_model.predict(img_array)
pre_label = np.argmax(predictions)
plt.title("type:{}, pre_label:{}".format(label_dict[pre_label],pre_label))
plt.imshow(img, cmap=plt.get_cmap('gray'))

#另一个加载图片方法
from PIL import Image
import numpy as np

img = Image.open('./cat.jpg')
img = img.resize((32, 32))
img_arr = np.array(img) / 255.0
img_arr = img_arr.reshape(1, 32, 32, 3)
pred = model.predict(img_arr)
class_idx = np.argmax(pred)
plt.title("type:{}, pre_label:{}".format(label_dict[class_idx],class_idx))
plt.imshow(img, cmap=plt.get_cmap('gray'))

# 加载模型
loaded_model = tf.keras.models.load_model('models/cifarCNNModel.h5')
# 使用模型预测浏览器上的一张图片
type = ("airplane", "automobile", "bird", "cat", "deer", "dog", "frog", "horse", "ship", "truck")
label_dict={0:"airplane",1:"automobile",2:"bird",3:"cat",4:"deer",5:"dog", 6:"frog", 7:"horse", 8:"ship", 9:"truck"}

url = 'https://img1.baidu.com/it/u=1284172325,1569939558&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=580'
with urllib.request.urlopen(url) as url_response:
    img_array = np.asarray(bytearray(url_response.read()), dtype=np.uint8)
    img = cv2.imdecode(img_array, cv2.IMREAD_COLOR)
    img_array = cv2.resize(img, (32, 32))
    img_array = img_array / 255.0
    img_array = np.expand_dims(img_array, axis=0)
    
    predict_label = np.argmax(loaded_model.predict(img_array), axis=-1)[0]
    plt.imshow(img, cmap=plt.get_cmap('gray'))
    plt.title("Predict: {},Predict_label: {}".format(type[predict_label],predict_label))
    plt.xticks([])
    plt.yticks([])

那么本篇文章CIFAR10数据集分类模型训练就到此结束,感谢大家的继续支持!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【网络协议详解】——IPv4(学习笔记)

目录 🕒 1. IPv4地址概述🕒 2. 分类编址🕒 3. 划分子网🕘 3.1 概述🕘 3.2 如何实现🕘 3.3 无分类编址🕘 3.4 应用规划🕤 3.4.1 定长的子网掩码FLSM(Fixed Length Subnet …

第4章 网络层

1‌、下列关于路由算法描述错误的是( ) A. 链路状态算法是一种全局路由算法,每个路由器需要维护全局状态信息B. OSPF 是一种域内路由协议,核心是基于 Dijkstra 最低费用路径算法C. RIP 是一种域内路由算法,核心是基…

MUR8060PT-ASEMI快恢复二极管MUR8060PT

编辑-Z MUR8060PT在TO-247封装里采用的2个芯片,其尺寸都是140MIL,是一款高耐压大电流快恢复二极管。MUR8060PT的浪涌电流Ifsm为600A,漏电流(Ir)为10uA,其工作时耐温度范围为-55~150摄氏度。MUR8060PT采用抗冲击硅芯片材质&#x…

Maven编译常见问题收集

1、父pom里面有引入lombok依赖&#xff0c;为什么子pom有用到lombok&#xff0c;依然识别不到呢 这是因为父pom引入依赖的时候&#xff0c;把 <dependency></dependency>依赖标签&#xff0c;最外层包 在了<dependencyManagement></dependencyManagemen…

【spring】spring是什么?详解它的特点与模块

作者&#xff1a;Insist-- 个人主页&#xff1a;insist--个人主页 作者会持续更新网络知识和python基础知识&#xff0c;期待你的关注 目录 一、spring介绍 二、spring的特点&#xff08;七点&#xff09; 1、简化开发 2、AOP的支持 3、声明式事务的支持 4、方便测试 5、…

猪齿鱼开源发布2.0版本:DevOps能力全面升级,研发效能显著提升,欢迎即刻体验!

近日&#xff0c;甄知科技猪齿鱼Choerodon数智化开发管理平台正式发布了开源2.0版本&#xff01; 开源发布会上&#xff0c;甄知产研团队、业内伙伴和社区开发者们齐聚一堂&#xff0c;共同见证猪齿鱼开源2.0的重磅发布&#xff01;发布会由上海甄知科技创始合伙人兼CTO张礼军先…

使用ChatGPT最新版实现批量写作,打造丰富多彩的聚合文章

随着人工智能的迅猛发展&#xff0c;ChatGPT最新版作为一种自然语言处理模型&#xff0c;可以为我们提供强大的文本生成能力。在这篇文章中&#xff0c;我们将探讨如何利用ChatGPT最新版来实现批量写作&#xff0c;从而打造丰富多彩的聚合文章。 一、ChatGPT最新版简介 Chat…

MFC第五天 Unicode软件开发 MFC框架构成与封装类原理

文章目录 Unicode软件开发以Unicode为字符集的记事本软件开发 MFC框架构成与封装类原理示例代码如下&#xff1a; Unicode软件开发 Unicode软件开发时需要遵循以下规则&#xff1a;使用中可尽量使用自适应版本。 Unicode软件开发&#xff1a; a)微软的软件工程现在默认使用Uni…

SpringBoot 实现 PDF 添加水印有哪些方案?

简介 PDF&#xff08;Portable Document Format&#xff0c;便携式文档格式&#xff09;是一种流行的文件格式&#xff0c;它可以在多个操作系统和应用程序中进行查看和打印。在某些情况下&#xff0c;我们需要对 PDF 文件添加水印&#xff0c;以使其更具有辨识度或者保护其版…

前端项目工程化搭建

ESLint 在开发过程中&#xff0c;需要遵循一些规范&#xff0c;可以使用下面的工具来配置不同项目需要遵循的规范&#xff0c;来帮助我们检查错误、约束开发过程。 ESLint 配置 使用 Taro CLI 创建的项目&#xff0c;会自动生成 .eslintrc 文件。只需要在这个文件的 rules 配…

Android逆向解析加壳与脱壳技术

加壳 加壳是指在 APK 文件中插入额外的代码或数据&#xff0c;使得原始代码难以被分析和反编译。通常加壳是为了保护软件的知识产权或者防止逆向工程。下面是 Android 加壳的一般流程&#xff1a; 选择加壳工具&#xff1a;选择合适的加壳工具进行加壳&#xff0c;比如市面上…

K8S:二进制安装K8S(单台master)安装etcd和master

系列文章目录 文章目录 系列文章目录一、安装K8S1.系统初始化配置2.部署docker引擎3.部署etcd集群 二、1.2. 总结 一、安装K8S 1.系统初始化配置 注意&#xff1a;该操作在所有node节点上进行&#xff0c;为k8s集群提供适合的初始化部署环境 #所有节点执行 systemctl stop f…

POJ - 2287 Tian Ji -- The Horse Racing

题目来源 2287 -- Tian Ji -- The Horse Racing (poj.org) 题目描述 田忌赛马是中国历史上一个著名的故事。 这个故事发生在2300年前&#xff0c;田忌是齐国的一个大官&#xff0c;他喜欢和齐王以及其他公子赛马。 田忌和齐王都有三类马&#xff0c;分别是下等马&#xff0…

【Vue】学习笔记-创建Vue3.0工程

创建Vue3.0工程 使用vue-cli创建查看vue/cli版本&#xff0c;确保vue/cli版本在4.5.0以上安装或者升级你的vue/cli创建启动 使用vite创建创建工程进入工程目录安装依赖运行 使用vue-cli创建 官方文档&#xff1a;https://cli.vuejs.org/zh/guide/creating-a-project.html#vue-…

BioXFinder生物数据库

BioXFinder是目前国内第一个也是国内唯一一个生物信息数据库&#xff0c;由享融智云公司精心研发&#xff0c;主要针对生物科研工作者的综合性生物数据检索及分析平台&#xff0c;汇集了核酸、蛋白、蛋白结构、代谢通路和信号通路信息&#xff0c;解决海外数据访问难、访问慢的…

【新星计划·2023】Linux是什么?它与Windows有什么区别?

作者&#xff1a;Insist-- 个人主页&#xff1a;insist--个人主页 作者会持续更新网络知识和python基础知识&#xff0c;期待你的关注 目录 一、Linux是什么&#xff1f; 二、Linux的应用领域 1、服务器领域 2、嵌入式领域 3、虚拟化 三、Linux的未来 1、云计算 2、大数…

玩转ChatGPT:回答审稿人问题

一、写在前面 前段时间一篇时间序列预测的文章返修&#xff0c;还挺幸运的&#xff0c;给了个小修。 不过问题也问得有点刁钻&#xff0c;应该是个行家。 想到手头有小Chat&#xff0c;打算使用TA来辅助我回答审稿人问题。 以下展示仅仅提供一个工作流和思路&#xff0c;具体…

高级SQL语句

目录 MySQL 高级(进阶) SQL 语句函数数学函数&#xff1a;聚合函数字符串函数&#xff1a; 连接查询inner join(内连接)&#xff1a;left join(左连接)&#xff1a;right join(右连接)&#xff1a; CREATE VIEW&#xff08;视图&#xff09;UNION&#xff08;联集&#xff09;C…

OpenAI ChatGPT 使用示例(程序员)

作为一个程序员&#xff0c;当知道ChatGPT出来之后或者GPT3出来的时候&#xff0c;我是有喜有忧&#xff0c;喜的是它可以帮我写代码&#xff0c;重构代码&#xff0c;写注释&#xff0c;写测试&#xff0c;&#xff0c;。哇&#xff0c;听起来好刺激&#xff0c;我可以从此以后…

探索安卓内容提供者:构建、访问和管理数据【复习】

文章目录 一 ContentProvider1.1 数据模型- **ContentProvider 使用基于数据库模型的简单表格来提供需要共享的数据**&#xff0c;在该表格中&#xff0c;每一表示一条记录&#xff0c;而每一列代表特定类型和含义的数据&#xff0c;并且其中每一条数据记录都包含一个名为“_ID…
最新文章