我正在研究一种图像类增量分类器方法,使用CNN作为特征提取器和一个完全连接的块进行分类.
首先,我对每个训练有素的VGG网络进行了微调,以完成一项新任务.一旦网络被训练用于新任务,我就为每个班级存储一些示例,以避免在新班级可用时忘记.
当某些类可用时,我必须计算样本的每个输出,包括新类的示例.现在为旧类的输出添加零,并在新类输出上添加与每个新类对应的标签,我有新标签,即:如果有3个新类输入....
旧班类型输出: [0.1, 0.05, 0.79, ..., 0 0 0]
新类类型输出:[0.1, 0.09, 0.3, 0.4, ..., 1 0 0]**最后的输出对应于类.
我的问题是,我如何改变自定义的损失函数来训练新的类?我想要实现的损失函数定义为:
蒸馏损失对应于旧类别的输出以避免遗忘,而分类损失对应于新类别.
如果你能给我一些代码样本来改变keras中的损失函数会很好.
谢谢!!!!!
computer-vision deep-learning conv-neural-network keras loss-function
我正在使用Keras(使用Tensorflow后端)进行二进制分类,我有大约76%的精度和70%的召回率.现在我想尝试使用决策阈值.据我所知,Keras使用决策阈值0.5.有没有办法Keras使用自定义阈值来决策精度和召回?
感谢您的时间!
有什么方法可以针对特定指标使用内置tensorflow优化器进行优化?如果没有,如何实现这一目标?例如。如果我只想专注于最大化我的分类器的 F 分数,是否可以这样做tensorflow?
estimator = tf.estimator.LinearClassifier(
feature_columns=feature_cols,
config=my_checkpointing_config,
model_dir=output_dir,
optimizer=lambda: tf.train.FtrlOptimizer(
learning_rate=tf.train.exponential_decay(
learning_rate=0.1,
global_step=tf.train.get_or_create_global_step(),
decay_steps=1000,
decay_rate=0.96)))
Run Code Online (Sandbox Code Playgroud)
我试图在获得更好的 F 分数的基础上专门优化我的分类器。尽管使用了衰减learning_rate和 300 个训练步骤,但我得到的结果不一致。在检查日志中的指标,我发现的行为precision,recall并且accuracy是非常不稳定的。尽管增加了训练步骤的数量,但没有显着改善。所以我想,如果我能让优化器更专注于提高整体 F-score,我可能会得到更好的结果。因此这个问题。有什么我想念的吗?
我有一个带有 5 个标签的多标签分类问题(例如[1 0 1 1 0])。因此,我希望我的模型在固定召回、精确召回 AUC 或 ROC AUC 等指标上有所改进。
使用binary_crossentropy与我想要优化的性能测量没有直接关系的损失函数(例如)是没有意义的。因此,我想使用 TensorFlowglobal_objectives.recall_at_precision_loss()或类似的作为损失函数。
我不是在寻找实现tf.metrics. 我已经在以下方面取得了成功:https : //stackoverflow.com/a/50566908/3399066
我认为我的问题可以分为两个问题:
global_objectives.recall_at_precision_loss()或类似?全局目标GitHub页面loss_layers_example.py上有一个文件(同上)。但是,由于我对TF没有太多经验,所以我不太了解如何使用它。另外,谷歌搜索TensorFlow recall_at_precision_loss example或TensorFlow Global objectives example不会给我任何更清晰的例子。
如何global_objectives.recall_at_precision_loss()在简单的 TF 示例中使用?
会像(在 Keras 中):model.compile(loss = ??.recall_at_precision_loss, ...)就足够了吗?我的感觉告诉我它比这更复杂,因为在 …
我使用 CNN 对不平衡数据集进行图像分类。我对 tensorflow 后端完全陌生。这是多类问题(不是多标签),我有 16 个类。类是一种热编码。
我想计算每个时期的 MACRO 指标:F1、精度和召回率。
我找到了一个代码来打印这些宏指标,但它只适用于验证集来自:https : //medium.com/@thongonary/how-to-compute-f1-score-for-each-epoch-in-keras-a1acd17715a2
class Metrics(Callback):
def on_train_begin(self, logs={}):
self.val_f1s = []
self.val_recalls = []
self.val_precisions = []
def on_epoch_end(self, epoch, logs={}):
val_predict = (np.asarray(self.model.predict(self.validation_data[0]))).round()
val_targ = self.validation_data[1]
_val_f1 = f1_score(val_targ, val_predict,average='macro')
_val_recall = recall_score(val_targ, val_predict,average='macro')
_val_precision = precision_score(val_targ, val_predict,average='macro')
self.val_f1s.append(_val_f1)
self.val_recalls.append(_val_recall)
self.val_precisions.append(_val_precision)
print (" — val_f1: %f — val_precision: %f — val_recall %f" % (_val_f1, _val_precision, _val_recall))
return
metrics = Metrics()
Run Code Online (Sandbox Code Playgroud)
我什至不确定这段代码是否真的有效,因为我们使用
val_predict = (np.asarray(self.model.predict(self.validation_data[0]))).round()
Run Code Online (Sandbox Code Playgroud)
在多类分类的情况下,ROUND 会导致错误吗?
我使用此代码在训练集上打印指标(仅回忆起对我来说重要的指标)(也计算验证集,因为它在 model.compute …
当我们训练神经网络时,我们通常使用梯度下降,这依赖于连续的,可微分的实值成本函数。最终成本函数可能会产生均方误差。或者换种说法,梯度下降隐式地认为最终目标是回归 -最大限度地减少实值误差度量。
有时,我们希望神经网络要做的就是执行分类 -给定输入,将其分类为两个或多个离散类别。在这种情况下,用户关心的最终目标是分类准确性-正确分类的案例的百分比。
但是,当我们使用神经网络进行分类时,尽管我们的目标是分类准确度,但这并不是神经网络试图优化的目标。神经网络仍在尝试优化实值成本函数。有时这些指向同一方向,但有时却不同。特别是,我一直在遇到这样的情况:经过训练以正确最小化成本函数的神经网络具有比简单的手工编码阈值比较差的分类精度。
我已经使用TensorFlow将其简化为一个最小的测试用例。它建立一个感知器(无隐藏层的神经网络),在绝对最小的数据集(一个输入变量,一个二进制输出变量)上训练它,评估结果的分类精度,然后将其与简单手的分类精度进行比较编码的阈值比较;结果分别是60%和80%。直观地讲,这是因为具有大输入值的单个离群值会产生相应的大输出值,因此,将成本函数最小化的方法是,在对两种以上普通情况进行错误分类的过程中,要尽最大努力适应这种情况。感知器正确地执行了被告知要执行的操作;只是这与我们实际想要的分类器不符。
我们如何训练神经网络,使其最终最大化分类精度?
import numpy as np
import tensorflow as tf
sess = tf.InteractiveSession()
tf.set_random_seed(1)
# Parameters
epochs = 10000
learning_rate = 0.01
# Data
train_X = [
[0],
[0],
[2],
[2],
[9],
]
train_Y = [
0,
0,
1,
1,
0,
]
rows = np.shape(train_X)[0]
cols = np.shape(train_X)[1]
# Inputs and outputs
X = tf.placeholder(tf.float32)
Y = tf.placeholder(tf.float32)
# Weights
W = tf.Variable(tf.random_normal([cols]))
b = tf.Variable(tf.random_normal([]))
# Model
pred …Run Code Online (Sandbox Code Playgroud) classification machine-learning neural-network gradient-descent loss-function