【人工智能课程】计算机科学博士作业二

使用TensorFlow1.x版本来实现手势识别任务中,并用图像增强的方式改进,基准训练准确率0.92,测试准确率0.77,改进后,训练准确率0.97,测试准确率0.88。

1 导入包

import math
import warnings
warnings.filterwarnings("ignore")
import numpy as np
import h5py
import matplotlib.pyplot as pltimport tensorflow.compat.v1 as tf
tf.disable_v2_behavior()%matplotlib inline
np.random.seed(1)

2 读取数据集

def load_dataset():train_dataset = h5py.File('datasets/train_signs.h5', "r")train_set_x_orig = np.array(train_dataset["train_set_x"][:])  # 训练集特征train_set_y_orig = np.array(train_dataset["train_set_y"][:])  # 训练集标签test_dataset = h5py.File('datasets/test_signs.h5', "r")test_set_x_orig = np.array(test_dataset["test_set_x"][:])  # 测试集特征test_set_y_orig = np.array(test_dataset["test_set_y"][:])  # 测试集标签classes = np.array(test_dataset["list_classes"][:])  # 类别列表train_set_y_orig = train_set_y_orig.reshape((1, train_set_y_orig.shape[0]))test_set_y_orig = test_set_y_orig.reshape((1, test_set_y_orig.shape[0]))return train_set_x_orig, train_set_y_orig, test_set_x_orig, test_set_y_orig, classes
#转变成one-hot编码
def convert_to_one_hot(Y, C):Y = np.eye(C)[Y.reshape(-1)].Treturn Y
X_train_orig, Y_train_orig, X_test_orig, Y_test_orig, classes = load_dataset()
index = 6
plt.imshow(X_train_orig[index])
print ("y = " + str(np.squeeze(Y_train_orig[:, index])))

在这里插入图片描述

X_train = X_train_orig/255.
X_test = X_test_orig/255.
Y_train = convert_to_one_hot(Y_train_orig, 6).T
Y_test = convert_to_one_hot(Y_test_orig, 6).T
print ("number of training examples = " + str(X_train.shape[0]))
print ("number of test examples = " + str(X_test.shape[0]))
print ("X_train shape: " + str(X_train.shape))
print ("Y_train shape: " + str(Y_train.shape))
print ("X_test shape: " + str(X_test.shape))
print ("Y_test shape: " + str(Y_test.shape))
conv_layers = {}

number of training examples = 1080
number of test examples = 120
X_train shape: (1080, 64, 64, 3)
Y_train shape: (1080, 6)
X_test shape: (120, 64, 64, 3)
Y_test shape: (120, 6)

3 创建占位符

① TensorFlow要求您为运行会话时将输入到模型中的输入数据创建占位符。

② 现在要实现创建占位符的函数,因为使用的是小批量数据块,输入的样本数量可能不固定,所以在数量那里要使用None作为可变数量。

def create_placeholders(n_H0, n_W0, n_C0, n_y):"""为session创建占位符参数:n_H0 - 实数,输入图像的高度n_W0 - 实数,输入图像的宽度n_C0 - 实数,输入的通道数n_y  - 实数,分类数输出:X - 输入数据的占位符,维度为[None, n_H0, n_W0, n_C0],类型为"float"Y - 输入数据的标签的占位符,维度为[None, n_y],维度为"float""""X = tf.placeholder(tf.float32,[None, n_H0, n_W0, n_C0])Y = tf.placeholder(tf.float32,[None, n_y])return X,Y
# 测试
X , Y = create_placeholders(64,64,3,6)
print ("X = " + str(X))
print ("Y = " + str(Y)) 

X = Tensor(“Placeholder:0”, shape=(?, 64, 64, 3), dtype=float32)
Y = Tensor(“Placeholder_1:0”, shape=(?, 6), dtype=float32)

4 初始化参数

