keras tensorboard的使用, 设置GPU使用的内存, 强制只使用cpu

2024-08-27 19:48

本文主要是介绍keras tensorboard的使用, 设置GPU使用的内存, 强制只使用cpu,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

强制只使用cpu:

import os
os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"   # see issue #152
os.environ["CUDA_VISIBLE_DEVICES"] = ""

keras2.0版本已经添加了一些贡献者的新建议,用keras调用tensorboard对训练过程进行跟踪观察非常方便了。

直接上例子:   (注意: 貌似调用tensorboard,训练速度好像被托慢了不少。其实可以记录model.fit的history对象,自己写几行代码显示 点击打开链接)

# coding: utf-8
import numpy as np
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation
from keras.optimizers import SGD
from keras.utils import np_utils
import keras.callbacksimport os
import tensorflow as tf
import keras.backend.tensorflow_backend as KTF######################################
# TODO: set the gpu memory using fraction #
#####################################
def get_session(gpu_fraction=0.3):"""This function is to allocate GPU memory a specific fractionAssume that you have 6GB of GPU memory and want to allocate ~2GB"""num_threads = os.environ.get('OMP_NUM_THREADS')gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=gpu_fraction)if num_threads:return tf.Session(config=tf.ConfigProto(gpu_options=gpu_options, intra_op_parallelism_threads=num_threads))else:return tf.Session(config=tf.ConfigProto(gpu_options=gpu_options))
KTF.set_session(get_session(0.6))  # using 60% of total GPU Memory
os.system("nvidia-smi")  # Execute the command (a string) in a subshell
raw_input("Press Enter to continue...")
######################batch_size = 128
nb_classes = 10
nb_epoch = 10
nb_data = 28 * 28
log_filepath = '/tmp/keras_log'# load data(X_train, y_train), (X_test, y_test) = mnist.load_data()# reshape
print X_train.shape
X_train = X_train.reshape(X_train.shape[0], X_train.shape[1] * X_train.shape[2])
X_test = X_test.reshape(X_test.shape[0], X_test.shape[1] * X_test.shape[2])
# rescaleX_train = X_train.astype(np.float32)
X_train /= 255X_test = X_test.astype(np.float32)
X_test /= 255
# convert class vectors to binary class matrices (one hot vectors)Y_train = np_utils.to_categorical(y_train, nb_classes)
Y_test = np_utils.to_categorical(y_test, nb_classes)model = Sequential()
model.add(Dense(512, input_shape=(nb_data,), init='normal', name='dense1')) # a sample is a row 28*28
model.add(Activation('relu', name='relu1'))
model.add(Dropout(0.2, name='dropout1'))
model.add(Dense(512, init='normal', name='dense2'))
model.add(Activation('relu', name='relu2'))
model.add(Dropout(0.2, name='dropout2'))
model.add(Dense(10, init='normal', name='dense3'))
model.add(Activation('softmax', name='softmax1'))
model.summary()model.compile(loss='categorical_crossentropy', optimizer=SGD(lr=0.001), metrics=['accuracy'])tb_cb = keras.callbacks.TensorBoard(log_dir=log_filepath, write_images=1, histogram_freq=1)
# 设置log的存储位置,将网络权值以图片格式保持在tensorboard中显示,设置每一个周期计算一次网络的
#权值,每层输出值的分布直方图
cbks = [tb_cb]
history = model.fit(X_train, Y_train, batch_size=batch_size, nb_epoch=nb_epoch, 
verbose=1, callbacks=cbks, validation_data=(X_test, Y_test))score = model.evaluate(X_test, Y_test, verbose=0)
print('Test score:', score[0])
print('Test accuracy;', score[1])
其实可以自己给每一层layer命名一个name, 也可以由keras根据自己的命名规则自动取名,自动命名的规则在Layer类中,代码如下:
name = kwargs.get('name')  
if not name:  prefix = self.__class__.__name__  name = _to_snake_case(prefix) + '_' + str(K.get_uid(prefix))  
self.name = name 
而在keras的call back模块中,tensorborad class类实现源码可以看出,keras默认将模型的所有层的所有weights, bias以及每一层输出的distribution, histogram等传送到tensorborad,方便在浏览器中观察网络的运行情况。实现源码如下:

def set_model(self, model):  self.model = model  self.sess = K.get_session()  if self.histogram_freq and self.merged is None:  for layer in self.model.layers:  for weight in layer.weights:  tf.summary.histogram(weight.name, weight)  if self.write_images:  w_img = tf.squeeze(weight)  shape = w_img.get_shape()  if len(shape) > 1 and shape[0] > shape[1]:  w_img = tf.transpose(w_img)  if len(shape) == 1:  w_img = tf.expand_dims(w_img, 0)  w_img = tf.expand_dims(tf.expand_dims(w_img, 0), -1)  tf.summary.image(weight.name, w_img)  if hasattr(layer, 'output'):  tf.summary.histogram('{}_out'.format(layer.name),  layer.output)  self.merged = tf.summary.merge_all() 

当然也可以指定输出某一些层的,通过tensorboard参数进行设定:

embeddings_freq: frequency (in epochs) at which selected embedding
    layers will be saved.
