- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试编写一个 tensorflow 自定义训练循环并包含一些 tensorboard 实用程序。
完整代码如下:
import tensorflow as tf
from pathlib import Path
from tensorflow.keras.utils import to_categorical
from tensorflow.keras import layers
import cv2
from tqdm import tqdm
from os import listdir
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
from tqdm import tqdm
from random import shuffle, choice, uniform
from os.path import isdir, dirname, abspath, join
from os import makedirs
from tensorflow.keras.callbacks import (ModelCheckpoint, TensorBoard,
EarlyStopping, LearningRateScheduler)
import io
from natsort import natsorted
from tensorflow.keras import backend as K
from tensorflow.keras import Sequential,Model
from tensorflow.keras.applications import (DenseNet201, InceptionV3, MobileNetV2,
ResNet101, Xception, EfficientNetB7,VGG19, NASNetLarge)
from tensorflow.keras.applications import (densenet, inception_v3, mobilenet_v2,
resnet, xception, efficientnet, vgg19, nasnet)
from tensorflow.keras.preprocessing import image
from tensorflow.keras.layers import Dense, GlobalAveragePooling2D
from tensorflow.keras.optimizers import SGD, Adam
from tensorflow.keras.layers.experimental.preprocessing import Rescaling, Resizing
from tensorflow.keras.utils import Progbar
ROOT = '/content/drive/MyDrive'
data_path = 'cropped/'
train_path = data_path + 'train'
val_path = data_path + 'val'
labels = {v:k for k, v in enumerate(listdir(train_path))}
models = {
'densenet': DenseNet201,
'xception': Xception,
'inceptionv3': InceptionV3,
'effecientnetb7': EfficientNetB7,
'vgg19': VGG19,
'nasnetlarge': NASNetLarge,
'mobilenetv2': MobileNetV2,
'resnet': ResNet101
}
# models['densenet']()
preprocess_pipeline = {
'densenet': densenet.preprocess_input,
'xception': xception.preprocess_input,
'inceptionv3': inception_v3.preprocess_input,
'effecientnetb7': efficientnet.preprocess_input,
'vgg19': vgg19.preprocess_input,
'nasnetlarge': nasnet.preprocess_input,
'mobilenetv2': mobilenet_v2.preprocess_input,
'resnet': resnet.preprocess_input
}
def configure_for_performance(ds, buffer_size, batch_size):
"""
Configures caching and prefetching
"""
ds = ds.cache()
ds = ds.batch(batch_size)
ds = ds.prefetch(buffer_size=buffer_size)
return ds
def generator(tfrecord_file, batch_size, n_data, validation_ratio, reshuffle_each_iteration=False):
"""
Returns training and validation generators with infinite repeat.
"""
reader = tf.data.TFRecordDataset(filenames=[tfrecord_file])
reader.shuffle(n_data, reshuffle_each_iteration=reshuffle_each_iteration)
AUTOTUNE = tf.data.experimental.AUTOTUNE
val_size = int(n_data * validation_ratio)
train_ds = reader.skip(val_size)
val_ds = reader.take(val_size)
# Parsing data from tfrecord format.
train_ds = train_ds.map(_parse_function, num_parallel_calls=AUTOTUNE)
# Some data augmentation.
train_ds = train_ds.map(_augment_function, num_parallel_calls=AUTOTUNE)
train_ds = configure_for_performance(train_ds, AUTOTUNE, batch_size).repeat()
val_ds = val_ds.map(_parse_function, num_parallel_calls=AUTOTUNE)
val_ds = val_ds.map(_augment_function, num_parallel_calls=AUTOTUNE)
val_ds = configure_for_performance(val_ds, AUTOTUNE, batch_size).repeat() # Is this repeat function the reason behind the issue
return train_ds, val_ds
def create_model(optimizer, name='densenet', include_compile=True):
base_model = models[name](include_top=False, weights='imagenet')
x = GlobalAveragePooling2D()(base_model.layers[-1].output)
x = Dense(1024, activation='relu')(x)
output = Dense(12, activation='softmax')(x)
model = Model(base_model.inputs, output)
if include_compile:
model.compile(loss='categorical_crossentropy',
optimizer=optimizer,
metrics=['accuracy'])
return model
现在让我们创建一个模型并初始化:
n_data = len(list(Path(data_path).rglob('*.jpg'))) # Find out how many images are there
validation_ratio = 0.2
val_size = int(n_data * validation_ratio) # Find out validation image size.
train_size = n_data - val_size # And train images size
batch_size = 64
n_epochs = 5
# Tfrecord of images
filename = '/content/drive/MyDrive/cropped_data.tfrecord'
train_ds, val_ds = generator(filename,
batch_size=batch_size,
n_data=n_data,
validation_ratio=validation_ratio,
reshuffle_each_iteration=True)
# Tensorboard initialization
model_name = 'xception'
path_to_run = "runs/run_1"
tb_train_path = join(path_to_run, 'logs','train')
tb_test_path = join(path_to_run, 'logs', 'test')
train_writer = tf.summary.create_file_writer(tb_train_path)
test_writer = tf.summary.create_file_writer(tb_test_path)
train_step = test_step = 0
blocks_to_train = []
lr = 1e-4
optimizer = SGD(lr=lr, decay=1e-6,momentum=0.9,nesterov=True)
loss_fn = tf.keras.losses.CategoricalCrossentropy(from_logits=True)
acc_metric = tf.keras.metrics.CategoricalCrossentropy()
# Create the xception model
model = create_model(optimizer, name=model_name, include_compile=False)
metrics = {'acc': 0.0, 'loss': 0.0, 'val_acc': 0.0, 'val_loss': 0.0, 'lr': lr}
这是训练和测试的循环:
for epoch in range(n_epochs):
# Iterate through the training set
progress_bar = Progbar(train_size, stateful_metrics=list(metrics.keys()))
for batch_idx, (x, y) in enumerate(train_ds):
with tf.GradientTape() as tape:
y_pred = model(x, training=True)
loss = loss_fn(y, y_pred)
gradients = tape.gradient(loss, model.trainable_weights)
optimizer.apply_gradients(zip(gradients, model.trainable_weights))
acc_metric.update_state(y, y_pred)
train_step += 1
progress_bar.update(batch_idx*batch_size, values=[('acc',acc_metric.result()),
('loss', loss)])
with train_writer.as_default():
tf.summary.scalar("Loss", loss, step=epoch)
tf.summary.scalar(
"Accuracy", acc_metric.result(), step=epoch
)
# reset accuracy between epochs (and for testing and test)
acc_metric.reset_states()
for batch_idx, (x,y) in enumerate(val_ds):
y_pred = model(x, training=False)
loss = loss_fn(y, y_pred)
acc_metric.update_state(y,
y_pred)
confusion += get_confusion_matrix(y, y_pred, class_names=list(labels.keys()))
with test_writer.as_default():
tf.summary.scalar("Loss", loss, step=epoch)
tf.summary.scalar("Accuracy", acc_metric.result(), step=epoch)
progress_bar.update(train_size, values=[('val_acc', acc_metric.result()), ('val_loss', loss)])
# reset accuracy between epochs (and for testing and test)
acc_metric.reset_states()
我修改了代码并删除了一些 tensorboard 实用程序。代码开始训练,但不会在预定义时期结束时停止。我看到进度条一直在不停地显示验证指标。
你们能帮我制作一个与 keras.fit
函数完全相同的进度条吗?
谢谢
最佳答案
我发现了长时间训练 epoch 背后的(愚蠢的)原因:
数据由train_size
组成训练数据和 val_size
不考虑批处理的验证数据。例如,训练数据包含 4886 个数据样本,这将是 76 个数据批处理(batch_size=64
)。
当我使用 for batch_idx, (x, y) in enumerate(train_gen):
时,我总共有 76 个批处理,但我在循环中错误地循环了 4886 个批处理。
我重写了以下几行:
for epoch in range(n_epochs):
# Iterate through the training set
progress_bar = Progbar(train_size, stateful_metrics=list(metrics.keys()))
train_gen = train_ds.take(train_size//batch_size) # This line
for batch_idx, (x, y) in enumerate(train_gen):
.....
val_gen = val_ds.take(val_size//batch_size)
for batch_idx, (x,y) in enumerate(val_gen):
关于tensorflow 自定义循环不会在第一个纪元结束并且进度条运行到无限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66151793/
我想将模型及其各自训练的权重从 tensorflow.js 转换为标准 tensorflow,但无法弄清楚如何做到这一点,tensorflow.js 的文档对此没有任何说明 我有一个 manifest
我有一个运行良好的 TF 模型,它是用 Python 和 TFlearn 构建的。有没有办法在另一个系统上运行这个模型而不安装 Tensorflow?它已经经过预训练,所以我只需要通过它运行数据。 我
当执行 tensorflow_model_server 二进制文件时,它需要一个模型名称命令行参数,model_name。 如何在训练期间指定模型名称,以便在运行 tensorflow_model_s
我一直在 R 中使用标准包进行生存分析。我知道如何在 TensorFlow 中处理分类问题,例如逻辑回归,但我很难将其映射到生存分析问题。在某种程度上,您有两个输出向量而不是一个输出向量(time_t
Torch7 has a library for generating Gaussian Kernels在一个固定的支持。 Tensorflow 中有什么可比的吗?我看到 these distribu
在Keras中我们可以简单的添加回调,如下所示: self.model.fit(X_train,y_train,callbacks=[Custom_callback]) 回调在doc中定义,但我找不到
我正在寻找一种在 tensorflow 中有条件打印节点的方法,使用下面的示例代码行,其中每 10 个循环计数,它应该在控制台中打印一些东西。但这对我不起作用。谁能建议? 谢谢,哈米德雷萨, epsi
我想使用 tensorflow object detection API 创建我自己的 .tfrecord 文件,并将它们用于训练。该记录将是原始数据集的子集,因此模型将仅检测特定类别。我不明白也无法
我在 TensorFlow 中训练了一个聊天机器人,想保存模型以便使用 TensorFlow.js 将其部署到 Web。我有以下内容 checkpoint = "./chatbot_weights.c
我最近开始学习 Tensorflow,特别是我想使用卷积神经网络进行图像分类。我一直在看官方仓库中的android demo,特别是这个例子:https://github.com/tensorflow
我目前正在研究单图像超分辨率,并且我设法卡住了现有的检查点文件并将其转换为 tensorflow lite。但是,使用 .tflite 文件执行推理时,对一张图像进行上采样所需的时间至少是使用 .ck
我注意到 tensorflow 的 api 中已经有批量标准化函数。我不明白的一件事是如何更改训练和测试之间的程序? 批量归一化在测试和训练期间的作用不同。具体来说,在训练期间使用固定的均值和方差。
我创建了一个模型,该模型将 Mobilenet V2 应用于 Google colab 中的卷积基础层。然后我使用这个命令转换它: path_to_h5 = working_dir + '/Tenso
代码取自:- http://adventuresinmachinelearning.com/python-tensorflow-tutorial/ import tensorflow as tf fr
好了,所以我准备在Tensorflow中运行 tf.nn.softmax_cross_entropy_with_logits() 函数。 据我了解,“logit”应该是概率的张量,每个对应于某个像素的
tensorflow 服务构建依赖于大型 tensorflow ;但我已经成功构建了 tensorflow。所以我想用它。我做这些事情:我更改了 tensorflow 服务 WORKSPACE(org
Tensoflow 嵌入层 ( https://www.tensorflow.org/api_docs/python/tf/keras/layers/Embedding ) 易于使用, 并且有大量的文
我正在尝试使用非常大的数据集(比我的内存大得多)训练 Tensorflow 模型。 为了充分利用所有可用的训练数据,我正在考虑将它们分成几个小的“分片”,并一次在一个分片上进行训练。 经过一番研究,我
根据 Sutton 的书 - Reinforcement Learning: An Introduction,网络权重的更新方程为: 其中 et 是资格轨迹。 这类似于带有额外 et 的梯度下降更新。
如何根据条件选择执行图表的一部分? 我的网络有一部分只有在 feed_dict 中提供占位符值时才会执行.如果未提供该值,则采用备用路径。我该如何使用 tensorflow 来实现它? 以下是我的代码
我是一名优秀的程序员,十分优秀!