训练CNN模型图像分类期间的tensorflow NaN损失

     2023-03-27     182

关键词:

【中文标题】训练CNN模型图像分类期间的tensorflow NaN损失【英文标题】:tensorflow NaN loss during training CNN model image classification 【发布时间】:2018-08-03 00:26:15 【问题描述】:

我正在关注https://www.tensorflow.org/tutorials/layers 上的 CNN Mnist 教程,以完成我的个人图像分类任务。我的输入图像大小是 224 * 224 * 3 而不是教程中的 28 * 28,我只有 5 个类而不是 10 个。我阅读了有关此问题的以前的帖子,很多人指出要么学习率太大,要么使用cross_entropy_loss 可能是个问题,但我不确定这里是否是这种情况。

当我开始训练时,我立即得到这个 NaN 损失训练错误:

ERROR:tensorflow:Model diverged with loss = NaN.
Traceback (most recent call last):
File "cnn_model.py", line 75, in <module>
main(sys.argv[1], sys.argv[2])
File "cnn_model.py", line 68, in main
classifier.train(input_fn = train_input_fn, steps = 2000, hooks = [logging_hook])
File "C:\Users\sz\AppData\Local\Continuum\anaconda3\lib\site-packages\tensorflow\python\estimator\estimator.py", line 241, in train
loss = self._train_model(input_fn=input_fn, hooks=hooks)
File "C:\Users\sz\AppData\Local\Continuum\anaconda3\lib\site-packages\tensorflow\python\estimator\estimator.py", line 612, in _train_model
_, loss = mon_sess.run([estimator_spec.train_op, estimator_spec.loss])
File "C:\Users\sz\AppData\Local\Continuum\anaconda3\lib\site-packages\tensorflow\python\training\monitored_session.py", line 505, in run
run_metadata=run_metadata)
File "C:\Users\sz\AppData\Local\Continuum\anaconda3\lib\site-packages\tensorflow\python\training\monitored_session.py", line 842, in run
run_metadata=run_metadata)
File "C:\Users\sz\AppData\Local\Continuum\anaconda3\lib\site-packages\tensorflow\python\training\monitored_session.py", line 798, in run
return self._sess.run(*args, **kwargs)
File "C:\Users\sz\AppData\Local\Continuum\anaconda3\lib\site-packages\tensorflow\python\training\monitored_session.py", line 960, in run
run_metadata=run_metadata))
File "C:\Users\sz\AppData\Local\Continuum\anaconda3\lib\site-packages\tensorflow\python\training\basic_session_run_hooks.py", line 477, in after_run
raise NanLossDuringTrainingError 
tensorflow.python.training.basic_session_run_hooks.NanLossDuringTrainingError: NaN loss during training.

下面是型号代码:

import tensorflow as tf
from helper import load_data_and_label
import cv2
import sys
import math

def cnn_model_fn(features, labels, mode):
   #input layer
   input_layer = tf.reshape(features['x'], [-1, 224, 224, 3])
   #conv layer 1
   conv1 = tf.layers.conv2d(inputs = input_layer, filters = 32, kernel_size 
= [5,5], padding = 'same', activation = tf.nn.relu)
    #pooling layer 1
    pool1 = tf.layers.max_pooling2d(inputs = conv1, pool_size = [2,2], strides = 2)
    #conv2 and pool2 layers
    conv2 = tf.layers.conv2d(inputs = pool1, filters = 64, kernel_size = [5,5], padding = 'same', activation = tf.nn.relu)
    pool2 = tf.layers.max_pooling2d(inputs = conv2, pool_size = [2,2], strides = 2)
    #conv3 and pool3 layers
    conv3 = tf.layers.conv2d(inputs = pool2, filters = 64, kernel_size = [5,5], padding = 'same', activation = tf.nn.relu)
    pool3 = tf.layers.max_pooling2d(inputs = conv3, pool_size = [2,2], strides = 2)
    #conv4 and pool4 layers
    conv4 = tf.layers.conv2d(inputs = pool3, filters = 64, kernel_size = [5,5], padding = 'same', activation = tf.nn.relu)
    pool4 = tf.layers.max_pooling2d(inputs = conv4, pool_size = [2,2], strides = 2)
    #conv5 and pool5 layers
    conv5 = tf.layers.conv2d(inputs = pool4, filters = 64, kernel_size = [5,5], padding = 'same', activation = tf.nn.relu)
    pool5 = tf.layers.max_pooling2d(inputs = conv5, pool_size = [2,2], strides = 2)

    #dense layer
    pool5_flat = tf.reshape(pool5, [-1, 7 * 7 * 64])
    dense = tf.layers.dense(inputs = pool5_flat, units = 1024, activation = tf.nn.relu)
    dropout = tf.layers.dropout(inputs = dense, rate = 0.5, 
    training = mode == tf.estimator.ModeKeys.TRAIN)

    #logits layer
    logits = tf.layers.dense(inputs = dropout, units = 5)
    predictions = "classes":tf.argmax(input = logits, axis = 1),
                "prob": tf.nn.softmax(logits, name = 'softmax_tensor')

    if mode == tf.estimator.ModeKeys.PREDICT:
        return tf.estimator.EstimatorSpec(mode = mode, predictions = predictions)

    #calculate loss
    onehot_labels = tf.one_hot(indices = tf.cast(labels, tf.int32), depth = 5)
    loss = tf.losses.softmax_cross_entropy(onehot_labels = onehot_labels, logits = logits)

    #configure training operation
    if mode == tf.estimator.ModeKeys.TRAIN:
       optimizer = tf.train.GradientDescentOptimizer(learning_rate = 0.001)
       train_op = optimizer.minimize(loss = loss, global_step = tf.train.get_global_step())
       return tf.estimator.EstimatorSpec(mode = mode, loss = loss, train_op = train_op)

    #evaluation metrics
    eval_metrics_ops = "accuracy": tf.metrics.accuracy(labels = labels, predictions = predictions["classes"])
    return tf.estimator.EstimatorSpec(mode = mode, loss = loss, eval_metrics_ops = eval_metrics_ops)

