关于TensorFlow使用GPU加速

article/2025/8/28 13:52:04

我们在安装tensorflow-gpu后,其运行时我们可以选定使用gpu来进行加速训练,这无疑会帮助我们加快训练脚步。
(注意:当我们的tensorflow-gpu安装后,其默认会使用gpu来训练)
之前博主已经为自己的python环境安装了tensorflow-gpu,详情参考:
Tensorflow安装
安装完成后,我们以BP神经网络算法实现手写数字识别这个项目为例
首先先对BP神经网络的原理进行简单理解

BP神经网络实现手写数字识别

# -*- coding: utf-8 -*-"""
手写数字识别, BP神经网络算法
"""
# -------------------------------------------
'''
使用python解析二进制文件
'''
import numpy as np
import struct
import random
import tensorflow as tf
from sklearn.model_selection import train_test_splitimport os
os.environ["CUDA_VISIBLE_DEVICES"] = "0"  # 强制使用cpu
import time
T1 = time.clock()
class LoadData(object):def __init__(self, file1, file2):self.file1 = file1self.file2 = file2# 载入训练集def loadImageSet(self):binfile = open(self.file1, 'rb')  # 读取二进制文件buffers = binfile.read()  # 缓冲head = struct.unpack_from('>IIII', buffers, 0)  # 取前4个整数,返回一个元组offset = struct.calcsize('>IIII')  # 定位到data开始的位置imgNum = head[1]  # 图像个数width = head[2]  # 行数,28行height = head[3]  # 列数,28bits = imgNum*width*height  # data一共有60000*28*28个像素值bitsString = '>' + str(bits) + 'B'  # fmt格式:'>47040000B'imgs = struct.unpack_from(bitsString, buffers, offset)  # 取data数据,返回一个元组binfile.close()imgs = np.reshape(imgs, [imgNum, width*height])return imgs, head# 载入训练集标签def loadLabelSet(self):binfile = open(self.file2, 'rb')  # 读取二进制文件buffers = binfile.read()  # 缓冲head = struct.unpack_from('>II', buffers, 0)  # 取前2个整数,返回一个元组offset = struct.calcsize('>II')  # 定位到label开始的位置labelNum = head[1]  # label个数numString = '>' + str(labelNum) + 'B'labels = struct.unpack_from(numString, buffers, offset)  # 取label数据binfile.close()labels = np.reshape(labels, [labelNum])  # 转型为列表(一维数组)return labels, head# 将标签拓展为10维向量def expand_lables(self):labels, head = self.loadLabelSet()expand_lables = []for label in labels:zero_vector = np.zeros((1, 10))zero_vector[0, label] = 1expand_lables.append(zero_vector)return expand_lables# 将样本与标签组合成数组[[array(data), array(label)], []...]def loadData(self):imags, head = self.loadImageSet()expand_lables = self.expand_lables()data = []for i in range(imags.shape[0]):imags[i] = imags[i].reshape((1, 784))data.append([imags[i], expand_lables[i]])return datafile1 = r'train-images.idx3-ubyte'
file2 = r'train-labels.idx1-ubyte'
trainingData = LoadData(file1, file2)
training_data = trainingData.loadData()
file3 = r't10k-images.idx3-ubyte'
file4 = r't10k-labels.idx1-ubyte'
testData = LoadData(file3, file4)
test_data = testData.loadData()
X_train = [i[0] for i in training_data]
y_train = [i[1][0] for i in training_data]
X_test = [i[0] for i in test_data]
y_test = [i[1][0] for i in test_data]X_train, X_validation, y_train, y_validation = train_test_split(X_train, y_train, test_size=0.1, random_state=7)
# print(np.array(X_test).shape)
# print(np.array(y_test).shape)
# print(np.array(X_train).shape)
# print(np.array(y_train).shape)INUPUT_NODE = 784
OUTPUT_NODE = 10LAYER1_NODE = 500
BATCH_SIZE = 200
LERANING_RATE_BASE = 0.005  # 基础的学习率
LERANING_RATE_DACAY = 0.99  # 学习率的衰减率
REGULARZATION_RATE = 0.01  # 正则化项在损失函数中的系数
TRAINING_STEPS = 30000
MOVING_AVERAGE_DECAY = 0.99  # 滑动平均衰减率# 三层全连接神经网络,滑动平均类
def inference(input_tensor, avg_class, weights1, biases1, weights2, biases2):if not avg_class:layer1 = tf.nn.relu(tf.matmul(input_tensor, weights1)+biases1)# 没有使用softmax层输出return tf.matmul(layer1, weights2)+biases2else:layer1 = tf.nn.relu(tf.matmul(input_tensor, avg_class.average(weights1))+avg_class.average(biases1))return tf.matmul(layer1, avg_class.average(weights2))+avg_class.average(biases2)def train(X_train, X_validation, y_train, y_validation, X_test, y_test):x = tf.placeholder(tf.float32, [None, INUPUT_NODE], name="x-input")y_ = tf.placeholder(tf.float32, [None, OUTPUT_NODE], name="y-input")# 生成隐藏层weights1 = tf.Variable(tf.truncated_normal([INUPUT_NODE, LAYER1_NODE], stddev=0.1))biases1 = tf.Variable(tf.constant(0.1, shape=[LAYER1_NODE]))# 生成输出层weights2 = tf.Variable(tf.truncated_normal([LAYER1_NODE, OUTPUT_NODE], stddev=0.1))biases2 = tf.Variable(tf.constant(0.1, shape=[OUTPUT_NODE]))y = inference(x, None, weights1, biases1, weights2, biases2)global_step = tf.Variable(0, trainable=False)variable_averages = tf.train.ExponentialMovingAverage(MOVING_AVERAGE_DECAY, global_step)variable_averages_op = variable_averages.apply(tf.trainable_variables())average_y = inference(x, variable_averages, weights1, biases1, weights2, biases2)cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=y, labels=tf.argmax(y_, 1))cross_entropy_mean = tf.reduce_mean(cross_entropy)# L2正则化损失regularizer = tf.contrib.layers.l2_regularizer(REGULARZATION_RATE)regularization = regularizer(weights1) + regularizer(weights2)loss = cross_entropy_mean + regularization# 指数衰减的学习率learning_rate = tf.train.exponential_decay(LERANING_RATE_BASE,global_step,len(X_train)/BATCH_SIZE,LERANING_RATE_DACAY)train_step = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss, global_step=global_step)with tf.control_dependencies([train_step, variable_averages_op]):train_op = tf.no_op(name='train')correct_prediction = tf.equal(tf.argmax(average_y, 1), tf.argmax(y_, 1))accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))with tf.Session() as sess:init_op = tf.global_variables_initializer()sess.run(init_op)validation_feed = {x: X_validation, y_: y_validation}train_feed = {x: X_train, y_: y_train}test_feed = {x: X_test, y_: y_test}for i in range(TRAINING_STEPS):if i % 500 == 0:validate_acc = sess.run(accuracy, feed_dict=validation_feed)print("after %d training step(s), validation accuracy ""using average model is %g" % (i, validate_acc))start = (i * BATCH_SIZE) % len(X_train)end = min(start + BATCH_SIZE, len(X_train))sess.run(train_op,feed_dict={x: X_train[start:end], y_: y_train[start:end]})# print('loss:', sess.run(loss))test_acc = sess.run(accuracy, feed_dict=test_feed)print("after %d training step(s), test accuracy using""average model is %g" % (TRAINING_STEPS, test_acc))train(X_train, X_validation, y_train, y_validation, X_test, y_test)
T2 = time.clock()
print('程序运行时间:%s毫秒' % ((T2 - T1)*1000))

GPU运行结果
请添加图片描述
请添加图片描述

CPU运行结果
请添加图片描述
请添加图片描述
从运行结果来看,两者运行时间相差两倍
博主的显卡太拉跨了,看别人的测试两者可谓天差地别,呜呜呜,但好歹也算是有些加速效果吧,拜拜!


http://chatgpt.dhexx.cn/article/3Gqcel5T.shtml

相关文章

GPU加速原理

原文:https://blog.csdn.net/weiweigfkd/article/details/23051255 GPU加速技术&原理介绍 1、GPU&CPU GPU英文全称Graphic Processing Unit,中文翻译为“图形处理器”。与CPU不同,GPU是专门为处理图形任务而产生的芯片。从这个任务定…

让GPU跑的更快

作为一个cuda爱好者 一定要好好看看 不再让CPU和总线拖后腿:Exafunction让GPU跑的更快!确实只用cpu会卡的一比... 在云服务中使用 GPU 是获得低延迟深度学习推理服务最经济的方式。使用 GPU 的主要瓶颈之一是通过 PCIe 总线在 CPU 和 GPU 内存之间复制…

什么是GPU 加速?

1、什么是GPU加速计算 GPU,又称显示核心、视觉处理器、显示芯片,是一种专门在个人电脑、工作站、游戏机和一些移动设备(如平板电脑、智能手机等)上图像运算工作的微处理器,与CPU类似,只不过GPU是专为执行复…

什么是GPU加速

1、什么是GPU加速计算 GPU,又称显示核心、视觉处理器、显示芯片,是一种专门在个人电脑、工作站、游戏机和一些移动设备(如平板电脑、智能手机等)上图像运算工作的微处理器,与CPU类似,只不过GPU是专为执行复…

GPU加速原理技术介绍

GPU加速技术&原理介绍 1、GPU&CPU GPU英文全称Graphic Processing Unit,中文翻译为“图形处理器”。与CPU不同,GPU是专门为处理图形任务而产生的芯片。从这个任务定位上面来说,不仅仅在计算机的显卡上面,在手机、游戏机等等各种有多媒体处理需求的地方都可以见到…

GPU加速原理浅析及代码实现

GPU加速原理浅析及代码实现 一、CUDA简介二、GPU架构特点三、CUDA线程模型四、CUDA内存模型五、CUDA编程规范**第一个要掌握的编程要点**:**我们怎么写一个能在GPU跑的程序或函数呢?****第二个要掌握的编程要点**:**CPU和GPU间的数据传输怎么…

1129-

标题1-行情概览 标题2-行情图片 标题3-重点分析 WTA原油七点开盘高开高走,导致国内原油跌停板上高开高走,下午一点半不知道什么原因又低开。铁矿收一根4.7%的大阳线。贵金属高开高走

连接mysql报错 errorCode 1129, state HY000, Host ‘xxx‘ is blocked because of many connection errors

springcloud项目启动连接mysql过程中报错. 报错关键信息如下: java.sql.SQLException: null, message from server: "Host 192.168.56.1 is blocked because of many connection errors; unblock with mysqladmin flush-hosts" 错误原因: mysql设定了单个客户端…

Navicat连接MySQL 报错 1129

启动本地项目时,由于nacos设置的数据库账号密码未将本地改为线上,导致数据库连接多次而报错,另外navicat进到该IP的线上库也报错1129,报错信息 Host’123.45.678.99’ is blocked because of many connection errors; unblock wit…

ssl.SSLEOFError: EOF occurred in violation of protocol (_ssl.c:1129)

在使用 requests 爬网站时报错: ssl.SSLEOFError: EOF occurred in violation of protocol (_ssl.c:1129)urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(hostmooc1-1.chaoxing.com, port443): Max retries exceeded with url: /work/ .......requests.ex…

【dfs爆搜】poj 1129 Channel Allocation

1129 -- Channel Allocation (poj.org) 题意: 大致的题意就是给你一张图,给这张图染色,最多能染多少种颜色 思路: 首先要构造状态图,构造完状态图之后对其进行搜索(注意是先有图再有的dfs,而…

#1121

#1121 水题,巧妙暴力,拒绝强行暴力导致TLE; 找条件 你好! 这是你第一次使用 *Markdown编辑器 #include #include #include #include #include #include #include #include #include #include #include #include #inc…

Java-1129

Java8 新特性 速度更快代码更少(lambda、stream)强大的Stream API便于并行最大化减少空指针异常Optional 速度更快:对底层数据结构哈希map的优化 解释说明hashmap基本原理 hashmap本质是一个长度16的数组元素的键值对以key:valu…

如何用管理员权限打开CMD(快捷键)

近期给电脑重新装了win10系统,在使用cmd时发现执行一些命令提示我权限不够,需要管理员权限,有两种常用方法可以使用管理员权限打开cmd命令行: 第一种:搜索cmd应用,然后点击以管理员身份运行 第二种&#x…

Windows | 管理员权限打开CMD 快捷键

大家打开CMD一般用windows R,然后在运行框中输入cmd,接着Enter就好啦。 有时候安装啥东西需要管理员权限,运气不好,需要多次使用,每次操作都相比较麻烦,于是找了快捷键。 解决方法 和打开普通权限的CMD…

如何快速进入/打开cmd--快捷键

Windows系统快速进入cmd 1.WinR(win键在键盘左下角,ctrl和alt中间是个图标) 2.如何在一个目录内快速进入cmd? 2.1进入想要进入的目录 2.2直接在地址栏输入cmd 2.3回车即可进入cmd 3.在运行里面敲cmd也可进入 4.按住SHIFT鼠标右键可以在任意目录进入cmd 别忘了选择在此处打开…

cmd暂停快捷键_是否有键盘快捷键可以暂停正在运行的CMD窗口的输出?

cmd暂停快捷键 When running a batch script, you may need or want to pause the output in the CMD window so that you can look things over. Is there an easy way to pause, then restart the output? Today’s SuperUser Q&A post has the answer to help with a r…

cmd 实用快捷键。。

我相信大家用cmd时会感到很憋手蹩脚的。。什么CtrlC,CtrlV,都不能用。只能通过点击上面的边框通过编辑-->粘贴实现。其实并不需要这么做,在这里首先介绍几个简单的操作: 1.在cmd上点击右键,选中属性,在编辑选项中的…