深度学习 Day 15——利用卷神经网络实现好莱坞明星识别

news/2024/4/30 17:31:54/文章来源:https://blog.csdn.net/qq_52417436/article/details/127285403

深度学习 Day 15——利用卷神经网络实现好莱坞明星识别

文章目录

  • 深度学习 Day 15——利用卷神经网络实现好莱坞明星识别
    • 一、前言
    • 二、我的环境
    • 三、前期工作
      • 1、导入依赖项并设置GPU
      • 2、导入数据集
      • 3、查看数据集
    • 四、数据预处理
      • 1、加载数据
      • 2、检查数据并可视化数据
      • 3、配置数据集
    • 五、构建CNN网络
    • 六、训练模型
      • 1、设置动态学习率、损失函数、优化器,指标为准确率。
      • 2、损失函数类型
      • 3、One-Hot编码
      • 4、早停与保存最佳模型参数
      • 5、模型训练
    • 七、模型评估
      • 1、绘制Loss与Accuracy图
      • 2、指定图片进行预测
    • 八、VGG-16介绍
      • 1、VGG16函数模型
      • 2、VGG网络结构
      • 3、直接调用官方VGG16模型
    • 九、最后我想说

一、前言

  • 🍨 本文为🔗365天深度学习训练营 中的学习记录博客
  • 🍦 参考文章:365天深度学习训练营-第6周:好莱坞明星识别(训练营内部成员可读)
  • 🍖 原作者:K同学啊|接辅导、项目定制

在这里插入图片描述

365天深度学习训练营的难度是层层叠加的,虽然内容都是CNN,但是每一期我们都会比前一期多学一些知识,所以,本期内容我们仍然是学习有关卷神经网络的知识,但增加了一个新的知识点,那就是VGG-16网络框架,它具体是什么,我们后面会给大家解释的。

本期,我们就继续使用CNN实现好莱坞明星识别,前面相似的内容我们就简单的给代码,就不做过多的说明,具体知识点大家可以去我之前的博客去看看,或者上网查阅相关知识点,谢谢。

这是我的深度学习专栏:Python深度学习

二、我的环境

  • 电脑系统:Windows 11
  • 语言环境:Python 3.8.5
  • 编译器:DataSpell 2022.2
  • 深度学习环境:TensorFlow 2.3.4
  • 显卡及显存:RTX 3070 8G

三、前期工作

1、导入依赖项并设置GPU

导入依赖项:

from tensorflow import keras
from tensorflow.keras import layers,models
import os, PIL, pathlib
import matplotlib.pyplot as plt
import tensorflow as tf
import numpy as np

和之前一样,如果你GPU很好就只使用GPU进行训练,如果GPU不行就推荐使用CPU训练加GPU加速。

只使用GPU:

if gpus:gpu0 = gpus[0]                                        #如果有多个GPU,仅使用第0个GPUtf.config.experimental.set_memory_growth(gpu0, True)  #设置GPU显存用量按需使用tf.config.set_visible_devices([gpu0],"GPU")

使用CPU+GPU:

os.environ["CUDA_VISIBLE_DEVICES"] = "-1"

2、导入数据集

data_dir = "E:\Deep_Learning\data\Day15"
data_dir = pathlib.Path(data_dir)

3、查看数据集

查看数据集内有多少张图片:

image_count = len(list(data_dir.glob('*/*.jpg')))print("图片总数为:",image_count)

运行的结果是:

图片总数为: 1800

从数据集内返回一张图片查看一下:

roses = list(data_dir.glob('Jennifer Lawrence/*.jpg'))
PIL.Image.open(str(roses[0]))

在这里插入图片描述

四、数据预处理

1、加载数据

我们使用image_dataset_from_directory方法将我们本地的数据加载到tf.data.Dataset

中,并设置训练图片模型参数:

batch_size = 32
img_height = 224
img_width = 224

接下来加载数据:

train_ds = tf.keras.preprocessing.image_dataset_from_directory(data_dir,validation_split=0.1,subset="training",label_mode = "categorical",seed=123,image_size=(img_height, img_width),batch_size=batch_size)val_ds = tf.keras.preprocessing.image_dataset_from_directory(data_dir,validation_split=0.1,subset="validation",label_mode = "categorical",seed=123,image_size=(img_height, img_width),batch_size=batch_size)
Found 1800 files belonging to 17 classes.
Using 1620 files for training.
Found 1800 files belonging to 17 classes.
Using 180 files for validation.