① 现在将使用 tf.contrib.layers.xavier_initializer(seed = 0) 来初始化权值/过滤器 W 1 、 W 2 W1、W2 W1W2
② 在这里,不需要考虑偏置,因为TensorFlow会考虑到的。
③ 只需要初始化为2D卷积函数,全连接层TensorFlow会自动初始化的。

def initialize_parameters():'''第一层卷积层的过滤器组:W1第二层卷积层的过滤器组:W2'''#采用he初始化initializer = tf.keras.initializers.glorot_normal()W1 = tf.compat.v1.Variable(initializer([4,4,3,8]))W2 = tf.compat.v1.Variable(initializer([2,2,8,16]))parameters = {'W1':W1,'W2':W2}return parameters# 测试
tf.reset_default_graph()
with tf.Session() as sess_test:parameters = initialize_parameters()init = tf.global_variables_initializer()sess_test.run(init)print("W1 = " + str(parameters["W1"].eval()[1,1,1]))print("W2 = " + str(parameters["W2"].eval()[1,1,1]))sess_test.close()

# 5 前向传播模型

① 在TensorFlow里面有一些可以直接拿来用的函数:

  • tf.nn.conv2d(X,W1,strides=[1,s,s,1],padding=‘SAME’):给定输入 X X X和一组过滤器 W 1 W 1 W1,这个函数将会自动使用 W 1 W1 W1来对 X X X进行卷积,第三个输入参数是**[1,s,s,1]**是指对于输入 (m, n_H_prev, n_W_prev, n_C_prev)而言,每次滑动的步伐。
  • tf.nn.max_pool(A, ksize = [1,f,f,1], strides = [1,s,s,1], padding = ‘SAME’):给定输入 X X X,该函数将会使用大小为(f,f)以及步伐为(s,s)的窗口对其进行滑动取最大值。
  • tf.nn.relu(Z1):计算Z1的ReLU激活。
  • tf.contrib.layers.flatten§:给定一个输入P,此函数将会把每个样本转化成一维的向量,然后返回一个tensor变量,其维度为(batch_size,k)。
  • tf.contrib.layers.fully_connected(F, num_outputs):给定一个已经一维化了的输入F,此函数将会返回一个由全连接层计算过后的输出。

② 使用tf.contrib.layers.fully_connected(F, num_outputs)的时候,全连接层会自动初始化权值且在你训练模型的时候它也会一直参与,所以当初始化参数的时候不需要专门去初始化它的权值。
① 实现前向传播的时候,需要定义一下模型的大概样子:

  • CONV2D→RELU→MAXPOOL→CONV2D→RELU→MAXPOOL→FULLCONNECTED

② 具体实现的时候,需要使用以下的步骤和参数:

  • Conv2d : 步伐:1,填充方式:“SAME”
  • ReLU
  • Max pool : 过滤器大小:8x8,步伐:8x8,填充方式:“SAME”
  • Conv2d : 步伐:1,填充方式:“SAME”
  • ReLU
  • Max pool : 过滤器大小:4x4,步伐:4x4,填充方式:“SAME”
  • 一维化上一层的输出
  • 全连接层(FC):使用没有非线性激活函数的全连接层。这里不要调用SoftMax, 这将导致输出层中有6个神经元,然后再传递到softmax。 在TensorFlow中,softmax和cost函数被集中到一个函数中,在计算成本时您将调用不同的函数。
