当前位置: 首页 > 知识库问答 >
问题:

TensorFlow估计器中的图形错误(ValueError:张量(...)必须来自与张量(...)相同的图形)

邵华皓
2023-03-14

更新:在我的个人电脑和谷歌云上测试相同的代码,使用tenstorflow gpu 1.13.1工作。

使用TensorFlow估计器和运行train_and_evaluate给我以下错误消息:

"ValueError: Tensor("Const: 0",form=(3,),dtype=Float32)必须来自与Tensor("ParallelMapDataset: 0",form=(),dtype=变体,设备=/设备:CPU: 0)相同的图形。"(请参阅底部附近的完整错误输出)

这种情况发生在使用GPU(GeForge RTX 2070)在我的PC上训练CNN时。我正在使用Python 3.7和tensorflow gpu/tensorflow 1.14。0,Keras 2.2。4、在康达环境中运行。

它发生在以下日志消息“…将2716的检查点保存到C:/EstimatorOutput/10/model.ckpt”之后并且在处理评估步骤的输入函数时显示为。

这段代码,就像现在一样,以前运行时没有问题,但由于我不清楚的原因,它突然改变了。

我在Google Cloud上运行了类似的代码(以前也运行得很好),同样的问题也出现了(请参见底部附近的错误输出;在GPU(基本GPU)上运行;TensorFlow 1.14;Keras 2.2.4)

错误似乎与由于某种原因创建图形时的计算步骤有关,新图形不兼容。

这是我的密码-

我的任务模块:

import tensorflow as tf
from train_model import model #("train_model" is local folder)
from train_model.model import create_estimator 

if __name__ == '__main__':

    model_num = 10

    # Throw properties into params dict to pass to other functions
    params = {}
    params['train csv'] = "train_set_local.csv"
    params['eval csv'] = "eval_set_local.csv"
    params['output path'] = "C:/EstimatorOutput/" + str(model_num) + "/"
    params['data path'] = "C:/Databases/Birds_dB/Images"
    params['image size'] = [244, 224]
    params["batch size"] = 16*2
    params['use random flip'] = True
    params['learning rate'] = 0.000001  
    params['dropout rate'] = 0.50
    params['num classes'] = 123
    params['train steps'] = 65000
    params['eval steps'] = 20
    params['eval_throttle_secs'] = 600
    params['num parallel calls'] = 4

    # Run the training job
    model.go_train(params) # (See "go_train" below in model script ->)

我的模型模块

import tensorflow as tf
from tensorflow.python.keras import estimator as kes
from tensorflow.python.keras.applications.vgg16 import VGG16
from tensorflow.python.keras.models import Model
from tensorflow.python.keras.layers import Dropout, Flatten, Dense
from train_model.input_fn import make_input_fn


def create_estimator(params):
    # Import VGG16 model for transfer learning
    base_model = VGG16(weights='imagenet')
    base_model.summary()

    x = base_model.get_layer('fc2').output

    x = Dropout(params['dropout rate'])(x)

    predictions = Dense(params['num classes'], activation="sigmoid", name="sm_out")(x)

    model = Model(inputs=base_model.input, outputs=predictions)

    for layer in model.layers:
        layer.trainable = True

    model.compile(
        loss="binary_crossentropy",
        optimizer=tf.train.AdamOptimizer(params['learning rate'],
                                         beta1=0.9,
                                         beta2=0.999),
        metrics=["categorical_accuracy"]
    )



    config = tf.ConfigProto()
    config.gpu_options.allow_growth = True
    config.gpu_options.per_process_gpu_memory_fraction = 0.95
    run_config = tf.estimator.RunConfig(
            session_config=config,
            model_dir=params['output path']
    )

    # Convert to Estimator
    estimator_model = kes.model_to_estimator(
        keras_model=model,
        config=run_config
    )

    return estimator_model


def go_train(params):
    # Create the estimator
    Est = create_estimator(params)

    # Set up Estimator train and evaluation specifications
    train_spec = tf.estimator.TrainSpec(
        input_fn=make_input_fn(params['train csv'], tf.estimator.ModeKeys.TRAIN, params, augment=True),
        max_steps=params['train steps']
    )
    eval_spec = tf.estimator.EvalSpec(
        input_fn=make_input_fn(params['eval csv'], tf.estimator.ModeKeys.EVAL, params, augment=True),
        steps=params['eval steps'],  # Evaluates on "eval steps" batches
        throttle_secs=params['eval_throttle_secs']
    )


    # Run training and evaluation
    tf.estimator.train_and_evaluate(Est, train_spec, eval_spec)

我的输入模块:

import tensorflow as tf
from keras.applications.vgg16 import preprocess_input

tf.logging.set_verbosity(v=tf.logging.INFO)

HEIGHT = 224
WIDTH = 224
NUM_CHANNELS = 3
NCLASSES = 123


def read_and_preprocess_with_augment(image_bytes, label=None):
    return read_and_preprocess(image_bytes, label, augment=True)


