Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 训练神经网络会降低精度_Python_Tensorflow_Machine Learning_Neural Network_Object Detection Api - Fatal编程技术网

Python 训练神经网络会降低精度

Python 训练神经网络会降低精度,python,tensorflow,machine-learning,neural-network,object-detection-api,Python,Tensorflow,Machine Learning,Neural Network,Object Detection Api,我的最终目标是获得一个神经网络模型,该模型将查看实时视频,并识别一个人是否手持刀子或其他器具,如叉子或勺子。我尝试了在COCO数据集上预训练的两个模型,并意识到像faster_RCNN这样的模型具有难以置信的高精度,但它们无法处理实时视频源,因为每次预测都需要几秒钟的时间。另一方面,像SSD_mobilenet这样的机型在实时视频方面表现非常出色,但在银器方面的准确度要低得多 正因为如此,我想对mobilenet模型进行再培训,以提高刀具的精度,所以我创建了COCO数据集的一个子集,其中只包含刀

我的最终目标是获得一个神经网络模型,该模型将查看实时视频,并识别一个人是否手持刀子或其他器具,如叉子或勺子。我尝试了在COCO数据集上预训练的两个模型,并意识到像faster_RCNN这样的模型具有难以置信的高精度,但它们无法处理实时视频源,因为每次预测都需要几秒钟的时间。另一方面,像SSD_mobilenet这样的机型在实时视频方面表现非常出色,但在银器方面的准确度要低得多

正因为如此,我想对mobilenet模型进行再培训,以提高刀具的精度,所以我创建了COCO数据集的一个子集,其中只包含刀具。我使用了以下来自tensorflow再培训模型教程的代码:

import itertools
import os
import matplotlib.pylab as plt
import numpy as np
import tensorflow as tf
import tensorflow_hub as hub

print("TF version:", tf.__version__)
print("Hub version:", hub.__version__)
print("GPU is", "available" if tf.test.is_gpu_available() else "NOT AVAILABLE")

module_selection = ("mobilenet_v2_100_224", 224) 
handle_base, pixels = module_selection
MODULE_HANDLE ="https://tfhub.dev/google/imagenet/{}/feature_vector/4".format(handle_base)
IMAGE_SIZE = (pixels, pixels)
print("Using {} with input size {}".format(MODULE_HANDLE, IMAGE_SIZE))

BATCH_SIZE = 32

data_dir = 'coco/knife_dataset2014'

datagen_kwargs = dict(rescale=1./255, validation_split=.20)
dataflow_kwargs = dict(target_size=IMAGE_SIZE, batch_size=BATCH_SIZE,
                   interpolation="bilinear")

valid_datagen = tf.keras.preprocessing.image.ImageDataGenerator(
    **datagen_kwargs)
valid_generator = valid_datagen.flow_from_directory(
    'coco/knife_dataset2014/val', subset="validation", shuffle=False, **dataflow_kwargs)

do_data_augmentation = False 
if do_data_augmentation:
  train_datagen = tf.keras.preprocessing.image.ImageDataGenerator(
      rotation_range=40,
      horizontal_flip=True,
      width_shift_range=0.2, height_shift_range=0.2,
      shear_range=0.2, zoom_range=0.2,
      **datagen_kwargs)
else:
  train_datagen = valid_datagen
train_generator = train_datagen.flow_from_directory(
    'coco/knife_dataset2014/train', subset="training", shuffle=True, **dataflow_kwargs)

do_fine_tuning = False 

print("Building model with", MODULE_HANDLE)
model = tf.keras.Sequential([
    # Explicitly define the input shape so the model can be properly
    # loaded by the TFLiteConverter
    tf.keras.layers.InputLayer(input_shape=IMAGE_SIZE + (3,)),
    hub.KerasLayer(MODULE_HANDLE, trainable=do_fine_tuning),
    tf.keras.layers.Dropout(rate=0.2),
    tf.keras.layers.Dense(train_generator.num_classes,
                          kernel_regularizer=tf.keras.regularizers.l2(0.0001))
])
model.build((None,)+IMAGE_SIZE+(3,))
model.summary()

model.compile(
  optimizer=tf.keras.optimizers.SGD(lr=0.005, momentum=0.9), 
  loss=tf.keras.losses.CategoricalCrossentropy(from_logits=True, label_smoothing=0.1),
  metrics=['accuracy'])

steps_per_epoch = train_generator.samples // train_generator.batch_size
validation_steps = valid_generator.samples // valid_generator.batch_size
hist = model.fit(
    train_generator,
    epochs=2, steps_per_epoch=steps_per_epoch,
    validation_data=valid_generator,
    validation_steps=validation_steps).history

saved_model_path = "saved_knife_model"
tf.saved_model.save(model, saved_model_path)
当我运行它时,它会打印:

GPU is NOT AVAILABLE
Using https://tfhub.dev/google/imagenet/mobilenet_v2_100_224/feature_vector/4 with input size (224, 224)
Found 50 images belonging to 1 classes.
Found 2956 images belonging to 1 classes.
Building model with https://tfhub.dev/google/imagenet/mobilenet_v2_100_224/feature_vector/4
Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
keras_layer (KerasLayer)     (None, 1280)              2257984   
_________________________________________________________________
dropout (Dropout)            (None, 1280)              0         
_________________________________________________________________
dense (Dense)                (None, 1)                 1281      
=================================================================
Total params: 2,259,265
Trainable params: 1,281
Non-trainable params: 2,257,984

然后,随着训练的进行,它的准确度会不断降低。经过训练的模型的精度似乎每次都以不同的精度开始(有时为0.6,有时为0.2),并且大部分随着每个历元而下降。最近的一次测试的准确度从0.26开始,到第100纪元时降到了0.22。有人知道这里发生了什么吗?

如果你的损失随着训练而减少,但你的准确度也在下降,那么模型很可能与训练数据拟合过度,因此验证数据的准确度会降低(只要你的训练数据和验证数据是分开的,它们看起来应该是分开的)

这是一篇关于如何midigate这种效果的好文章(只需跳到第6部分了解如何防止它)


如果您使用您所说的预训练快速RCNN模型,该模型准确但速度较慢,您可以尝试在GPU上使用该模型计算预测,这可能使其足够快,可以使用。

培训/评估损失如何?它们在下降吗?损失从1.9112e-04上升到1.5595e-04,val_损失约为same@user3150635也许您需要提供部分数据集,或者几乎不可能知道模型为什么不工作。@meTchaikovsky如何提供部分数据集?我应该只发布一张照片吗?这有什么帮助?你需要监控训练和考试成绩/损失。第一步是确保您的模型能够过度拟合:删除所有正则化和退出,并确保您的训练分数可以非常高。接下来,如果需要,添加正则化以删除过拟合。另外,您应该尝试使用Adam optimizer,因为它不像SGD那样依赖于它的参数。