def forward_propagation(X,parameters):'''CONV2D->RELU->MAXPOOL->CONV2D->RELU->MAXPOOL->FLATTEN->FULLYCONNECTED'''W1,W2 = parameters['W1'],parameters['W2']#SAME卷积Z1 = tf.nn.conv2d(X,W1,strides=[1,1,1,1],padding="SAME")#通过激活函数A1 = tf.nn.relu(Z1)#最大池化P1 = tf.nn.max_pool(A1,ksize=[1,8,8,1],strides=[1,8,8,1],padding="SAME")#第二次SAME卷积Z2 = tf.nn.conv2d(P1,W2,strides=[1,1,1,1],padding="SAME")#经过激活函数A2 = tf.nn.relu(Z2)#最大池化P2 = tf.nn.max_pool(A2,ksize=[1,4,4,1],strides=[1,4,4,1],padding="SAME")#平铺卷积结构P = tf.compat.v1.layers.flatten(P2)#经过一个全连接层Z3 = tf.compat.v1.layers.dense(P,6)return Z3
print("=====测试一下=====")
tf.reset_default_graph()
np.random.seed(1)with tf.Session() as sess_test:X,Y = create_placeholders(64,64,3,6)parameters = initialize_parameters()Z3 = forward_propagation(X,parameters)init = tf.global_variables_initializer()sess_test.run(init)a = sess_test.run(Z3,{X: np.random.randn(2,64,64,3), Y: np.random.randn(2,6)})print("Z3 = " + str(a))sess_test.close()

6 定义损失函数

def compute_cost(Z3,Y):cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=Z3,labels=Y))return costdef random_mini_batches(X, Y, mini_batch_size = 64):"""Creates a list of random minibatches from (X, Y)Arguments:X -- input data, of shape (input size, number of examples) (m, Hi, Wi, Ci)Y -- true "label" vector (containing 0 if cat, 1 if non-cat), of shape (1, number of examples) (m, n_y)mini_batch_size - size of the mini-batches, integerseed -- this is only for the purpose of grading, so that you're "random minibatches are the same as ours.Returns:mini_batches -- list of synchronous (mini_batch_X, mini_batch_Y)"""m = X.shape[0]                  # number of training examplesmini_batches = []# Step 1: Shuffle (X, Y)permutation = list(np.random.permutation(m))shuffled_X = X[permutation,:,:,:]shuffled_Y = Y[permutation,:]# Step 2: Partition (shuffled_X, shuffled_Y). Minus the end case.num_complete_minibatches = math.floor(m/mini_batch_size) # number of mini batches of size mini_batch_size in your partitionningfor k in range(0, num_complete_minibatches):mini_batch_X = shuffled_X[k * mini_batch_size : k * mini_batch_size + mini_batch_size,:,:,:]mini_batch_Y = shuffled_Y[k * mini_batch_size : k * mini_batch_size + mini_batch_size,:]mini_batch = (mini_batch_X, mini_batch_Y)mini_batches.append(mini_batch)# Handling the end case (last mini-batch < mini_batch_size)if m % mini_batch_size != 0:mini_batch_X = shuffled_X[num_complete_minibatches * mini_batch_size : m,:,:,:]mini_batch_Y = shuffled_Y[num_complete_minibatches * mini_batch_size : m,:]mini_batch = (mini_batch_X, mini_batch_Y)mini_batches.append(mini_batch)return mini_batches

7 模型训练

7.1 方法一

def model(X_train,Y_train,X_test,Y_test,learning_rate=0.009,epochs=100,mini_batch_size=64):# tf.random.set_seed(1)tf.random.set_random_seed(1)#获取输入维度m,n_h0,n_w0,n_c0 = X_train.shape#分类数C = Y_train.shape[1]costs = []#为输入输出创建palcehoderX,Y = create_placeholders(n_h0,n_w0,n_c0,C)#初始化变量filterparameters = initialize_parameters()#前向传播Z3 = forward_propagation(X,parameters)cost = compute_cost(Z3,Y)#创建优化器(即梯度下降的过程)optimizer = tf.compat.v1.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost)#初始化所有变量init = tf.compat.v1.global_variables_initializer()with tf.compat.v1.Session() as sess:sess.run(init)for epoch in range(epochs):epoch_cost = 0mini_batch_num = m//mini_batch_size# 使用ImageDataGeneratormini_batchs = datagen.flow(X_train, Y_train, batch_size=mini_batch_size)# mini_batchs = random_mini_batches(X_train, Y_train, mini_batch_size)for mini in mini_batchs:(mini_x,mini_y) = mini#执行优化器/梯度下降_,mini_batch_cost = sess.run([optimizer,cost],feed_dict={X:mini_x,Y:mini_y})epoch_cost = epoch_cost + mini_batch_cost/mini_batch_numif epoch%5 == 0:costs.append(epoch_cost)if epoch%5 == 0:print("当前是第 " + str(epoch) + " 代,成本值为:" + str(epoch_cost))plt.plot(costs)plt.ylabel('cost')plt.xlabel('epoch')plt.show()#保存参数到seseeionparameters = sess.run(parameters)#获取预测正确的样本下标correct_prediction = tf.equal(tf.argmax(Z3,axis=1),tf.argmax(Y,axis=1))accuracy = tf.compat.v1.reduce_mean(tf.cast(correct_prediction,"float"))print("训练集的准确率:", accuracy.eval({X: X_train, Y: Y_train}))print("测试集的准确率:", accuracy.eval({X: X_test, Y: Y_test}))return parameters
import time
start_time = time.perf_counter()
parameters = model_aug(X_train, Y_train, X_test, Y_test,learning_rate=0.007,epochs=200,mini_batch_size=64)
end_time = time.perf_counter()
print("CPU的执行时间 = " + str(end_time - start_time) + " 秒" )