def read_and_preprocess(image_bytes, label=None, augment=False):

    image = tf.image.decode_jpeg(contents=image_bytes, channels=NUM_CHANNELS)
    image = tf.image.convert_image_dtype(image=image, dtype=tf.float32)  # 0-1
    image = tf.expand_dims(input=image, axis=0)  # resize_bilinear needs batches

    if augment:

        # Resize to slightly larger than target size
        image = tf.image.resize_bilinear(images=image, size=[HEIGHT + 50, WIDTH + 50], align_corners=False)

        # Image random rotation
        degree_angle = tf.random.uniform((), minval=-25, maxval=25, dtype=tf.dtypes.float32)
        radian = degree_angle * 3.14 / 180
        image = tf.contrib.image.rotate(image, radian, interpolation='NEAREST')

        # remove batch dimension
        image = tf.squeeze(input=image, axis=0)

        # Random Crop
        image = tf.random_crop(value=image, size=[HEIGHT, WIDTH, NUM_CHANNELS])
        # Random L-R flip
        image = tf.image.random_flip_left_right(image=image)
        # Random brightness
        image = tf.image.random_brightness(image=image, max_delta=63.0 / 255.0)
        # Random contrast
        image = tf.image.random_contrast(image=image, lower=0.2, upper=1.8)

    else:
        image = tf.image.resize_bilinear(images=image, size=[HEIGHT, WIDTH], align_corners=False)
        image = tf.squeeze(input=image, axis=0)  # remove batch dimension

    image = tf.cast(tf.round(image * 255), tf.int32)
    image = preprocess_input(image)

    label = tf.one_hot(tf.strings.to_number(label, out_type=tf.int32), depth=NCLASSES)

    return {"input_1": image}, label


def make_input_fn(csv_of_filenames, mode, params, augment=False):
    def _input_fn():
        def decode_csv(csv_row):
            filename, label = tf.decode_csv(records=csv_row, record_defaults=[[""], [""]])
            image_bytes = tf.read_file(filename=filename)
            return image_bytes, label

        # Create tf.data.dataset from filename
        dataset = tf.data.TextLineDataset(filenames=csv_of_filenames).map(map_func=decode_csv, num_parallel_calls=params['num parallel calls'])

        if augment:
            dataset = dataset.map(map_func=read_and_preprocess_with_augment, num_parallel_calls=params['num parallel calls'])
        else:
            dataset = dataset.map(map_func=read_and_preprocess, num_parallel_calls=params['num parallel calls'])

        if mode == tf.estimator.ModeKeys.TRAIN:
            num_epochs = None  
            dataset = dataset.shuffle(buffer_size=10*params["batch size"])
        else:
            num_epochs = 1  

        dataset = dataset.repeat(count=num_epochs).batch(batch_size=params["batch size"]).prefetch(4)
        images, labels = dataset.make_one_shot_iterator().get_next()

        return images, labels
    return _input_fn

PC上的错误输出

如上所述,在我的GPU上本地运行时,上述代码的结果是以下一系列错误消息(缩写):

将2716的检查点保存到。。。文件“C:…\estimator.py”,第501行,在“自我评估”中_评估\构建\图(输入\ fn、挂钩、检查点\路径))

文件"C:...\estimator.py",第1501行,_evaluate_build_graph。_call_model_fn_eval(input_fn,self.config))

文件“C:…\estimator.py”,第1534行,在模式键的调用模式评估输入中。评估)

文件"C:...\estimator.py",第1022行,_get_features_and_labels_from_input_fn。_call_input_fn(input_fn,模式))

文件“C:…\estimator.py”,第1113行,在调用输入返回输入中(**kwargs)

文件“C:…\input\u fn.py”,第71行,在_input\u fn dataset=dataset中。map(map_func=read_和preprocess_,带有_augment,num_parallel_calls=params['num parallel calls']))

文件"C:...dataset_ops.py",第1776行,在地图自我,map_func,num_parallel_calls,preserve_cardinality=假))

文件“C:…\dataset_ops.py”,第3239行,在init**flat_结构中(self))

文件“C:…\gen_dataset_ops.py”,第4179行,并行_map_dataset name=name)

文件“C:…\op_def_library.py”,第366行,在_apply_op_helper g=ops中_从\u输入获取\u图形\u(\u展平(keywords.values()))

文件“C:…\ops.py”,第6135行,在从输入获取图形,断言相同图形(原始图形元素,图形元素)中

文件“C:…ops.py”,第6071行,在相同的图表(项目,原始项目)中

ValueError:Tensor(“Const:0”,shape=(3,),dtype=float32)必须来自与Tensor相同的图形(“ParallelMapDataset:0”,shape=(),dtype=variant,device=/device:CPU:0”)。

Google Cloud上的错误输出

服务副本主机0已退出,非零状态为1。回溯(最近一次呼叫最后一次):[…]

文件“/usr/local/lib/python3.5/dist packages/tensorflow\u estimator/python/estimator/estimator.py”,第1534行,在ModeKeys的调用模型评估输入中。评估)

