- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试使用苗条的tensorflow库微调inceptionv3模型。
在编写代码时,我无法理解某些事情。我尝试阅读源代码(没有适当的文档),并弄清了几件事,并且能够对其进行微调并保存检查点。这是我遵循的步骤
1.我为训练数据创建了一个tf.record,这很好,现在我正在使用以下代码读取数据。
import tensorflow as tf
import tensorflow.contrib.slim.nets as nets
import tensorflow.contrib.slim as slim
import matplotlib.pyplot as plt
import numpy as np
# get the data and labels here
data_path = '/home/sfarkya/nvidia_challenge/datasets/detrac/train1.tfrecords'
# Training setting
num_epochs = 100
initial_learning_rate = 0.0002
learning_rate_decay_factor = 0.7
num_epochs_before_decay = 5
num_classes = 5980
# load the checkpoint
model_path = '/home/sfarkya/nvidia_challenge/datasets/detrac/inception_v3.ckpt'
# log directory
log_dir = '/home/sfarkya/nvidia_challenge/datasets/detrac/fine_tuned_model'
with tf.Session() as sess:
feature = {'train/image': tf.FixedLenFeature([], tf.string),
'train/label': tf.FixedLenFeature([], tf.int64)}
# Create a list of filenames and pass it to a queue
filename_queue = tf.train.string_input_producer([data_path], num_epochs=1)
# Define a reader and read the next record
reader = tf.TFRecordReader()
_, serialized_example = reader.read(filename_queue)
# Decode the record read by the reader
features = tf.parse_single_example(serialized_example, features=feature)
# Convert the image data from string back to the numbers
image = tf.decode_raw(features['train/image'], tf.float32)
# Cast label data into int32
label = tf.cast(features['train/label'], tf.int32)
# Reshape image data into the original shape
image = tf.reshape(image, [128, 128, 3])
# Creates batches by randomly shuffling tensors
images, labels = tf.train.shuffle_batch([image, label], batch_size=64, capacity=128, num_threads=2,
min_after_dequeue=64)
init_op = tf.group(tf.global_variables_initializer(), tf.local_variables_initializer())
sess.run(init_op)
# Create a coordinator and run all QueueRunner objects
coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(coord=coord)
# load model
# load the inception model from the slim library - we are using inception v3
#inputL = tf.placeholder(tf.float32, (64, 128, 128, 3))
img, lbl = sess.run([images, labels])
one_hot_labels = slim.one_hot_encoding(lbl, num_classes)
with slim.arg_scope(slim.nets.inception.inception_v3_arg_scope()):
logits, inceptionv3 = nets.inception.inception_v3(inputs=img, num_classes=5980, is_training=True,
dropout_keep_prob=.6)
# Restore convolutional layers:
variables_to_restore = slim.get_variables_to_restore(exclude=['InceptionV3/Logits', 'InceptionV3/AuxLogits'])
init_fn = slim.assign_from_checkpoint_fn(model_path, variables_to_restore)
# loss function
loss = tf.losses.softmax_cross_entropy(onehot_labels=one_hot_labels, logits = logits)
total_loss = tf.losses.get_total_loss()
# train operation
train_op = slim.learning.create_train_op(total_loss + loss, optimizer= tf.train.AdamOptimizer(learning_rate=1e-4))
print('Im here')
# Start training.
slim.learning.train(train_op, log_dir, init_fn=init_fn, save_interval_secs=20, number_of_steps= 10)
最佳答案
这是您问题的答案。
您不能将纪元直接赋予slim.learning.train
。相反,您将批次数作为参数。它称为number_of_steps
。它用于在line 709上设置名为should_stop_op
的操作。我假设您知道如何将纪元数转换为批次。
我不认为shuffle_batch
函数会重复图像,因为它内部使用了RandomShuffleQueue。根据this answer,RandomShuffleQueue
使用后台线程将元素排入队列:
而size(queue) < capacity
时:
向队列添加元素
它使元素出队:
而number of elements dequeued < batch_size
:
等待直到size(queue) >= min_after_dequeue + 1
元素。
从队列中均匀地随机选择一个元素,将其从队列中删除,然后将其添加为输出批次。
因此,我认为重复元素的可能性很小,因为在dequeuing
操作中,所选元素将从队列中删除。因此,它是采样而无需更换。
是否会为每个时期创建一个新的队列?
输入到tf.train.shuffle_batch
的张量是image
和label
,它们最终来自filename_queue
。如果该队列无限期地产生TFRecord文件名,那么我认为shuffle_batch
不会创建新队列。您也可以创建玩具代码,例如this,以了解shuffle_batch
的工作方式。
接下来,如何训练整个数据集?在您的代码中,以下行获取TFRecord文件名的列表。
filename_queue = tf.train.string_input_producer([data_path], num_epochs=1)
filename_queue
涵盖了您拥有的所有TFRecords,那么您肯定在训练整个数据集。现在,如何重新整理整个数据集是另一个问题。正如@mrry提到的
here一样,尚无支持(尚未使用AFAIK)对内存不足的数据集进行混洗。因此,最好的方法是准备数据集中的许多分片,以使每个分片包含约1024个示例。将TFRecord文件名列表按以下顺序随机排列:
filename_queue = tf.train.string_input_producer([data_path], shuffle=True, capacity=1000)
num_epochs = 1
参数并设置了
shuffle=True
。这样,它将无限期地产生TFRecord文件名的改组列表。现在,在每个文件上,如果使用
tf.train.shuffle_batch
,则将获得接近均匀的混排。基本上,随着每个分片中的示例数趋于1,您的混洗将变得越来越统一。我不想设置
num_epochs
,而是使用前面提到的
number_of_steps
参数终止训练。
training.py
并引入
logging.info('total loss = %f', total_loss)
。我不知道有没有更简单的方法。无需更改代码的另一种方法是在Tensorboard中查看摘要。
summary
对象。
summary
。
summary
操作。
slim.learning.train
,则步骤5和6已自动为您完成。
train_image_classifier.py
。 472行显示了如何创建
summaries
对象。第490、512和536行将相关变量写入
summaries
。第549行合并所有摘要,第553行创建op。您可以将此操作传递给
slim.learning.train
,还可以指定要编写摘要的频率。我认为,除非要进行特定的调试,否则不要在摘要中写任何内容,包括损失,total_loss,准确性和学习率。如果您编写直方图,那么对于ResNet-50之类的网络,张量板文件可能需要数十小时才能加载(我的张量板文件曾经是28 GB,要花12个小时才能加载6天的进度!)。顺便说一句,您实际上可以使用
train_image_classifier.py
文件进行微调,您将跳过上面的大多数步骤。但是,我喜欢这样做,因为您可以学到很多东西。
total_loss + loss
,您可以执行以下操作:
loss = tf.losses.softmax_cross_entropy(onehot_labels=one_hot_labels, logits = logits)
tf.losses.add_loss(loss)
total_loss = tf.losses.get_total_loss()
train_op = slim.learning.create_train_op(total_loss, optimizer=tf.train.AdamOptimizer(learning_rate=1e-4))
关于python - 在 slim 的tensorflow和tf记录批处理中微调inceptionv3的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49564318/
我想将模型及其各自训练的权重从 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 来实现它? 以下是我的代码
我是一名优秀的程序员,十分优秀!