epoch100

训练集的准确率: 0.92314816

测试集的准确率: 0.775

CPU的执行时间 = 56.44441370000004 秒
在这里插入图片描述

7.2 方法二

用图像增强的方法改进,图像增强的功能,包括随机水平翻转、随机亮度调整和随机对比度调整。通过随机翻转增加了数据的多样性,而随机亮度和对比度的调整则可以使模型更具鲁棒性。

# 定义模型函数
def model_aug(X_train, Y_train, X_test, Y_test, learning_rate=0.009, epochs=100, mini_batch_size=64):tf.random.set_random_seed(1)#获取输入维度m,n_h0,n_w0,n_c0 = X_train.shape#分类数C = Y_train.shape[1]costs = []#为输入输出创建palcehoderX,Y = create_placeholders(n_h0,n_w0,n_c0,C)#初始化变量filterparameters = initialize_parameters()#前向传播Z3 = forward_propagation(X,parameters)cost = compute_cost(Z3,Y)#创建优化器(即梯度下降的过程)optimizer = tf.compat.v1.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost)'''改进部分,图像增强'''# 图像增强部分def image_augmentation(image, label):image = tf.image.random_flip_left_right(image)image = tf.image.random_brightness(image, max_delta=0.2)  # 随机亮度image = tf.image.random_contrast(image, lower=0.8, upper=1.2)  # 随机对比度return image, label# 创建数据集,应用数据增强,并批量获取数据dataset = tf.data.Dataset.from_tensor_slices((X_train, Y_train))dataset = dataset.map(image_augmentation)dataset = dataset.batch(mini_batch_size).repeat()# 定义迭代器iterator = dataset.make_initializable_iterator()next_batch = iterator.get_next()# 在会话中初始化迭代器with tf.Session() as sess:sess.run(tf.global_variables_initializer())sess.run(iterator.initializer)for epoch in range(epochs):epoch_cost = 0.mini_batch_num = m // mini_batch_size# 使用 `next_batch` 函数替代原始的 mini_batchs 获取数据for _ in range(mini_batch_num):mini_x, mini_y = sess.run(next_batch)_, mini_batch_cost = sess.run([optimizer, cost], feed_dict={X: mini_x, Y: mini_y})epoch_cost += mini_batch_cost / mini_batch_numif epoch%5 == 0:costs.append(epoch_cost)if epoch%5 == 0:print("当前是第 " + str(epoch) + " 代,成本值为:" + str(epoch_cost))plt.plot(costs)plt.ylabel('cost')plt.xlabel('epoch')plt.show()#保存参数到seseeionparameters = sess.run(parameters)#获取预测正确的样本下标correct_prediction = tf.equal(tf.argmax(Z3,axis=1),tf.argmax(Y,axis=1))accuracy = tf.compat.v1.reduce_mean(tf.cast(correct_prediction,"float"))print("训练集的准确率:", accuracy.eval({X: X_train, Y: Y_train}))print("测试集的准确率:", accuracy.eval({X: X_test, Y: Y_test}))return parameters
import time
start_time = time.perf_counter()
parameters = model_aug(X_train, Y_train, X_test, Y_test,learning_rate=0.007,epochs=200,mini_batch_size=64)
end_time = time.perf_counter()
print("CPU的执行时间 = " + str(end_time - start_time) + " 秒" )