embeddings_layer_names: a list of names of layers to keep eye on. If
    None or empty list all the embedding layer will be watched.

现在运行最开始的例子,在terminal运行

tensorboard --logdir=/tmp/keras_log

在terminal打开浏览器地址,进入tensorboard可以随意浏览graph, distribution, histogram, 以及sclar列表中的loss, acc等等。


以下摘录自: 这里

TensorBoard will automatically include all runs logged within the sub-directories of the specifiedlog_dir, for example, if you logged another run using:

callback_tensorboard(log_dir = "logs/run_b")

Then the TensorBoard visualization would look like this:

You can use the unique_log_dir function if you want to record every training run in it’s own directory:

callback_tensorboard(log_dir = unique_log_dir())

Once again note that it’s not required to record every training run in it’s own directory. Using the default “logs” directory will work just fine, you’ll just only be able to visualize the most recent run using TensorBoard.



需要注意的是,tensorboard默认的slcar一栏只记录了训练集和验证集上的loss,如何想记录展示其他指标,在model.compile的metric中进行添加,例如:

    model.compile(  loss = 'mean_squared_error',  optimizer = 'sgd',  metrics= c('mae', 'acc')  # 可视化mae和acc  )  



这篇关于keras tensorboard的使用, 设置GPU使用的内存, 强制只使用cpu的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1112609

相关文章

Java中使用Java Mail实现邮件服务功能示例

《Java中使用JavaMail实现邮件服务功能示例》:本文主要介绍Java中使用JavaMail实现邮件服务功能的相关资料,文章还提供了一个发送邮件的示例代码,包括创建参数类、邮件类和执行结... 目录前言一、历史背景二编程、pom依赖三、API说明(一)Session (会话)(二)Message编程客

C++中使用vector存储并遍历数据的基本步骤

《C++中使用vector存储并遍历数据的基本步骤》C++标准模板库(STL)提供了多种容器类型,包括顺序容器、关联容器、无序关联容器和容器适配器,每种容器都有其特定的用途和特性,:本文主要介绍C... 目录(1)容器及简要描述‌php顺序容器‌‌关联容器‌‌无序关联容器‌(基于哈希表):‌容器适配器‌:(

使用Python实现高效的端口扫描器

《使用Python实现高效的端口扫描器》在网络安全领域,端口扫描是一项基本而重要的技能,通过端口扫描,可以发现目标主机上开放的服务和端口,这对于安全评估、渗透测试等有着不可忽视的作用,本文将介绍如何使... 目录1. 端口扫描的基本原理2. 使用python实现端口扫描2.1 安装必要的库2.2 编写端口扫

Java循环创建对象内存溢出的解决方法

《Java循环创建对象内存溢出的解决方法》在Java中,如果在循环中不当地创建大量对象而不及时释放内存,很容易导致内存溢出(OutOfMemoryError),所以本文给大家介绍了Java循环创建对象... 目录问题1. 解决方案2. 示例代码2.1 原始版本(可能导致内存溢出)2.2 修改后的版本问题在

使用Python实现操作mongodb详解

《使用Python实现操作mongodb详解》这篇文章主要为大家详细介绍了使用Python实现操作mongodb的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、示例二、常用指令三、遇到的问题一、示例from pymongo import MongoClientf

SQL Server使用SELECT INTO实现表备份的代码示例

《SQLServer使用SELECTINTO实现表备份的代码示例》在数据库管理过程中,有时我们需要对表进行备份,以防数据丢失或修改错误,在SQLServer中,可以使用SELECTINT... 在数据库管理过程中,有时我们需要对表进行备份,以防数据丢失或修改错误。在 SQL Server 中,可以使用 SE

使用Python合并 Excel单元格指定行列或单元格范围

《使用Python合并Excel单元格指定行列或单元格范围》合并Excel单元格是Excel数据处理和表格设计中的一项常用操作,本文将介绍如何通过Python合并Excel中的指定行列或单... 目录python Excel库安装Python合并Excel 中的指定行Python合并Excel 中的指定列P

浅析Rust多线程中如何安全的使用变量

《浅析Rust多线程中如何安全的使用变量》这篇文章主要为大家详细介绍了Rust如何在线程的闭包中安全的使用变量,包括共享变量和修改变量,文中的示例代码讲解详细,有需要的小伙伴可以参考下... 目录1. 向线程传递变量2. 多线程共享变量引用3. 多线程中修改变量4. 总结在Rust语言中,一个既引人入胜又可

大数据小内存排序问题如何巧妙解决

《大数据小内存排序问题如何巧妙解决》文章介绍了大数据小内存排序的三种方法:数据库排序、分治法和位图法,数据库排序简单但速度慢,对设备要求高;分治法高效但实现复杂;位图法可读性差,但存储空间受限... 目录三种方法:方法概要数据库排序(http://www.chinasem.cn对数据库设备要求较高)分治法(常

golang1.23版本之前 Timer Reset方法无法正确使用

《golang1.23版本之前TimerReset方法无法正确使用》在Go1.23之前,使用`time.Reset`函数时需要先调用`Stop`并明确从timer的channel中抽取出东西,以避... 目录golang1.23 之前 Reset ​到底有什么问题golang1.23 之前到底应该如何正确的