这里也可以看到我们两个数据分别有多少文件。

然后我们再利用class_name输出我们本地数据集的标签,标签也就是对应数据所在的文件目录名:

class_names = train_ds.class_names
print(class_names)

打印出来的结果是:

['Angelina Jolie', 'Brad Pitt', 'Denzel Washington', 'Hugh Jackman', 'Jennifer Lawrence', 'Johnny Depp', 'Kate Winslet', 'Leonardo DiCaprio', 'Megan Fox', 'Natalie Portman', 'Nicole Kidman', 'Robert Downey Jr', 'Sandra Bullock', 'Scarlett Johansson', 'Tom Cruise', 'Tom Hanks', 'Will Smith']

2、检查数据并可视化数据

在可视化数据前,我们来检查一下我们的数据信息是否是正确的:

for image_batch, labels_batch in train_ds:print(image_batch.shape)print(labels_batch.shape)break
(32, 224, 224, 3)
(32, 17)

这是一批形状224x224x3的32张图片,我们将数据进行可视化看看:

plt.figure(figsize=(20, 10))for images, labels in train_ds.take(1):for i in range(20):ax = plt.subplot(5, 10, i + 1)plt.imshow(images[i].numpy().astype("uint8"))plt.title(class_names[np.argmax(labels[i])])plt.axis("off")

在这里插入图片描述

3、配置数据集

AUTOTUNE = tf.data.experimental.AUTOTUNEtrain_ds = train_ds.cache().shuffle(1000).prefetch(buffer_size=AUTOTUNE)
val_ds = val_ds.cache().prefetch(buffer_size=AUTOTUNE)

五、构建CNN网络


model = models.Sequential([layers.experimental.preprocessing.Rescaling(1./255, input_shape=(img_height, img_width, 3)),layers.Conv2D(16, (3, 3), activation='relu', input_shape=(img_height, img_width, 3)), # 卷积层1,卷积核3*3  layers.AveragePooling2D((2, 2)),               # 池化层1,2*2采样layers.Conv2D(32, (3, 3), activation='relu'),  # 卷积层2,卷积核3*3layers.AveragePooling2D((2, 2)),               # 池化层2,2*2采样layers.Dropout(0.5),  layers.Conv2D(64, (3, 3), activation='relu'),  # 卷积层3,卷积核3*3layers.AveragePooling2D((2, 2)),     layers.Dropout(0.5),  layers.Conv2D(128, (3, 3), activation='relu'),  # 卷积层3,卷积核3*3layers.Dropout(0.5), layers.Flatten(),                       # Flatten层,连接卷积层与全连接层layers.Dense(128, activation='relu'),   # 全连接层,特征进一步提取layers.Dense(len(class_names))               # 输出层,输出预期结果
])model.summary()  # 打印网络结构