model_aug
epoch 200
训练集的准确率: 0.97037035
测试集的准确率: 0.8833333
CPU的执行时间 = 84.42098270000002 秒
在这里插入图片描述

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

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

相关文章

SpringBoot---创建项目

介绍 此项目SpringBoot使用的是2.6.1版本,由于这个项目使用的是maven聚合方式创建的,所以第二步是我在聚合方式下需要添加的依赖,完整的pom.xml内容放到了最下面。 第一步:创建Maven项目 这个里什么也不勾选,直接点…

JDK Locale的妙用:探索多语言和地区设置的强大功能

文章目录 前言应用场景国际化(Internationalization)格式化(Formatting)日期格式化数字格式化金额格式化百分比形式格式化 获取Locale信息 前言 JDK(Java Development Kit)的Locale类用于表示特定的地理、…

openGauss学习笔记-210 openGauss 数据库运维-常见故障定位案例-谓词下推引起的查询报错

文章目录 openGauss学习笔记-210 openGauss 数据库运维-常见故障定位案例-谓词下推引起的查询报错210.1 谓词下推引起的查询报错210.1.1 问题现象210.1.2 原因分析210.1.3 处理办法 openGauss学习笔记-210 openGauss 数据库运维-常见故障定位案例-谓词下推引起的查询报错 210.…

8-小程序数据promise化、共享、分包、自定义tabbar

