使用估算器、tf.keras 和 tf.data 进行多 GPU 训练

多类图像分类器:将视网膜OCT图像分为4种类别之一-NORMAL,CNV,DME或DRUSEN 多类图像分类器 将视网膜OCT图像分为4类之一-NORMAL,CNV,DME或DRUSEN 分析的目标和动机正如我们所知道的,人类的预期寿命空前高。 由于医疗用品,服务和技术的增加,人们的寿命比祖先长。 因此,由于与眼睛健康有关的退化作用主要随着年龄而增加,因此眼睛疾病增加。 伴随着这种情况,由于数字化,近来人类在屏幕前花费越来越多的时间,这进一步增加了眼睛黄斑变性的问题。 需要开发更有效,快速和简便的方法来检测眼部疾病。 该项目的动机是研究一种可以帮助眼科医生使用图像识别技术更准确,更快速地识别视网膜疾病的技术。 我们可以检测到最常见的眼部疾病,因为它们很常见,因此无需花费很多时间就可以检测出来。 该项目涉及的眼疾是 AMD(与年龄有关的肌肉变性):这种疾病在老年人中很常见,并且是由于视网膜受损或组织死亡引起的。 在全球75岁以上的成年人中,约有35%患有AMD。 DR(非绝热性视网 立即下载

文 / Zalando Research 研究科学家 Kashif Rasul

来源 | TensorFlow 公众号

与大多数 AI 研究部门一样,Zalando Research 也意识到了对创意进行尝试和快速原型设计的重要性。随着数据集变得越来越庞大,了解如何利用我们拥有的共享资源来高效快速地训练深度学习模型变得大有用处。

TensorFlow 的估算器 API 对于在分布式环境中使用多个 GPU 来训练模型非常有用。本文将主要介绍这一工作流程。我们先使用 Fashion-MNIST 小数据集训练一个用 tf.keras 编写的自定义估算器,然后在文末介绍一个较实际的用例。

请注意:TensorFlow 团队一直在开发另一项很酷的新功能(在我写这篇文章时,该功能仍处于 Master 阶段),使用这项新功能,您只需多输入几行代码即可训练 tf.keras 模型, 而无需先将该模型转化为估算器!其工作流程也很赞。下面我着重讲讲估算器 API。选择哪一个由您自己决定!
注:功能链接
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/contrib/distribute/python/examples/keras_mnist.py#L106-L114

TL; DR:基本上,我们需要记住,对于 tf.keras. 模型,我们只要通过 tf.keras.estimator.model_to_estimator 方法将其转化为 tf.estimator.Estimator 对象,即可使用 tf.estimator API 来进行训练。转化完成后,我们可以使用估算器提供的机制用不同的硬件配置训练模型。

您可以从此笔记本下载本文中的代码并亲自运行。
注:笔记本链接
https://github.com/kashif/tf-keras-tutorial/blob/master/7-estimators-multi-gpus.ipynb

import os
import time

#!pip install -q -U tensorflow-gpu
import tensorflow as tf

import numpy as np

导入 Fashion-MNIST 数据集
我们用 Fashion-MNIST 数据集随手替换一下 MNIST,这里面包含几千张 Zalando 时尚文章的灰度图像。获取训练和测试数据非常简单,如下所示:

(train_images, train_labels), (test_images, test_labels) = 
   tf.keras.datasets.fashion_mnist.load_data()

我们想把这些图像的像素值从 0 到 255 之间的一个数字转换为 0 到 1 之间的一个数字,并将该数据集转换为 [B, H, W ,C] 格式,其中 B 代表批处理的图像数,H 和 W 分别是高度和宽度,C 是我们数据集的通道数(灰度为 1):

TRAINING_SIZE = len(train_images)
TEST_SIZE = len(test_images)

train_images = np.asarray(train_images, dtype=np.float32) / 255
# Convert the train images and add channels
train_images = train_images.reshape((TRAINING_SIZE, 28, 28, 1))

test_images = np.asarray(test_images, dtype=np.float32) / 255
# Convert the test images and add channels
test_images = test_images.reshape((TEST_SIZE, 28, 28, 1))

接下来,我们想将标签从整数编号(例如,2 或套衫)转换为独热编码(例如,0,0,1,0,0,0,0,0,0,0)。为此,我们要使用 tf.keras.utils.to_categorical 函数:

# How many categories we are predicting from (0-9)
LABEL_DIMENSIONS = 10

train_labels = tf.keras.utils.to_categorical(train_labels, 
                                            LABEL_DIMENSIONS)

test_labels = tf.keras.utils.to_categorical(test_labels,
                                           LABEL_DIMENSIONS)

# Cast the labels to floats, needed later
train_labels = train_labels.astype(np.float32)
test_labels = test_labels.astype(np.float32)

构建 tf.keras 模型
我们会使用 Keras 功能 API 来创建神经网络。Keras 是一个高级 API,可用于构建和训练深度学习模型,其采用模块化设计,使用方便,易于扩展。tf.keras 是 TensorFlow 对这个 API 的实现,其支持 Eager Execution、tf.data 管道和估算器等。

在架构方面,我们会使用 ConvNet。一个非常笼统的说法是,ConvNet 是卷积层 (Conv2D) 和池化层 (MaxPooling2D) 的堆栈。但最重要的是,ConvNet 将每个训练示例当作一个 3D 形状张量(高度、宽度、通道),对于灰度图像,张量从通道 = 1 开始,然后返回一个 3D 张量。

因此,在 ConvNet 部分之后,我们需要将张量平面化,并添加密集层,其中最后一个返回 LABEL_DIMENSIONS 大小的向量,并附带 tf.nn.softmax 激活:

inputs = tf.keras.Input(shape=(28,28,1))  # Returns a placeholder

x = tf.keras.layers.Conv2D(filters=32, 
                          kernel_size=(3, 3), 
                          activation=tf.nn.relu)(inputs)

x = tf.keras.layers.MaxPooling2D(pool_size=(2, 2), strides=2)(x)

x = tf.keras.layers.Conv2D(filters=64, 
                          kernel_size=(3, 3), 
                          activation=tf.nn.relu)(x)

x = tf.keras.layers.MaxPooling2D(pool_size=(2, 2), strides=2)(x)

x = tf.keras.layers.Conv2D(filters=64, 
                          kernel_size=(3, 3), 
                          activation=tf.nn.relu)(x)

x = tf.keras.layers.Flatten()(x)

x = tf.keras.layers.Dense(64, activation=tf.nn.relu)(x)
predictions = tf.keras.layers.Dense(LABEL_DIMENSIONS,
                                   activation=tf.nn.softmax)(x)

现在,我们可以定义学习模型,请选择优化器(我们从 TensorFlow 中选择一个,而不使用来自 tf.keras. optimizers 的优化器)并进行编译:

model = tf.keras.Model(inputs=inputs, outputs=predictions)

optimizer = tf.train.AdamOptimizer(learning_rate=0.001)

model.compile(loss='categorical_crossentropy',
             optimizer=optimizer,
             metrics=['accuracy'])

创建估算器
使用已编译的 Keras 模型创建估算器,也就是我们所说的 model_to_estimator 方法。请注意,Keras 模型的初始模型状态保存在创建的估算器中。

那估算器有哪些优点呢?首先要提以下几点:

  • 您可以在本地主机或分布式多 GPU 环境中运行基于估算器的模型,而无需更改您的模型;
  • 估算器能够简化模型开发者之间的共享实现;
  • 估算器能够为您构建图形,所以有点像 Eager Execution,没有明确的会话。

那么我们要如何训练简单的 tf.keras 模型来使用多 GPU?我们可以使用 tf.contrib.distribute.MirroredStrategy 范式,通过同步训练进行图形内复制。如需了解更多关于此策略的信息,请观看分布式 TensorFlow 训练讲座。
注:分布式 TensorFlow 链接
https://www.youtube.com/watch?v=bRMGoPqsn20

基本上,每个工作器 GPU 都有一个网络拷贝,并会获取一个数据子集,据以计算本地梯度,然后等待所有工作器以同步方式结束。然后,工作器通过 Ring All-reduce 运算互相传递其本地梯度,这通常要进行优化,以减少网络带宽并增加吞吐量。在所有梯度到达后,每个工作器会计算其平均值并更新参数,然后开始下一步。理想情况下,您在单个节点上有多个高速互联的 GPU。

要使用此策略,我们首先要用已编译的 tf.keras 模型创建一个估算器,然后通过 RunConfig config 赋予其 MirroredStrategy 配置。默认情况下,该配置会使用全部 GPU,但您也可以赋予其一个 num_gpus 选项,以使用特定数量的 GPU:

NUM_GPUS = 2

strategy = tf.contrib.distribute.MirroredStrategy(num_gpus=NUM_GPUS)
config = tf.estimator.RunConfig(train_distribute=strategy)

estimator = tf.keras.estimator.model_to_estimator(model,
                                                 config=config)

创建估算器输入函数
要通过管道将数据传递到估算器,我们需要定义一个数据导入函数,该函数返回批量数据的 tf.data 数据集(图像、标签)。下面的函数接收 numpy 数组,并通过 ETL 过程返回数据集。

请注意,最后我们还调用了预读取方法,该方法会在训练时将数据缓冲到 GPU,以便下一批数据准备就绪并等待 GPU,而不是在每次迭代时让 GPU 等待数据。GPU 可能仍然没有得到充分利用,要改善这一点,我们可以使用融合版转换运算(如 shuffle_and_repeat),而不是两个单独的运算。不过,我在这里选用的是简单用例。

def input_fn(images, labels, epochs, batch_size):

     # Convert the inputs to a Dataset. (E)
    ds = tf.data.Dataset.from_tensor_slices((images, labels))    

    # Shuffle, repeat, and batch the examples. (T)
    SHUFFLE_SIZE = 5000
    ds = ds.shuffle(SHUFFLE_SIZE).repeat(epochs).batch(batch_size)
    ds = ds.prefetch(2)    

    # Return the dataset. (L)
    return ds

训练估算器
首先,我们定义一个 SessionRunHook 类,用于记录随机梯度下降法每次迭代的次数:

class TimeHistory(tf.train.SessionRunHook):
    def begin(self):
       self.times = []    

    def before_run(self, run_context):
       self.iter_time_start = time.time()    

    def after_run(self, run_context, run_values):
       self.times.append(time.time() - self.iter_time_start)

亮点在这里!我们可以对估算器调用 train 函数,并通过 hooks 参数,向其赋予我们定义的 input_fn (包含批次大小和我们希望的训练回合次数)和 TimeHistory 实例:

time_hist = TimeHistory()

BATCH_SIZE = 512
EPOCHS = 5

estimator.train(lambda:input_fn(train_images,
                               train_labels,
                               epochs=EPOCHS,
                               batch_size=BATCH_SIZE),
               hooks=[time_hist])

性能
现在,我们可以使用时间钩子来计算训练的总时间和平均每秒训练的图像数量(平均吞吐量):

total_time = sum(time_hist.times)
print(f"total time with {NUM_GPUS} GPU(s): {total_time} seconds")

avg_time_per_batch = np.mean(time_hist.times)
print(f"{BATCH_SIZE*NUM_GPUS/avg_time_per_batch} images/second with
       {NUM_GPUS} GPU(s)")

使用两块 K80 GPU 进行训练时的 Fashion-MNIST 训练吞吐量和总时间,采用不同 NUM_GPUS,显示缩放不良

评估估算器
为了检验模型的性能,我们要对估算器调用评估方法:

estimator.evaluate(lambda:input_fn(test_images, 
                                  test_labels,
                                  epochs=1,
                                  batch_size=BATCH_SIZE))

视网膜 OCT (光学相干断层成像术)图像示例
为了测试模型在处理较大数据集时的扩展性能,我们使用 视网膜 OCT 图像数据集,这是 Kaggle 众多大型数据集中的一个。该数据集由活人视网膜的横截面 X 光图像组成,分为四个类别:NORMAL、CNV、DME 和 DRUSEN:

光学相干断层成像术的代表图像,选自 Kermany 等人所著的《通过基于图像的深度学习技术确定医学诊断和可治疗疾病》(Identifying Medical Diagnoses and Treatable Diseases by Image-Based Deep Learning)

该数据集共有 84,495 张 JPEG 格式的 X 光图像,尺寸多为 512x496,可以通过 Kaggle CLI 下载:
注:CLI 链接
https://github.com/Kaggle/kaggle-api

#!pip install kaggle
#!kaggle datasets download -d paultimothymooney/kermany2018

下载完成后,训练集和测试集图像类位于各自的文件夹内,因此我们可以将模式定义为:

labels = ['CNV', 'DME', 'DRUSEN', 'NORMAL']

train_folder = os.path.join('OCT2017', 'train', '**', '*.jpeg')
test_folder = os.path.join('OCT2017', 'test', '**', '*.jpeg')

接下来,我们要编写估算器的输入函数,该函数可以提取任何文件模式,并返回已缩放图像和独热编码标签作为 tf.data.Dataset。这次,我们遵循输入管道性能指南中的最佳实践。请特别注意,如果 prefetch 的 buffer_size 为 None,则 TensorFlow 会自动使用最优的预读取缓冲区大小:
注:输入管道性能指南链接
https://www.tensorflow.org/performance/datasets_performance

1    def input_fn(file_pattern, labels, 
2                        image_size=(224,224), 
3                        shuffle=False,
4                        batch_size=64, 
5                        num_epochs=None,
6                        buffer_size=4096,
7                        prefetch_buffer_size=None): 
8
9            table = tf.contrib.lookup.index_table_from_tensor(mapping=tf.constant(labels))
10          num_classes = len(labels) 
11
12          def _map_func(filename):
13                label = tf.string_split([filename], delimiter=os.sep).values[-2]
14                image = tf.image.decode_jpeg(tf.read_file(filename), channels=3)
15                image = tf.image.convert_image_dtype(image, dtype=tf.float32) 
16                image = tf.image.resize_images(image, size=image_size)
17                return (image, tf.one_hot(table.lookup(label), num_classes))
18
19          dataset = tf.data.Dataset.list_files(file_pattern, shuffle=shuffle)
20
21          if num_epochs is not None and shuffle:
22                dataset = dataset.apply(
23                    tf.contrib.data.shuffle_and_repeat(buffer_size, num_epochs))
24          elif shuffle:
25                dataset = dataset.shuffle(buffer_size)
26          elif num_epochs is not None:
27                dataset = dataset.repeat(num_epochs)
28
29          dataset = dataset.apply(
30                tf.contrib.data.map_and_batch(map_func=_map_func,
31                                        batch_size=batch_size,
32                                        num_parallel_calls=os.cpu_count()))
33          dataset = dataset.prefetch(buffer_size=prefetch_buffer_size)
34
35          return dataset 

这次训练该模型时,我们将使用一个经过预训练的 VGG16,并且只重新训练其最后 5 层:

keras_vgg16 = tf.keras.applications.VGG16(input_shape=(224,224,3),
                                         include_top=False)

output = keras_vgg16.output
output = tf.keras.layers.Flatten()(output)
prediction = tf.keras.layers.Dense(len(labels),
                                  activation=tf.nn.softmax)(output)

model = tf.keras.Model(inputs=keras_vgg16.input,
                      outputs=prediction)

for layer in keras_vgg16.layers[:-4]:
   layer.trainable = False

现在,我们万事皆备,可以按照上述步骤进行,并使用 NUM_GPUS GPU 在几分钟内训练我们的模型:

model.compile(loss='categorical_crossentropy',               optimizer=tf.train.AdamOptimizer(),              metrics=['accuracy'])

NUM_GPUS = 2
strategy = tf.contrib.distribute.MirroredStrategy(num_gpus=NUM_GPUS)
config = tf.estimator.RunConfig(train_distribute=strategy)
estimator = tf.keras.estimator.model_to_estimator(model,                                                  config=config)
BATCH_SIZE = 64
EPOCHS = 1

estimator.train(input_fn=lambda:input_fn(train_folder,                                         labels,                                         shuffle=True,                                         batch_size=BATCH_SIZE,                                         buffer_size=2048,                                         num_epochs=EPOCHS,                                         prefetch_buffer_size=4),                hooks=[time_hist])

训练结束后,我们可以评估测试集的准确度,应该在 95% 左右(对初始基线来说还不错):

estimator.evaluate(input_fn=lambda:input_fn(test_folder,
                                           labels, 
                                           shuffle=False,
                                           batch_size=BATCH_SIZE,
                                           buffer_size=1024,
                                           num_epochs=1))

使用两块 K80 GPU 进行训练时的 Fashion-MNIST 训练吞吐量和总时间,采用不同 NUM_GPUS,显示线性缩放

总结
我们在上文中介绍了如何使用估算器 API 在多个 GPU 上轻松训练 Keras 深度学习模型,如何编写符合最佳实践的输入管道,以充分利用我们的资源(线性缩放),以及如何通过钩子为我们的训练吞吐量计时。

请务必注意,最后我们主要关注的是测试集错误。您可能会注意到,测试集的准确度会随着 NUM_GPUS 值的增加而下降。其中一个原因可能是,使用 BATCH_SIZE*NUM_GPUS 的批量大小时,MirroredStrategy 能够有效地训练模型,而当我们增加 GPU 数量时,可能需要调整 BATCH_SIZE 或学习率。为便于制图,文中除 NUM_GPUS 之外的所有其他超参数均保持不变,但实际上我们需要调整这些超参数。

数据集和模型的大小也会影响这些方案的缩放效果。在读取或写入小数据时,GPU 的带宽较差,如果是较为老旧的 GPU(如 K80),则情形尤其如此,而且可能会造成上面 Fashion-MNIST 图中所示情况。

致谢
感谢 TensorFlow 团队,特别是 Josh Gordon,以及 Zalando Research 的各位同事,特别是 Duncan Blythe、Gokhan Yildirim 和 Sebastian Heinz,感谢他们帮忙修改草稿。

SCI论文Discussion写作:如何用AI工具三步打造审稿人认可的深度逻辑框架 本文针对SCI论文Discussion写作的痛点,提出利用AI工具三步构建深度逻辑框架的方法。首先,使用Claude等工具搭建个性化提纲,解决“浅显病”与“混乱症”;其次,高效整合文献与结果,填充证据;最后,优化逻辑衔接与学术语言,打造审稿人认可的流畅论证。该方法强调研究者主导,AI辅助,显著提升写作效率与深度。 阅读详情

相关推荐

从‘最长白列’到‘八邻域’:智能车图像巡线算法怎么选?我的踩坑经验分享

本文深入探讨了全国大学生智能汽车竞赛中图像巡线算法的选型与优化,对比了最长白列法、八邻域算法等五种主流方法的性能与适用场景。通过实战数据和代码示例,分析了各算法在直道、弯道及特殊赛道元素中的表现,并提供了内存优化、参数调整等实用技巧,帮助参赛团队提升智能车的巡线精度与效率。

weixin_30374009的博客 632

tensorflow 中对 tf.estimator 分配 多GPU 方法

1 通用分配GPU:import os os.environ['CUDA_VISIBLE_DEVICES'] = '1,2'2 有些使用上述方法不可取,需要从代码中指定分配GPU: session_config = tf.ConfigProto(device_count={'GPU': 0,'GPU':1,'GPU':2}) #session_config.gpu_options.per_...

七爷OK 5764

VS2019手动添加bits/stdc++.h全指南(附解决‘无法打开源文件‘错误)

本文详细介绍了在Visual Studio 2019中手动配置C++万能头文件bits/stdc++.h的完整方法,解决常见的'无法打开源文件'错误。通过分析GCC与MSVC编译器生态差异,提供了纯手动创建和MinGW移植两种可靠方案,并给出详细的步骤、常见错误排查及最佳实践建议,帮助开发者高效配置竞赛开发环境。

weixin_29011395的博客 545

【笔记】tf数据并行多GPU训练

将数据写成TFRecord二进制文件格式: https://tensorflow.google.cn/tutorials/load_data/tfrecord 写一个TFRecord文件主要的三个流程: 1. 把数据转换成TFRecord规定的可接受的三种类型之一,分别是tf.train.BytesList(对应string和byte),tf.train.FloatList(对应float32 和 float64)和tf.train.Int64List(对应bool、 enum、int32、int6

nyist_yangguang的博客 815

Nature风格的北半球投影图,几行代码就能绘制...

在子刊***Nat. Clim. Chang.***中,通过北极俯视投影表示NAO和AO的EOF分解。仅在定义图层的时候设置为该投影,其余设置content,绘制contourf都是PlateCaree。如子刊Nature Geosci中表示了海冰的漂移,还添加了DEM底图,非常美观。以海温数据为例,ERA5月温度平均,是一张721*1440的0.25degTIF。现在的结果看起来不错,但太大了,我们如果只需要北半球的数据,则需要指定经纬度。绘制完结果也是正方形,和ArcGIS差不多,见之前的推文。

wlh2067的博客 1292

手把手教你学simulink(95.1)--PID控制实例:基于Simulink的PID控制温度控制系统建模与仿真

温度控制是工业自动化、家用电器、医疗设备以及航空航天等领域中常见的控制问题。通过精确的温度控制,可以提高生产效率、降低能耗并确保产品质量。PID(比例-积分-微分)控制器因其结构简单、性能稳定且易于实现而被广泛应用于各种温度控制系统。本项目旨在通过MATLAB/Simulink平台设计和验证一个基于PID控制的温度控制系统,重点研究PID参数调优方法、系统动态响应特性以及稳态误差消除能力。

MHD0815的博客 792

keras深度训练:GPU设置

keras指定运行时显卡及限制GPU用量 固定GPU训练: import os import tensorflow as tf import keras.backend.tensorflow_backend as KTF #进行配置,每个GPU使用90%上限现存 os.environ["CUDA_VISIBLE_DEVICES"]="0,1" # 使用编号为0,1号的GPU config = t...

qq_38410428的博客 6485

【数据集】1980-2020年(5年)土地利用分类数据-中国科学院

简介1980-2020年每五年土地利用数据-中国科学院

WW、forever的博客 3931

深入解决keras、tf的gpu运行问题

之前写过一篇配置keras+tensorflow+cudnn的GPU环境配置,但后面主要用Pytorch去了。最近因为项目的原因又回来用tensorflow-gpu,结果发现了几个新的配置问题,网上也没相关的资料,花了一天时间才解决,记录如下。

fun_always的博客 1305

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

此文主要在小程序内实现打卡功能,可根据用户位置与公司设定的打卡范围实时判断打卡是否合法,并在后台对打卡记录进行管理。

商务合作 / 项目定制 / 学习交流。个人vx:lovely_wml 1万+

CosyVoice语音合成使用教程

CosyVoice是一款开源的语音合成工具,它基于深度学习模型,能够生成高度逼真的语音内容。该工具支持多种语言的语音生成,包括中文、英文、日文、粤语和韩语。CosyVoice的亮点在于它对生成语音情感和韵律的精细控制,通过富文本或自然语言输入,可以显著提升合成语音的情感表达能力。CosyVoice提供了多种预训练模型,用户可以根据需求选择合适的模型。:基底模型,适用于一般语音合成任务。:经过SFT微调的模型,适用于特定音色和情感的语音合成。:支持Instruct微调的模型,适用于自然语言控制的语音合成。

笔者从事电信媒体开发多年,愿意将多年的开发经验分享给同行 4441

【Keras】基于tf2.0+和tf.keras的Transformer实现

代码来自: Learning transferable visual models from natural language supervision 该代码主要由有train.py、data_loader.py、model.py、utils.py和test.py组成,每一个python文件的作用如下: train.py:初始化DataLoader(来自于data_loader.py)并调用DataLoader的load()方法构建训练集和验证集;构建Transformer(来自model.py)的模型结

qq_36643449的博客 3711

VS2022编译xlnt库

xlnt是一个用于读写Excel文件的C++库,本文介绍如何用源代码编译静态或动态xlnt库

QQVQQ的博客 7287

ComfyUI-LTXVideo 视频生成实操指南

想把一句文字变成视频、或者把一段老素材重新剪辑一遍?ComfyUI 本体已经内置了 LTX-2,基础流程能跑,但进阶控制散在你没听说过的节点里。ComfyUI-LTXVideo 就是 ComfyUI 的 LTX-2 视频生成定制扩展:几十个现成节点加全套示例工作流,覆盖文/图生视频、音视频联合生成和视频编辑整条链路。 ## 它到底能帮你做什么 LTX-2 的基础生成能力已经在 ComfyUI

gitblog_00230的博客 725

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

TensorFlow实战使用tf.data和Keras高效构建图像分类模型

通过结合tf.data的强大数据处理能力和Keras的简洁建模接口,开发者能够构建出既高效又易于维护的图像分类解决方案。这种工作流不仅适用于图像分类,也可以轻松扩展至其他视觉任务乃至非视觉领域。掌握这一套技术栈,意味着你能够更从容地应对日益增长的数据规模和模型复杂度,将更多精力投入到算法创新中。随着TensorFlow的持续演进,相信未来会有更多工具和优化被引入,进一步简化和加速深度学习应用的开发过程。

zhuhui_bupt的博客 777

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

从Estimator到Keras:tf-estimator-tutorials迁移学习完全攻略

tf-estimator-tutorials是一个系统且标准化的TensorFlow教程仓库,专注于如何使用Estimator API执行各种机器学习任务。本指南将帮助您从Estimator无缝迁移到Keras,利用Keras的简洁API和强大功能提升您的机器学习工作流。 ## 为什么选择从Estimator迁移到Keras? 🤔 TensorFlow Estimator API曾是构建和训

gitblog_00257的博客 963

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

高版本Keras多GPU和分布式训练(Multi-GPU and distributed training)

From:Multi-GPU and distributed training (keras.io) Introduction There are generally two ways to distribute computation across multiple devices: Data parallelism, where a single model gets replicated on multiple devices or multiple machines. Each of the.

豆芽菜 814

3 种 TensorFlow 数据集加载方案对比:tf.keras.datasets、tf.data 与本地自定义数据

本文深入对比了TensorFlow中三种数据集加载方案:tf.keras.datasets、tf.data API和自定义数据加载器,适用于计算机视觉项目从原型到生产的不同阶段。通过性能测试和实战案例,帮助开发者根据项目需求选择最优方案,提升模型训练效率。

weixin_30443747的博客 401

打印模型 tf_在 Colab 中使用 TPU 训练 tf.keras

文 /Sam Witteveen您知道吗?Colab能够让您选择用于训练模型的免费 Cloud TPU。没错,您可以在笔记中自行使用整个 TPU!从 TensorFlow 1.11 起,您可以使用 TPU 训练 Keras 模型。在本文中,我们会一起了解您需要对代码作出哪些更改才能在 TPU 上训练 Keras 模型。请注意,将于今年晚些时候发布的 TensorFlow 2.0 可能...

weixin_39680121的博客 326

SkillHub Suite 成员反向发现:让任意成员 Skill 安全展示所属 Suite 的隐私保护与查询设计

本文围绕 SkillHub 开源仓库中 `add-suite-bundle-publishing` 变更集里的 `suite-member-discovery` 规格(见 [openspec/changes/add-suite-bundle-publishing/specs/suite-member-discovery/spec.md](https://link.gitcode.com/i/e88

gitblog_00177的博客 499

tf dataset mnist_在 Colab 中使用 TPU 训练 tf.keras

文 /Sam Witteveen您知道吗?Colab能够让您选择用于训练模型的免费 Cloud TPU。没错,您可以在笔记中自行使用整个 TPU!从 TensorFlow 1.11 起,您可以使用 TPU 训练 Keras 模型。在本文中,我们会一起了解您需要对代码作出哪些更改才能在 TPU 上训练 Keras 模型。请注意,将于今年晚些时候发布的 TensorFlow 2.0 可能...

weixin_40001309的博客 257

30天吃掉TensorFlow2:用MirroredStrategy两行代码实现多GPU训练Keras模型

本文是《30天吃掉那只TensorFlow2》高阶API章节([六、TensorFlow的高阶API](https://link.gitcode.com/i/8a171c44d0bdfc4548d80d42ed86e2be))的第 6-4 节配套实战指南,聚焦"使用多GPU训练模型"这一高频需求。当单卡显存不足、或希望成倍缩短参数迭代时间时,TensorFlow 2 提供的 `tf.distrib

gitblog_00362的博客 610

Horovod 与 Keras 分布式训练实战指南:六步改造你的训练脚本

> 本文面向使用 Keras(含 TensorFlow 2 自带 `tf.keras`)训练模型的开发者,系统讲解如何用 Horovod 将单机训练脚本改造成可横向扩展的多卡、多机分布式训练脚本。全文以官方文档 [docs/keras.rst](https://link.gitcode.com/i/09de461fb31774837fe5cd107dfbcce0) 为骨架,结合仓库内源码实现与示例

gitblog_00293的博客 897

keras核心已转储_转储Keras-ImageDataGenerator。 开始使用TensorFlow-tf.data(第2部分)

keras核心已转储This article is the follow up from Part 1. Here, I will compare the tf.data and Keras.ImageDataGeneratoractual training times using the mobilenetmodel. 本文是第1部分的后续文章。在这里,我将使用mobilenet模型比较tf.d...

weixin_26726011的博客 249

keras-resnet性能优化:10个技巧提升训练速度与内存效率

在深度学习领域,ResNet(残差网络)凭借其卓越的特征提取能力和梯度传播特性,成为计算机视觉任务的首选架构之一。keras-resnet项目基于Keras-1.0功能API实现了残差网络,本文将分享10个实用技巧,帮助你显著提升模型训练速度与内存利用效率,让深度学习项目更高效地运行。 ## 1. 选择合适的ResNet架构减少计算量 ResNet系列包含多种网络深度选择,不同架构的计算复杂度

gitblog_00678的博客 1006

keras开发文档 4:内置方法的训练和评估

文章目录设置介绍API概述:第一个端到端示例compile()方法:指定损失,指标和优化器( loss, metrics, and an optimizer)提供许多内置的优化器,损失和指标自定义损失自定义指标处理不符合标准签名的损失和指标自动区分验证保留集来自tf.data数据集的训练和评估使用验证数据集支持其他输入格式使用keras.utils.Sequence对象作为输入使用样本加权和类别加权Class权重Sample 权重将数据传递到多输入,多输出模型使用回调许多内置的回调可用编写自己的回调检查点模

xiaojianzhao的博客 1152
上一篇: AMD ROCm GPU,支持 TensorFlow!
下一篇: 如何为 Cloud TPU 编写自定义估算器模型
TensorFlowers
博客等级 码龄8年 24粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值