打印出来的结果是:

Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
rescaling (Rescaling)        (None, 224, 224, 3)       0         
_________________________________________________________________
conv2d (Conv2D)              (None, 222, 222, 16)      448       
_________________________________________________________________
average_pooling2d (AveragePo (None, 111, 111, 16)      0         
_________________________________________________________________
conv2d_1 (Conv2D)            (None, 109, 109, 32)      4640      
_________________________________________________________________
average_pooling2d_1 (Average (None, 54, 54, 32)        0         
_________________________________________________________________
dropout (Dropout)            (None, 54, 54, 32)        0         
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 52, 52, 64)        18496     
_________________________________________________________________
average_pooling2d_2 (Average (None, 26, 26, 64)        0         
_________________________________________________________________
dropout_1 (Dropout)          (None, 26, 26, 64)        0         
_________________________________________________________________
conv2d_3 (Conv2D)            (None, 24, 24, 128)       73856     
_________________________________________________________________
dropout_2 (Dropout)          (None, 24, 24, 128)       0         
_________________________________________________________________
flatten (Flatten)            (None, 73728)             0         
_________________________________________________________________
dense (Dense)                (None, 128)               9437312   
_________________________________________________________________
dense_1 (Dense)              (None, 17)                2193      
=================================================================
Total params: 9,536,945
Trainable params: 9,536,945
Non-trainable params: 0
_________________________________________________________________

六、训练模型

1、设置动态学习率、损失函数、优化器,指标为准确率。

在这里我们沿用前一篇博客的内容,在这里设置动态学习率,但在这里我们相比上一期博客我们直接使用了多分类的对数损失函数。

# 设置初始学习率
initial_learning_rate = 1e-4lr_schedule = tf.keras.optimizers.schedules.ExponentialDecay(initial_learning_rate, decay_steps=60,      # 敲黑板!!!这里是指 steps,不是指epochsdecay_rate=0.96,     # lr经过一次衰减就会变成 decay_rate*lrstaircase=True)# 将指数衰减学习率送入优化器
optimizer = tf.keras.optimizers.Adam(learning_rate=lr_schedule)model.compile(optimizer=optimizer,loss=tf.keras.losses.CategoricalCrossentropy(from_logits=True),metrics=['accuracy'])

这里损失函数categorical_crossentropy的函数模型是:

tf.keras.metrics.categorical_crossentropy(y_true, y_pred, from_logits=False, label_smoothing=0.0, axis=-1
)

其中参数说明:

参数说明
y_trueone-hot 真实目标的张量
y_pred预测目标的张量
from_logits是否预计是一个 logits 张量。默认情况下,我们假设对概率分布进行编码。 y_pred``y_pred
label_smoothing浮动在 [0, 1] 中。如果 >0则平滑标签。例如,如果,用于非目标标签和目标标签。 0.1``0.1 / num_classes``0.9 + 0.1 / num_classes
axis默认为 -1。计算熵的维度

2、损失函数类型

官方文档里面有很多损失函数介绍,在这里我就介绍其中的几个:

  • binary_crossentropy(对数损失函数)

    tf.keras.metrics.binary_crossentropy(y_true, y_pred, from_logits=False, label_smoothing=0.0, axis=-1
    )
    

    sigmoid 相对应的损失函数,针对于二分类问题。

  • sparse_categorical_crossentropy(稀疏性多分类的对数损失函数)

    tf.keras.metrics.sparse_categorical_crossentropy(y_true, y_pred, from_logits=False, axis=-1, ignore_class=None
    )
    

    softmax 相对应的损失函数,如果是整数编码,则使用 sparse_categorical_crossentropy

3、One-Hot编码

这里提到了一个知识点——one-hot编码,肯定有人和我一样不理解这是什么编码,我也是上网查了一下,在这里我就简单的对其介绍一下:

One-Hot编码,又称为一位有效编码,主要是采用N位状态寄存器来对N个状态进行编码,每个状态都由他独立的寄存器位,并且在任意时候只有一位有效。

One-Hot编码是分类变量作为二进制向量的表示。这首先要求将分类值映射到整数值。然后,每个整数值被表示为二进制向量,除了整数的索引之外,它都是零值,它被标记为1。

概念很复杂,那我们就来举个容易理解的例子:

假如我有一群朋友,他们可以通过四个特征来形容,分别是:

  • 性别:[“男生”, “女生”]
  • 学历:[“本科”, “研究生”, “博士生”]
  • 学校:[“二本”, “一本”, “211”, “985”]

好,现在我有个朋友他是男生,本科学历,就读于一所一本学校,如果我们使用特征列表是有序的话,我们就可以使用带有顺序的数值来表示他:“男生,本科,一本”文字对应特征值为:[0,0,1]

但是这样的特征处理并不能直接放入机器学习算法中,因为类别之间是无序的

这时候就可以用独热编码的形式来表示了,我们用采用N位状态寄存器来对N个状态进行编码,拿上面的例子来说,就是:

性别[“男生”, “女生”]N=2男生:1 0 女生:0 1
学历[“本科”, “研究生”, “博士生”]N=3本科:1 0 0 研究生:0 1 0 博士生: 0 0 1
学校[“二本”, “一本”, “211”, “985”]N=4二本: 1 0 0 0 一本:0 1 0 0 211: 0 0 1 0 985: 0 0 0 1

现在,我们来描述上面那个朋友就可以使用[1 0 1 0 0 0 1 0 0]来表示了,如果大家还是不懂的话可以上网学习一下。

4、早停与保存最佳模型参数

这里早停策略我们仍然使用的是上一期博客中使用过的EarlyStopping

from tensorflow.keras.callbacks import ModelCheckpoint, EarlyStoppingepochs = 100# 保存最佳模型参数
checkpointer = ModelCheckpoint('best_model.h5',monitor='val_accuracy',verbose=1,save_best_only=True,save_weights_only=True)# 设置早停
earlystopper = EarlyStopping(monitor='val_accuracy', min_delta=0.001,patience=20, verbose=1)

5、模型训练

history = model.fit(train_ds,validation_data=val_ds,epochs=epochs,callbacks=[checkpointer, earlystopper])
Epoch 1/100
51/51 [==============================] - ETA: 0s - loss: 2.8120 - accuracy: 0.1019
Epoch 00001: val_accuracy improved from -inf to 0.13889, saving model to best_model.h5
51/51 [==============================] - 20s 400ms/step - loss: 2.8120 - accuracy: 0.1019 - val_loss: 2.7736 - val_accuracy: 0.1389
Epoch 2/100
51/51 [==============================] - ETA: 0s - loss: 2.7358 - accuracy: 0.1142
Epoch 00002: val_accuracy improved from 0.13889 to 0.15000, saving model to best_model.h5
51/51 [==============================] - 20s 387ms/step - loss: 2.7358 - accuracy: 0.1142 - val_loss: 2.6664 - val_accuracy: 0.1500
Epoch 3/100
51/51 [==============================] - ETA: 0s - loss: 2.6239 - accuracy: 0.1586
Epoch 00003: val_accuracy did not improve from 0.15000
51/51 [==============================] - 21s 407ms/step - loss: 2.6239 - accuracy: 0.1586 - val_loss: 2.5923 - val_accuracy: 0.1389
Epoch 4/100
51/51 [==============================] - ETA: 0s - loss: 2.5188 - accuracy: 0.1852
Epoch 00004: val_accuracy improved from 0.15000 to 0.19444, saving model to best_model.h5
51/51 [==============================] - 19s 379ms/step - loss: 2.5188 - accuracy: 0.1852 - val_loss: 2.5703 - val_accuracy: 0.1944
...
Epoch 62/100
51/51 [==============================] - ETA: 0s - loss: 0.1853 - accuracy: 0.9420
Epoch 00062: val_accuracy did not improve from 0.36667
51/51 [==============================] - 19s 377ms/step - loss: 0.1853 - accuracy: 0.9420 - val_loss: 3.9986 - val_accuracy: 0.3556
Epoch 63/100
51/51 [==============================] - ETA: 0s - loss: 0.1803 - accuracy: 0.9549
Epoch 00063: val_accuracy did not improve from 0.36667
51/51 [==============================] - 19s 378ms/step - loss: 0.1803 - accuracy: 0.9549 - val_loss: 4.0658 - val_accuracy: 0.3556
Epoch 00063: early stopping

我们查看一下最后的准确率:

val_loss,val_acc=model.evaluate(val_ds,verbose=2)
6/6 - 1s - loss: 4.0658 - accuracy: 0.3556

可以看出来准确率只有0.3556,很低。

七、模型评估

1、绘制Loss与Accuracy图

acc = history.history['accuracy']
val_acc = history.history['val_accuracy']loss = history.history['loss']
val_loss = history.history['val_loss']epochs_range = range(len(loss))plt.figure(figsize=(12, 4))
plt.subplot(1, 2, 1)
plt.plot(epochs_range, acc, label='Training Accuracy')
plt.plot(epochs_range, val_acc, label='Validation Accuracy')
plt.legend(loc='lower right')
plt.title('Training and Validation Accuracy')plt.subplot(1, 2, 2)
plt.plot(epochs_range, loss, label='Training Loss')
plt.plot(epochs_range, val_loss, label='Validation Loss')
plt.legend(loc='upper right')
plt.title('Training and Validation Loss')
plt.show()

在这里插入图片描述

2、指定图片进行预测

# 加载效果最好的模型权重
model.load_weights('best_model.h5')from PIL import Image
import numpy as npimg = Image.open("E:\Deep_Learning\data\Day15\Jennifer Lawrence\003_963a3627.jpg")  #这里选择你需要预测的图片
image = tf.image.resize(img, [img_height, img_width])img_array = tf.expand_dims(image, 0) predictions = model.predict(img_array) # 这里选用你已经训练好的模型
print("预测结果为:",class_names[np.argmax(predictions)])

预测的结果是:

预测结果为: Jennifer Lawrence

八、VGG-16介绍

1、VGG16函数模型

此模型的默认输入大小为 224x224

tf.keras.applications.VGG16(include_top=True,weights="imagenet",input_tensor=None,input_shape=None,pooling=None,classes=1000,classifier_activation="softmax",
)

其参数说明:

参数说明
include_top是否在网络顶部包含 3 个全连接层
weightsNone随机初始化)、“imagenet”(ImageNet 上的预训练)或要加载的权重文件的路径之一
input_tensor可选的 Keras 张量(即 的输出layers.Input()),用作模型的图像输入
input_shape可选形状元组,只有在include_top为 False 时才指定(否则输入形状必须是(224, 224, 3) (有channels_last数据格式)或(3, 224, 224)(有channels_first数据格式)。它应该有正好 3 个输入通道,并且宽度和高度应该不小于32. eg(200, 200, 3)将是一个有效值
pooling用于特征提取的可选池模式include_topFalse。-None表示模型的输出将是最后一个卷积块的 4D 张量输出。-avg表示全局平均池将应用于最后一个卷积块的输出,因此模型的输出将是一个 2D 张量。-max表示将应用全局最大池化
classes可选的类数,用于将图像分类,仅在include_top为 True 且未weights指定参数时指定
classifier_activation一个str或可调用的。在“顶层”层上使用的激活函数。忽略除非include_top=True。设置 classifier_activation=None为返回“顶层”层的 logits。加载预训练权重时,classifier_activation只能是None"softmax"

2、VGG网络结构

在这里插入图片描述

其中VGG16包含了16个隐藏层(13个卷积层和3个全连接层),如上图中的D列所示。

3、直接调用官方VGG16模型

from tensorflow.keras.applications.vgg16 import VGG16
model = VGG16(include_top=True,weights=None,input_tensor=None,input_shape=(img_height, img_width, 3),pooling=max,classes=len(class_names),classifier_activation='softmax'
)
model.summary()  # 打印网络结构

打印的结果是:

Model: "vgg16"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_2 (InputLayer)         [(None, 224, 224, 3)]     0         
_________________________________________________________________
block1_conv1 (Conv2D)        (None, 224, 224, 64)      1792      
_________________________________________________________________
block1_conv2 (Conv2D)        (None, 224, 224, 64)      36928     
_________________________________________________________________
block1_pool (MaxPooling2D)   (None, 112, 112, 64)      0         
_________________________________________________________________
block2_conv1 (Conv2D)        (None, 112, 112, 128)     73856     
_________________________________________________________________
block2_conv2 (Conv2D)        (None, 112, 112, 128)     147584    
_________________________________________________________________
block2_pool (MaxPooling2D)   (None, 56, 56, 128)       0         
_________________________________________________________________
block3_conv1 (Conv2D)        (None, 56, 56, 256)       295168    
_________________________________________________________________
block3_conv2 (Conv2D)        (None, 56, 56, 256)       590080    
_________________________________________________________________
block3_conv3 (Conv2D)        (None, 56, 56, 256)       590080    
_________________________________________________________________
block3_pool (MaxPooling2D)   (None, 28, 28, 256)       0         
_________________________________________________________________
block4_conv1 (Conv2D)        (None, 28, 28, 512)       1180160   
_________________________________________________________________
block4_conv2 (Conv2D)        (None, 28, 28, 512)       2359808   
_________________________________________________________________
block4_conv3 (Conv2D)        (None, 28, 28, 512)       2359808   
_________________________________________________________________
block4_pool (MaxPooling2D)   (None, 14, 14, 512)       0         
_________________________________________________________________
block5_conv1 (Conv2D)        (None, 14, 14, 512)       2359808   
_________________________________________________________________
block5_conv2 (Conv2D)        (None, 14, 14, 512)       2359808   
_________________________________________________________________
block5_conv3 (Conv2D)        (None, 14, 14, 512)       2359808   
_________________________________________________________________
block5_pool (MaxPooling2D)   (None, 7, 7, 512)         0         
_________________________________________________________________
flatten (Flatten)            (None, 25088)             0         
_________________________________________________________________
fc1 (Dense)                  (None, 4096)              102764544 
_________________________________________________________________
fc2 (Dense)                  (None, 4096)              16781312  
_________________________________________________________________
predictions (Dense)          (None, 17)                69649     
=================================================================
Total params: 134,330,193
Trainable params: 134,330,193
Non-trainable params: 0
_________________________________________________________________

直接调用官方VGG16模型时,模型训练的极其缓慢,所以我就选择了终止没有再继续进行。

目前来说我还是不太懂这个,所以本期就不进行尝试自己搭建VGG16模型,等我学习一段时间之后在下期博客中我们再进行尝试。

九、最后我想说

本期深度学习的内容就到这里结束了,剩下的时间我要去学习其中的有关知识了,一起加油!

最后有关VGG16的相关知识大家可以去看一下这篇文章,可能会对你有所启发:

VGG16 – 用于分类和检测的卷积网络

365天深度学习群里有很多大佬,我也要去学习一下大佬们都是如何进行调参模型优化的。

谢谢你们的阅读!

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

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

相关文章

【Spring依赖循环】提前曝光,直接曝光到二级缓存已经可以解决循环依赖问题了,为什么一定要三级缓存?

前言 问:什么是循环依赖? 循环依赖:说白是一个或多个对象实例之间存在直接或间接的依赖关系,这种依赖关系构成了构成一个环形调用。 问:Spring 如何解决循环依赖? 答:Spring 通过提前曝光机…

vue读取本机的excel文件的两种方式

安装依赖 npm install xlsx --save引入 import XLSX from ‘xlsx’ 更新:2022-04-26 最新的xlsx依赖包引入方式改变,以前的直接引入失败了,切换成以下依赖方式: import { read, utils } from xlsx如果有使用elementUI&#xf…

JavaScript基础万字总结---重点

目录JavaScript简介什么是JavaScript浏览器执行JS过程JS的组成JS的引入方式函数与作用域arguments的使用全局变量与局部变量预解析对象创建对象的三种方式1.利用字面量创建对象2.利用 new Object 创建对象3.利用构造函数创建对象遍历对象属性变量、属性、函数、方法总结new关键…

0053 Exception异常

/*异常Java语言中,将程序执行中发生的不正常情况称为"异常"。(语法错误和逻辑错误不是异常)执行过程中所发生的异常可分为两类1.Error:Java虚拟机无法解决的严重问题,程序会崩溃如:JVM系统内部错…

如何免费使用GPU进行加速?(两种方法)

文章目录如何使用免费的GPU?Kaggle使用免费GPUGoogle Colab 使用免费GPU小结如何使用免费的GPU? 我是学生党,最近在学习深度学习,需要用到GPU加速,现分享两个免费使用GPU的方法。 1、使用 Kaggle 的免费GPU,Kaggle每周可以赠送…

Android 最全Ignore文件 : 解决部分不必要文件上传到Git的问题

1. 背景 我们新建一个Android项目,默认会生成一个.ignore文件 *.iml .gradle /local.properties /.idea/caches /.idea/libraries /.idea/modules.xml /.idea/workspace.xml /.idea/navEditor.xml /.idea/assetWizardSettings.xml .DS_Store /build /captures .ex…

简单了解一下C语言main函数的参数

目录 一、main函数的参数 argc 和 argv 运行效果 需要注意的两个个点 一、main函数的参数 main函数有三个参数,argc、argv和envp,envp参数的应用场景不多,这里就不多介绍,感兴趣的可以自己去了解一下 它的标准写法如下&#x…

<初识Python及编程环境搭建>——《Python》

目录 1. Python 的背景知识: 2. Python 的用途: 3. Python 的优缺点 : 4. 搭建 Python 编程环境: 4.1 安装 Python (1) 找到官方网站 (2) 找到下载页面 (3) 双击安装包 (4) 运行 hello world 4.2 安装 PyCharm 后记&a…

tensorflow多层感知机+mnist数据集

这里写目录标题keras与tensorflow建立模型的不同加载mnisttensorflow多层感知机构建全连接层函数定义感知机各层的输入和输出损失函数、优化器模型准确率计算模型训练参数定义训练开始模型训练效果可视化模型评分利用模型进行预测显示混淆矩阵keras与tensorflow建立模型的不同 …

两栏布局与三栏布局(圣杯布局与双飞翼布局)

两栏布局 右侧绝对定位的写法 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta http-equiv"X-UA-Compatible" content"IEedge" /><meta name"viewport" content&qu…

浅析某城商行手机银行水平授权漏洞问题

-问题现象描述 据报道&#xff0c;某黑客通过软件抓包、PS身份证等非法手段&#xff0c;在某城商行手机银行APP内使用虚假身份信息注册银行Ⅱ、Ⅲ类账户。 其操作方法具体来说&#xff0c;是在注册账户过程中&#xff0c;先输入本人身份信息&#xff0c;待进行人脸识别步骤时…

Flask学习笔记(十二)-Flask-Migrate实现数据库迁移详解

一、定义flask-migrate是基于Alembic的一个封装,并集成到Flask中 所有的迁移操作其实都是Alembic做的,能跟踪模型的变化,并将变化映射到数据库中。二、Flask-Migrate安装pip install flask-migrate三、使用Flask-Migrate步骤  实例展示: 目录结构:  flask_SQLalchemy:. …

MindSpore体验--在Windows10中源码安装

MindSpore体验--在Windows10中源码安装&#xff08;反面教材&#xff09; 一直以来安装包都是直接pip intall&#xff0c;发现安装MindSpore的操作流程中教学了源码编译安装&#xff0c;借此学习一下使用源码安装。 环境创建 为了方便管理环境&#xff0c;此处我新创建了一个…

多测师肖sir_高级讲师_第2个月第27讲解jmeter性能测试jmeter性能实战

jmeter性能实战 一、单接口性能测试 1、先建接口cms 登录接口 2、在监听器中添加聚合报告 3、设置线程组 &#xff08;1&#xff09;线程组&#xff1a;一个线程组中有若干个请求 &#xff08;2&#xff09;线程 &#xff1a;一个虚拟用户就是一个线程 &#xff08;3&#…

webpack的一些常用打包配置

1.webpack 是什么&#xff1f; webpack 是一个模块化打包工具 2.模块是什么&#xff1f; 模块我理解就是 import xx 后面导入的文件就是一个模块 它可以是js css 图片 等等 3&#xff0c;webpack的配置文件的作用&#xff1f; 就是根据需求自定义配置webpack webpack默认只能打…

轻轻松松搞定分布式Token校验

文章目录前言token存储Token 存储实体login 业务代码枚举类修改存储效果客户端存储token验证前端提交后端校验自定义注解切面处理使用总结前言 没想到前天小水了一篇博文&#xff0c;竟然就火了&#xff1f;&#xff01;&#xff01;既然如此&#xff0c;那我再来一篇&#xf…

第7章 单行函数

1.函数的理解 *函数可以把我们经常使用的代码封装起来&#xff0c;需要的时候直接调用即可。这样既提高了代码效率&#xff0c;又提高了可维护性。在SQL中我们也可以使用函数对检索出来的数据进行函数操作。使用这些函数&#xff0c;可以极大地提高用户对数据库的管理效率。 …

微信小程序|基于小程序实现打卡功能

文章目录一、文章前言二、开发流程及准备三、开发步骤一、文章前言 此文主要在小程序内实现打卡功能&#xff0c;可根据用户位置与公司设定的打卡范围实时判断打卡场景。 二、开发流程及准备 2.1、注册微信公众平台账号。 2.2、准备腾讯地图用户Key。 三、开发步骤 3.1、访问…

【面试题常考!!!】JZ39 数组中出现次数超过一半的数字【五种方法解决】

欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09; 字体风格&#xff1a; 红色文字表示&#xff1a;重难点 蓝色文字表示&#xff1a;思路以…

神经网络模型数据处理,神经网络模型参数辨识

1、有哪些深度神经网络模型&#xff1f; 目前经常使用的深度神经网络模型主要有卷积神经网络(CNN) 、递归神经网络(RNN)、深信度网络(DBN) 、深度自动编码器(AutoEncoder) 和生成对抗网络(GAN) 等。 递归神经网络实际.上包含了两种神经网络。一种是循环神经网络(Recurrent Neu…