def main(imagepath, labelpath):
    train_data, train_labels, eval_data, eval_labels = load_data_and_label(imagepath, labelpath)
    classifier = tf.estimator.Estimator(model_fn = cnn_model_fn, model_dir = "/tmp/retina_convnet_model")
    tensors_to_log = "prob": "softmax_tensor"
    logging_hook = tf.train.LoggingTensorHook(tensors = tensors_to_log, every_n_iter = 50)
    #train the model
    train_input_fn = tf.estimator.inputs.numpy_input_fn(x = "x":train_data, y = train_labels,
    batch_size = 32, num_epochs = None, shuffle = True)
    classifier.train(input_fn = train_input_fn, steps = 2000, hooks = [logging_hook])
    eval_input_fn = tf.estimator.inputs.numpy_input_fn(x = "x":eval_data, y = eval_labels, num_epochs = 1, shuffle = False)
    eval_results = classifier.evaluate(input_fn = eval_input_fn)
    print(eval_results)

if __name__ == "__main__":
    main(sys.argv[1], sys.argv[2])

非常感谢!任何帮助将不胜感激!

【问题讨论】:

【参考方案1】:

您是否对图像进行了预处理?如果没有,那么也许尝试标准化您的辅助函数中的图像,看看是否有帮助。

【讨论】:

使用 TensorFlow CNN 进行图像分类

】使用TensorFlowCNN进行图像分类【英文标题】:ImageclassificationwithTensorFlowCNN【发布时间】:2016-04-1903:38:39【问题描述】:我对使用CNN进行图像分类非常陌生,我遵循了谷歌CNN教程:https://www.tensorflow.org/tutorials/images/cnn这很有效,但... 查看详情

深度学习基于tensorflow的服装图像分类训练(数据集:fashion-mnist)(代码片段)

...习挑战赛目录前言了解Fashion-MNIST数据集下载数据集使用tensorflow下载(推荐)数据集分类数据集格式采用CPU训练还是GPU训练区别使用CPU训练使用GPU训练预处理最值归一化(normalization)升级图片维度显示部分图片建... 查看详情

如何在训练 CNN 期间删除重复项?

】如何在训练CNN期间删除重复项?【英文标题】:HowtoremoveduplicateitemsduringtrainingCNN?【发布时间】:2019-10-2701:57:41【问题描述】:我正在使用CNN解决图像分类问题。我有一个包含重复图像的图像数据集。当我用这些数据训练CNN时... 查看详情

如何在 Tensorflow 2 中的模型训练期间捕获任何异常

】如何在Tensorflow2中的模型训练期间捕获任何异常【英文标题】:HowtocatchanyExceptionduringModelTraininginTensorflow2【发布时间】:2020-02-2916:07:10【问题描述】:我正在使用Tensorflow训练一个Unet模型。如果我传递给模型进行训练的任何图... 查看详情

tensorflow1.0学习:用别人训练好的模型来进行图像分类

