我正在使用迁移学习ResNet-18
为斯坦福汽车数据集构建分类模型。我想实施标签平滑来惩罚过度自信的预测并提高泛化能力。
TensorFlow
在 中有一个简单的关键字参数CrossEntropyLoss
。有没有人为PyTorch
我可以即插即用的类似功能?
我是一个初学者,对于如何选择可以改善我的模型的预训练模型,我感到非常困惑。
我正在尝试使用模型的预训练权重创建猫品种分类器,比如说在数字数据集上训练的VGG16,这会改善模型的性能吗?或者如果我仅在数据库上训练模型而不使用其他权重会更好,或者两者都与那些预先训练的权重相同只是一个起点。
另外,如果我使用针对猫和狗数据训练的VGG16的权重作为我的猫品种分类模型的起点,这将有助于我改进模型吗?
classification deep-learning pre-trained-model transfer-learning
我使用Ubuntu与Python 3及以上tensorflow keras,我想用传送学习从训练的keras模型解释预创建模型在这里:
我正在使用以下代码
import numpy as np
from keras.applications import vgg16, inception_v3, resnet50, mobilenet
from keras import Model
a = np.random.rand(1, 224, 224, 3) + 0.001
a = mobilenet.preprocess_input(a)
mobilenet_model = mobilenet.MobileNet(weights='imagenet')
mobilenet_model.summary()
inputLayer = mobilenet_model.input
m = Model(input=inputLayer, outputs=mobilenet_model.get_layer("conv_pw_13_relu")(inputLayer))
m.set_weights(mobilenet_model.get_weights()[:len(m.get_weights())])
p = m.predict(a)
print(np.std(p), np.mean(p))
print(p.shape)
Run Code Online (Sandbox Code Playgroud)
我使用的层的输出始终是一个零数组,我是否应该将权重加载到我正在创建的 p 以便预训练模型实际工作?
我正在研究在估计器的model_fn中使用预训练的keras.applications模型的问题。
在我的研究小组中,我们使用Tensorflow估计器,因为它们通过并行训练和评估,训练的热启动,易于使用等提供了许多优势。因此,我需要一个可以在估计器的model_fn中使用的解决方案。
基本上,我想在model_fn中使用预训练图,尽管我可以使用来自keras.applications的模型。不幸的是,到目前为止,我无法以适当的方式将keras.applications模型插入到model_fn中。
我想使用不带顶层(resnet50,mobilenet,nasnet ...)的可视提取器来提取特征向量,稍后我可能要微调此提取。这将排除使用视觉提取器作为model_fn外部的预处理步骤。
在对真实数据集进行了大量尝试之后,我又恢复了旧的MNIST,并提出了一个最小的示例来表明我在寻找什么。我在这里查看了关于stackoverflow的信息,并且最初遵循了这一解释。
在下面的示例中,我尝试将具有移动网络架构的MNIST数据集归类为可视提取器。有两个使用这些功能的示例版本和一个完全不使用keras模型的示例。该代码非常接近TF官方custom_estimator示例。仅缩小数据集以使其易于装入内存,并且将图像放大并转换为rgb以适应网络结构。
示例案例1和2导致停滞的训练损失和评估的恒定损失。第三种情况表明,没有模型,损失的确会减少(尽管总体性能很差,可以预见)。在这个示例中,我并没有追求高性能!我只是想表明我遇到的困难,希望有人能提供帮助。
想法和进一步的想法:
我还在github上打开了一个问题,因为在我看来该功能应该可以工作。
在下面,您可以找到独立的示例。复制/粘贴后,它应该立即可用。任何帮助深表感谢!
import tensorflow as tf
import numpy as np
from keras.datasets import mnist
# switch to example 1/2/3
EXAMPLE_CASE = 3
# flag for initial weights loading of keras model
_W_INIT = True
def dense_net(features, labels, mode, params):
# --- code to load a keras application ---
# commenting in this …
Run Code Online (Sandbox Code Playgroud) 我有一个关于微调和迁移学习的一般性问题,当我试图找出如何最好地让 yolo 检测我的自定义对象(手)时出现了这个问题。
对于可能包含大量虚假信息的长文本,我深表歉意。如果有人有耐心阅读它并帮助我清除我的困惑,我会很高兴。
经过大量的谷歌搜索,我了解到很多人认为微调是迁移学习的一个子类,而其他人则认为他们是训练模型的不同方法。同时,人们区分仅在自定义数据集上重新训练模型的最后一个分类器层与重新训练模型的其他层(并且可能添加一个全新的分类器而不是重新训练?)。这两种方法都使用预先训练的模型。
我最后的困惑就在这里:我按照以下说明操作:https : //github.com/thtrieu/darkflow 通过darkflow 使用以下命令训练小yolo:
# Initialize yolo-new from yolo-tiny, then train the net on 100% GPU:
flow --model cfg/yolo-new.cfg --load bin/tiny-yolo.weights --train --gpu 1.0
但是这里发生了什么?我想我只是重新训练分类器,因为说明说要更改配置文件中最后一层的类数。但话又说回来,还需要更改倒数第二层(卷积层)中的过滤器数量。
最后,说明提供了替代培训的示例:
# Completely initialize yolo-new and train it with ADAM optimizer
flow --model cfg/yolo-new.cfg --train --trainer adam
我完全不明白这与迁移学习的不同方式有何关联。
我正在尝试在Keras中创建模型,以便根据图片进行数值预测。我的模型具有densitynet121卷积基础,顶部还有几个附加层。除最后两个图层外的所有图层均设置为layer.trainable = False
。我的损失是均方误差,因为这是一项回归任务。在训练期间,我得到loss: ~3
,而对同一批数据的评估给出loss: ~30
:
model.fit(x=dat[0],y=dat[1],batch_size=32)
Run Code Online (Sandbox Code Playgroud)
时代1/1 32/32 [==============================]-0s 11ms / step-损耗:2.5571
model.evaluate(x=dat[0],y=dat[1])
Run Code Online (Sandbox Code Playgroud)
32/32 [==============================]-2s 59ms / step 29.276123046875
在训练和评估期间,我提供了完全相同的32张图片。我还使用的预测值计算了损失y_pred=model.predict(dat[0])
,然后使用numpy构造了均方误差。结果与我从评估中得到的结果相同(即29.276123 ...)。
有人建议这种行为可能是由于BatchNormalization
卷积基础中的层(有关github的讨论)。当然,BatchNormalization
我模型中的所有图层也都已设置layer.trainable=False
为。也许有人遇到了这个问题并想出了解决方案?
我正在使用一个包含 3000 多个图像的数据集进行迁移学习。这是代码的一部分:
import glob
import numpy as np
import os
import shutil
np.random.seed(42)
files = glob.glob('train/*')
cat_files = [fn for fn in files if 'cat' in fn]
dog_files = [fn for fn in files if 'dog' in fn]
len(cat_files), len(dog_files)
cat_train = np.random.choice(cat_files, size=1500, replace=False)
Run Code Online (Sandbox Code Playgroud) tflite_model = converter.convert()
tflite_model_file = 'converted_model.tflite'
with open(tflite_model_file, "wb") as f:
f.write(tflite_model)
Run Code Online (Sandbox Code Playgroud)
当我最终在 dot convert 方法中转换模型时,出现了一些错误。
错误信息:
ValueError: Failed to parse the model: /tensorflow-2.1.0/python3.6/tensorflow_core/lite/python/optimize/_tensorflow_lite_wrap_calibration_wrapper.so: undefined symbol: _ZTIN10tensorflow6DeviceE.
Run Code Online (Sandbox Code Playgroud)
源代码:
即使通过我没有找到什么是
_ZTIN10tensorflow6DeviceE
Run Code Online (Sandbox Code Playgroud)
如何转换迁移学习模型?
我正在使用 NuGet 包 Microsoft.ML (1.4.0) 和 SciSharp.TensorFlow.Redist (1.15.0)
初始训练和保存模型工作正常
var options = new Microsoft.ML.Vision.ImageClassificationTrainer.Options()
{
FeatureColumnName = "Image",
LabelColumnName = "LabelAsKey",
Arch = Microsoft.ML.Vision.ImageClassificationTrainer.Architecture.InceptionV3,
Epoch = 50,
BatchSize = 10,
LearningRate = 0.01f,
MetricsCallback = (metrics) => Console.WriteLine(metrics),
ValidationSet = testDataView
};
var pipeline = mlContext.MulticlassClassification.Trainers.ImageClassification(options)
.Append(mlContext.Transforms.Conversion.MapKeyToValue(
outputColumnName: "PredictedLabel",
inputColumnName: "PredictedLabel"));
ITransformer trainedModel = pipeline.Fit(trainDataView);
mlContext.Model.Save(trainedModel, trainDataView.Schema, "C:/Temp/model.zip")
Run Code Online (Sandbox Code Playgroud)
并使用模型进行预测工作正常
var loadModel = mlContext.Model.Load("C/Temp/Model.zip", out var modelInputSchema)
var PredictionEngine = mlContext.Model.CreatePredictionEngine<InMemoryImageData, ImagePrediction>(loadModel);
prediction = PredictionEngine.Predict(image);
Run Code Online (Sandbox Code Playgroud)
但是,如果我想继续用更多图像训练 model.zip 文件而不从头开始重新训练基线模型,我该怎么做?
有没有办法可以.Fit()
再次调用使用加载的模型?
我训练/微调了一个西班牙 RoBERTa模型,该模型最近针对除文本分类之外的各种 NLP 任务进行了预训练。
由于基线模型似乎很有前途,因此我想针对不同的任务对其进行微调:文本分类,更准确地说,是对西班牙语推文的情感分析,并用它来预测我所抓取的推文上的标签。
预处理和训练似乎工作正常。但是,我不知道之后如何使用这种模式进行预测。
我将省略预处理部分,因为我认为这似乎不存在问题。
# Training with native TensorFlow
from transformers import TFAutoModelForSequenceClassification
## Model Definition
model = TFAutoModelForSequenceClassification.from_pretrained("BSC-TeMU/roberta-base-bne", from_pt=True, num_labels=3)
## Model Compilation
optimizer = tf.keras.optimizers.Adam(learning_rate=5e-5)
loss = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
metric = tf.metrics.SparseCategoricalAccuracy()
model.compile(optimizer=optimizer,
loss=loss,
metrics=metric)
## Fitting the data
history = model.fit(train_dataset.shuffle(1000).batch(64), epochs=3, batch_size=64)
Run Code Online (Sandbox Code Playgroud)
/usr/local/lib/python3.7/dist-packages/transformers/configuration_utils.py:337: UserWarning: Passing `gradient_checkpointing` to a config initialization is deprecated and will be removed in v5 Transformers. Using `model.gradient_checkpointing_enable()` instead, or if you are using the `Trainer` API, …
Run Code Online (Sandbox Code Playgroud) nlp keras tensorflow transfer-learning huggingface-transformers