文件“/usr/local/lib/python3.5/dist packages/tensorflow\u estimator/python/estimator/estimator.py”,第1022行,在“获取特征”和“自输入”的“标签”中_调用输入(输入,模式))

文件"/usr/local/lib/python3.5/dist-包/tensorflow_estimator/python/估计器/estimator.py",第1113行,_call_input_fn返回input_fn(**kwargs)

file"/root/. local/lib/python3.5/site-pack/train_model/input_fn.py",第87行,_input_fn数据集=dataset.map(map_func=read_and_preprocess_with_augment,num_parallel_calls=params['num并行调用'])

file"/usr/local/lib/python3.5/dist-包/tenstorflow/python/data/ops/dataset_ops.py",第1776行,在地图自我,map_func,num_parallel_calls,preserve_cardinality=假))

文件“/usr/local/lib/python3.5/dist-packages/tensorflow/python/data/ops/dataset_-ops.py”,第3239行,在init**flat_-structure(self))文件中“/usr/local/lib/python3.5/dist-packages/tensorflow/python/ops/gen_-dataset_-ops.py”,第4179行,并行_-map_-dataset name=name)文件“/usr/local/lib/python3。5/dist包/tensorflow/python/framework/op_def_库。py”,第366行,在_apply_op_helper g=ops中。_从_输入获取_图形(_flatte(keywords.values()))

文件"/usr/local/lib/python3.5/dist-包/tenstorflow/python/框架/ops.py",第6135行,_get_graph_from_inputs_assert_same_graph(original_graph_element,graph_element)

文件“/usr/local/lib/python3.5/dist packages/tensorflow/python/framework/ops.py”,第6071行,在相同的图表(项目,原始项目)中

ValueError:Tensor(“Const_1:0”,shape=(3,),dtype=float32,device=/device:CPU:0)必须来自与Tensor(“ParallelMapDataset:0”,shape=(),dtype=variant,device=/device:CPU:0”)相同的图形。

任何帮助/提示都非常感谢。我卡在这一点,不知道如何调试这个!

共有1个答案

阎弘
2023-03-14

使用此预处理函数:

from tensorflow.keras.applications.mobilenet import preprocess_input

它具有与VGGs预处理输入相同的功能。

 类似资料:
  • 问题内容: Tensorflow中的图形对象具有一种称为“ get_tensor_by_name(name)”的方法。反正有没有得到有效张量名称的列表? 如果不是,那么有人从这里知道预训练模型inception-v3的有效名称吗?从他们的示例pool_3开始,它是一个有效的张量,但是所有这些列表都很好。我看了一下所提到的文件,其中一些层似乎与表1中的大小相对应,但并非全部。 问题答案: 本文没有准

  • 问题内容: 我在Keras的最后一层中使用一些tensorflow函数(reduce_sum和l2_normalize)构建模型,而遇到此问题。我一直在寻找解决方案,但所有解决方案都与“ Keras张量”有关。 这是我的代码: 然后是错误: ValueError:模型的输出张量必须是TensorFlow的输出(因此保留过去的层元数据)。找到:Tensor(“ l2_normalize_3:0”,s

  • 问题内容: 我正在使用和创建神经网络;由于某种原因,我想获得某种内在的张量的值给定的输入,所以我使用的,作为一个。 但是,我发现很难找到张量名称的正确语法,即使知道它的名称也很困难(而且我对操作和张量感到困惑),因此我使用张量板绘制图形并寻找名称。 有没有一种方法可以在不使用张量板的情况下枚举图中的所有张量? 问题答案: 你可以做 另外,如果您要在IPython笔记本中进行原型制作,则可以直接在笔

  • 问题内容: 我定义这样的张量: 但是当我尝试打印张量的形状时: 我得到 Tensor(“ Shape:0”,shape =(1,),dtype = int32) ,为什么输出结果不应为shape =(100) 问题答案: tf.shape(input,name = None) 返回表示输入形状的一维整数张量。 你要找的:它返回的的变量。

  • 使用GoogleApps脚本,我试图用一张工作表中的数据自动填充多张工作表。 我使用两个电子表格,“主”电子表格包含需要自动填充到另一个电子表格中的数据。 另一个电子表格包含模板表,根据“主”表中的条目数量,模板表被重复多次,这是数据需要去的地方。 到目前为止,我已经设法复制了基于主模板的工作表的数量,并在之后删除它们(见代码),但是我找不到任何关于如何自动填充这些工作表的信息。模板根据列中的公司

  • 本文向大家介绍tensorflow多维张量计算实例,包括了tensorflow多维张量计算实例的使用技巧和注意事项,需要的朋友参考一下 两个三维矩阵的乘法怎样计算呢?我通过实验发现,tensorflow把前面的维度当成是batch,对最后两维进行普通的矩阵乘法。也就是说,最后两维之前的维度,都需要相同。 首先计算shape为(2, 2, 3)乘以shape为(2, 3, 2)的张量。 运行结果: