AttributeError: Tensor.op 在启用 Eager Execution 时毫无意义

Posted

技术标签:

【中文标题】AttributeError: Tensor.op 在启用 Eager Execution 时毫无意义【英文标题】:AttributeError: Tensor.op is meaningless when eager execution is enabled 【发布时间】:2020-09-21 11:27:30 【问题描述】:

我正在尝试从头开始实施 RESNET 50。累积所有层后,我调用tf.keras.Model。但是,它给出了一个错误:

为了测试,我输入了一个 4-D 张量。 conv_diff_sizeconv_same_size 是两个自定义块,具有 con2d 和批量标准化层。我在 Google Colab 上使用 TensorFlow 2.0。

def ResNet50(inputs, classes):
  X = tf.keras.layers.Conv2D(64, kernel_size = (7,7), strides=2, padding='valid', data_format='channels_last', input_shape = inputs.shape)(inputs)
  X = tf.keras.layers.BatchNormalization(axis=-1, momentum=0.9)(X)
  X = tf.keras.layers.MaxPool2D(pool_size=(3, 3), strides=2)(X)

  X = conv_diff_size(X, [64, 64, 256])
  X = conv_same_size(X, [64, 64, 256])
  X = conv_same_size(X, [64, 64, 256])
  
  X = conv_diff_size(X, [128, 128, 512])
  X = conv_same_size(X, [128, 128, 512])
  X = conv_same_size(X, [128, 128, 512])
  X = conv_same_size(X, [128, 128, 512])
  
  X = conv_diff_size(X, [256, 256, 1024])
  X = conv_same_size(X, [256, 256, 1024])
  X = conv_same_size(X, [256, 256, 1024])
  X = conv_same_size(X, [256, 256, 1024])
  X = conv_same_size(X, [256, 256, 1024])
  
  X = conv_diff_size(X, [512, 512, 2048])
  X = conv_same_size(X, [512, 512, 2048])
  X = conv_same_size(X, [512, 512, 2048])
  X = conv_same_size(X, [512, 512, 2048])
  X = conv_same_size(X, [512, 512, 2048])
  X = conv_same_size(X, [512, 512, 2048])
              
  X = tf.keras.layers.AveragePooling2D(pool_size=(2, 2), name = 'avg_pool')(X)
  X = tf.keras.layers.Flatten()(X)
  X = tf.keras.layers.Dense(classes, activation='relu')(X)
  
  model = tf.keras.Model(inputs=X, outputs = X)
  return model

【问题讨论】:

尝试更改您的模型定义:tf.keras.Model(inputs=inputs, outputs = X) ...我想您的自定义块也是正确的 它仍然给我同样的错误 我期待这个,但你的模型定义必须是 tf.keras.Model(inputs=inputs, outputs = X) 这会有什么不同?请告诉我 你找到答案了吗? 【参考方案1】:

如果您忘记先编译模型,有时会发生这种情况。在开始训练之前,请确保您正在运行 model.compile(...)

【讨论】:

【参考方案2】:

如果您在交互式 Python 环境中逐步测试您的脚本(例如,在编译或训练后更改层设计),请尝试删除所有变量并重新开始。

【讨论】:

【参考方案3】:

您的代码中的问题是您将 X 作为 输入 以及 输出

试试这个

import tensorflow as tf

def ResNet50(input_shape, classes):
  inputs = tf.keras.Input(shape=input_shape)#input_shape = (224,224,3)
  X = tf.keras.layers.Conv2D(64, kernel_size = (7,7), strides=2, padding='valid', data_format='channels_last', input_shape = inputs.shape)(inputs)
  X = tf.keras.layers.BatchNormalization(axis=-1, momentum=0.9)(X)
  X = tf.keras.layers.MaxPool2D(pool_size=(3, 3), strides=2)(X)

  X = conv_diff_size(X, [64, 64, 256])
  X = conv_same_size(X, [64, 64, 256])
  X = conv_same_size(X, [64, 64, 256])

  X = conv_diff_size(X, [128, 128, 512])
  X = conv_same_size(X, [128, 128, 512])
  X = conv_same_size(X, [128, 128, 512])
  X = conv_same_size(X, [128, 128, 512])

  X = conv_diff_size(X, [256, 256, 1024])
  X = conv_same_size(X, [256, 256, 1024])
  X = conv_same_size(X, [256, 256, 1024])
  X = conv_same_size(X, [256, 256, 1024])
  X = conv_same_size(X, [256, 256, 1024])

  X = conv_diff_size(X, [512, 512, 2048])
  X = conv_same_size(X, [512, 512, 2048])
  X = conv_same_size(X, [512, 512, 2048])
  X = conv_same_size(X, [512, 512, 2048])
  X = conv_same_size(X, [512, 512, 2048])
  X = conv_same_size(X, [512, 512, 2048])
            
  X = tf.keras.layers.AveragePooling2D(pool_size=(2, 2), name = 'avg_pool')(X)
  X = tf.keras.layers.Flatten()(X)
  out = tf.keras.layers.Dense(classes, activation='relu')(X)

  model = tf.keras.Model(inputs=inputs, outputs = out)
  return model

我添加了一个输入张量层并将其分配给变量inputs,最后一层分配给变量out

【讨论】:

以上是关于AttributeError: Tensor.op 在启用 Eager Execution 时毫无意义的主要内容,如果未能解决你的问题,请参考以下文章

初学者 Python:AttributeError:'list' 对象没有属性

AttributeError:“字节”对象没有属性“告诉”

AttributeError: 'RDD' 对象没有属性 'show'

AttributeError:“NumpyArrayIterator”对象没有属性“类”

AttributeError:模块 'dbus' 没有属性 'lowlevel'

AttributeError:模块'keras'没有属性'initializers'