...来图像分类。下载地址:https://storage.googleapis.com/download.tensorflow.org/models/inception_dec_2015.zip下载完解压后,得到几个文件:其中的classify_image_graph_def.pb文件就是训练好的 查看详情

使用 cifar 100 的图像分类器,训练精度不增加

...ing【发布时间】:2019-06-1301:30:24【问题描述】:我试图在tensorflow中使用cifar100数据集训练图像分类器模型,但准确度没有增加超过1.2%。我搜索了这个问题并找到了几个解决方案,但我的模型仍然表现不佳。我实施了几个步骤,... 查看详情

基于tensorflow+opencv实现cnn自定义图像分类

摘要:本篇文章主要通过Tensorflow+Opencv实现CNN自定义图像分类案例,它能解决我们现实论文或实践中的图像分类问题,并与机器学习的图像分类算法进行对比实验。本文分享自华为云社区《​​Tensorflow+Opencv实现CNN自定义图像分... 查看详情

为 CNN 模型实现交叉验证

...我已经建立了我的CNN模型来对8个类别的图像进行分类。训练和测试步骤是通过随机拆分80%用于训练图像和20%用于测试图像来完成的,其中计算了Acuuracy和F-measure结果。我注意到,与我的测试结果相比,我的训练准确度结果略低(... 查看详情

基于tensorflow+opencv实现cnn自定义图像分类(代码片段)

摘要:本篇文章主要通过Tensorflow+Opencv实现CNN自定义图像分类案例,它能解决我们现实论文或实践中的图像分类问题,并与机器学习的图像分类算法进行对比实验。本文分享自华为云社区《Tensorflow+Opencv实现CNN自... 查看详情

在 Tensorflow 中训练期间的 GPU 使用率非常低

】在Tensorflow中训练期间的GPU使用率非常低【英文标题】:VerylowGPUusageduringtraininginTensorflow【发布时间】:2018-02-1904:01:09【问题描述】:我正在尝试为10类图像分类任务训练一个简单的多层感知器,这是Udacity深度学习课程作业的一... 查看详情

pytorch从头搭建并训练一个神经网络模型(图像分类cnn)(代码片段)

...函数(LossFunction)和优化器(Optimizer)4.训练神经网络5.测试模型结果6.嫌CPU太慢?换GPU训练并推测试试!0.前言之前用过一些很厉害的模型,图像分类领域的VGG16,目标检测领域的YoloV5,实例分... 查看详情

用于图像分类的 Keras CNN 模型不能很好地泛化

...生成了频谱图。每个频谱图的长度为8秒。我总共有9117个训练样本、1006个验证样本和2402 查看详情

为啥我的基于 Alexnet 的 CNN 分类失败?

...我的数据集由5类狗组成。我将50张狗的图像分成40张用于训练的图像和10张用于测试的图像。我已经基于AlexNet预训练模型训练了我的 查看详情

深度学习100例-卷积神经网络(cnn)服装图像分类|第3天(代码片段)

...语言环境:Python3.6.5编译器:jupyternotebook深度学习环境:TensorFlow2来自专栏:【深度学习100例】1.设置GPU如果使用的是CPU可以忽略这步importtensorflowastfgpus 查看详情

同一图像的分类给出不同的结果

...间】:2020-08-2115:23:09【问题描述】:我正在尝试使用带有Tensorflow的CNN对3D图像进行分类,但我认为有问题。在训练和验证之后,我使用保存的模型对单个图像进行分类。当我对这张图片进行分类时,每次尝试都会得到不同的结果... 查看详情

使用 keras 顺序模型获得较差的分类精度

...10-2208:04:27【问题描述】:我正在尝试使用keras序列模型和tensorflow构建一个cnn模型,以便将图像分为猫和狗两类。图片是从kaggle下载的。我将图像存储在csv文件中作为训练和测试数据库。问题是我得到了非常糟糕的准 查看详情

CNN 训练准确率在训练期间变得更好,但测试准确率保持在 40% 左右

...7-1316:12:17【问题描述】:所以在过去的几个月里,我通过Tensorflow和Keras学习了很多关于神经网络的知识,所以我想尝试为CIFAR10数据集制作模型(代码如下)。但是,在训 查看详情

训练期间接近 100% 的准确率,但在图像分类器的测试/验证期间 <50%

】训练期间接近100%的准确率,但在图像分类器的测试/验证期间<50%【英文标题】:Near100%accuracyduringtrainingbut<50%duringtesting/validationonimageclassifier【发布时间】:2019-12-1005:20:15【问题描述】:过去几天我一直在尝试训练我的模型... 查看详情