小程序API Promise化 wx.requet 官网入口 默认情况下,小程序官方异步API都是基于回调函数实现的 wx.request({method: , url: , data: {},header: {content-type: application/json // 默认值},success (res) {console.log(res.data)},fail () {},complete () { }…

ANAPF有源电力滤波器选型计算——安科瑞赵嘉敏

配电系统中谐波电流的计算涉及很多因素。对于改造项目,可使用专业电能质量分析仪测得所需谐波数据;对于新建项目,设计人员并不能直接获得供电系统的的谐波数据,因此,我司研发人员通过众多不同行业、不同类型的项目&…

JSP仓储管理系统myeclipse定制开发SQLServer数据库网页模式java编程jdbc

一、源码特点 JSP仓储管理系统系统是一套完善的web设计系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库 ,系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发,数据库为SQLServer2008&#x…

扩展学习|一文明晰推荐系统应用开发核心技术发展

文献来源:Lu J, Wu D, Mao M, et al. Recommender system application developments: a survey[J]. Decision support systems, 2015, 74: 12-32. 主题:关于推荐系统应用开发的调查研究 关键词:推荐系统、电子服务个性化、电子商务、电子学习、电子政务 …

除了Adobe之外,还有什么方法可以将Excel转为PDF?

前言 Java是一种广泛使用的编程语言,它在企业级应用开发中发挥着重要作用。而在实际的开发过程中,我们常常需要处理各种数据格式转换的需求。今天小编为大家介绍下如何使用葡萄城公司的的Java API 组件GrapeCity Documents for Excel(以下简…

BL808学习日志-3-DPI-RGB屏幕使用-LVGL D0

一、DPI-RGB驱动 BL808的手册上显示是支持RGB565屏幕显示输出的,但是一直没找到网上的使用例程。且官方的SDK显示也是能够使用的,只是缺少了驱动。这一部分驱动在SIPEED的SDK中已经内置了,今天就是简单的点亮一个800*480 RGB565的屏幕。 二、…

Java基础数据结构之Lambda表达式

一.语法 基本语法:(parameters)->expression或者(parameters)->{statements;} parameters:类似方法中的形参列表,这里的参数是函数式接口里面的参数。这里的参数可以明确说明,也可以不声明而由JVM隐含的推断。当只有一个推…

C++实习报告(集合交,并,差运算的实现)

一、问题描述 1、问题描述 集合元素类型可以是整数、字符串和小数,实现集合的交、并、差运算。 2、功能要求 (1)用户能够输入两个集合元素; (2)能够完成集合的交、并、差运算; (3&a…

07. STP的基本配置

文章目录 一. 初识STP1.1. STP概述1.2. STP的出现1.3. STP的作用1.4. STP的专业术语1.5. BPDU的报文格式1.6. STP的选择原则(1)选择根桥网桥原则(2)选择根端口原则 1.7. 端口状态1.8. STP报文类型1.9. STP的收敛时间 二. 实验专题…

【MySQL 流浪之旅】 第六讲 浅谈 MySQL 锁

系列文章目录 【MySQL 流浪之旅】 第一讲 MySQL 安装【MySQL 流浪之旅】 第二讲 MySQL 基础操作【MySQL 流浪之旅】 第三讲 MySQL 基本工具【MySQL 流浪之旅】 第四讲 MySQL 逻辑备份【MySQL 流浪之旅】 第五讲 数据库设计的三个范式 目录 系列文章目录 一、什么是锁&#x…

07-Nacos-接入Mysql实现持久化

1、默认内嵌的数据库 Derby 存于/data目录 2、扩展仅支持Mysql 5.6.5 执行Nacos中的SQL脚本,该脚本是Nacos-server文件夹中的nacos-mysql.sql 详见 01-Nacos源码打包、部署-CSDN博客 3、修改配置文件 Nacos-server中的conf目录下,application.proper…

5种ai智能自动写作,让你的写作效率秒拔高

写作是一项需要耗费大量时间和精力的任务,但现在有了AI智能自动写作软件,我们可以轻松提高写作效率。在国内市场上,有许多优秀的写作软件可供选择。本文将向您推荐5款国内的写作软件,并详细说明每款软件的功能特点。 爱制作AI 使…

小项目:使用MQTT上传温湿度到Onenet服务器

前言 我们之前分别编写了 DHT11、ESP8266 和 MQTT 的代码,现在我们将它们仨整合在一起,来做一个温湿度检测小项目。这个项目可以实时地将 DHT11 传感器获取到的温湿度数据上传到 OneNET 平台。通过登录 OneNET,我们随时随地可以查看温湿度数…

山体滑坡在线安全监测预警系统(解决方案)

在近年来,随着全球气候变化的影响,山体滑坡等自然灾害频发,给人们的生命财产安全带来了严重威胁。为了有效预防和减少山体滑坡带来的危害,许多地方开始在山上安装山体滑坡在线安全监测预警系统(解决方案)。…

Java版大厂算法题1——数字颠倒

问题描述 输入一个整数&#xff0c;将这个整数以字符串的形式逆序输出&#xff0c;程序不考虑负数的情况&#xff0c;若数字含有0&#xff0c;则逆序形式也含有0。如果输入为100&#xff0c;则输出为001。 数据范围&#xff1a;0<n<(2^30)-1 * 输入描述&#xff1a;输入…

SpringBoot+SqlServer查询接口

SpringBootSqlServer查询接口 文章目录 SpringBootSqlServer查询接口1. pom环境配置2. common工具包3. 实体类接口映射4. Service层Controller层 需求&#xff1a;根据站号查询前一个小时的所有数据&#xff0c;将数据返回格式为Map<String,List<Map<String,String>…

【硬件产品经理】避免硬件产品失败 | 技术维度

目录 简介 技术维度一&#xff1a;低估产品开发 技术维度二&#xff1a;低估规模生产的复杂性 技术维度三&#xff1a;测试不足 技术维度四&#xff1a;产品太复杂 技术维度五&#xff1a;对客户承诺太高 推荐内容 简介 这节内容主要从技术维度来谈谈避免硬件产品失败这…