【问题标题】:Input to reshape is a tensor with 8434176 values, but the requested shape requires a multiple of 78400reshape 的输入是一个有 8434176 个值的张量,但请求的形状需要 78400 的倍数
【发布时间】:2021-12-31 09:35:32
【问题描述】:

我正在运行一个卷积神经网络来对猫和狗进行分类。这是我的代码。

import tensorflow as tf
from tensorflow.keras.optimizers import RMSprop
from tensorflow.keras.preprocessing.image import ImageDataGenerator
model = tf.keras.Sequential([
    tf.keras.layers.Conv2D(16, (3,3), activation='relu', input_shape=(300,300,3)),
    tf.keras.layers.MaxPooling2D(2,2),
    tf.keras.layers.Conv2D(32, (3,3), activation='relu'),
    tf.keras.layers.MaxPooling2D(2,2),
    tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
    tf.keras.layers.MaxPooling2D(2,2),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(512, activation='relu'),
    tf.keras.layers.Dense(1, activation='sigmoid')
])
model.compile(
    loss='binary_crossentropy',
    optimizer=RMSprop(lr=0.001)
)
train_datagen = ImageDataGenerator(rescale=1/255)

train_generator = train_datagen.flow_from_directory(
    'training_set',
    target_size=(150,150),
    batch_size=456,
    class_mode='binary'
)

validation_datagen = ImageDataGenerator(rescale=1/255)

validation_generator = validation_datagen.flow_from_directory(
    'test_set',
    target_size=(150,150),
    batch_size=456,
    class_mode='binary'
)
history = model.fit(
    train_generator,
    validation_data=validation_generator,
    epochs=15,
    steps_per_epoch=22,
    validation_steps=22,
    verbose=1
)

我正在使用来自 Kaggle 的“猫和狗”数据集:https://www.kaggle.com/tongpython/cat-and-dog。

当我尝试拟合模型时,(就是这部分:

history = model.fit(
    train_generator,
    validation_data=validation_generator,
    epochs=15,
    steps_per_epoch=22,
    validation_steps=22,
    verbose=1
)

),TensorFlow 会抛出这个错误:

InvalidArgumentError                      Traceback (most recent call last)
/var/folders/d_/gv1n_nvn2f99dqd7kf7vc3xw0000gn/T/ipykernel_2168/2235557206.py in <module>
----> 1 history = model.fit(
      2     train_generator,
      3     validation_data=validation_generator,
      4     epochs=15,
      5     steps_per_epoch=22,

~/miniforge3/envs/aiml/lib/python3.8/site-packages/tensorflow/python/keras/engine/training.py in fit(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, validation_batch_size, validation_freq, max_queue_size, workers, use_multiprocessing)
   1098                 _r=1):
   1099               callbacks.on_train_batch_begin(step)
-> 1100               tmp_logs = self.train_function(iterator)
   1101               if data_handler.should_sync:
   1102                 context.async_wait()

~/miniforge3/envs/aiml/lib/python3.8/site-packages/tensorflow/python/eager/def_function.py in __call__(self, *args, **kwds)
    826     tracing_count = self.experimental_get_tracing_count()
    827     with trace.Trace(self._name) as tm:
--> 828       result = self._call(*args, **kwds)
    829       compiler = "xla" if self._experimental_compile else "nonXla"
    830       new_tracing_count = self.experimental_get_tracing_count()

~/miniforge3/envs/aiml/lib/python3.8/site-packages/tensorflow/python/eager/def_function.py in _call(self, *args, **kwds)
    886         # Lifting succeeded, so variables are initialized and we can run the
    887         # stateless function.
--> 888         return self._stateless_fn(*args, **kwds)
    889     else:
    890       _, _, _, filtered_flat_args = \

~/miniforge3/envs/aiml/lib/python3.8/site-packages/tensorflow/python/eager/function.py in __call__(self, *args, **kwargs)
   2940       (graph_function,
   2941        filtered_flat_args) = self._maybe_define_function(args, kwargs)
-> 2942     return graph_function._call_flat(
   2943         filtered_flat_args, captured_inputs=graph_function.captured_inputs)  # pylint: disable=protected-access
   2944 

~/miniforge3/envs/aiml/lib/python3.8/site-packages/tensorflow/python/eager/function.py in _call_flat(self, args, captured_inputs, cancellation_manager)
   1916         and executing_eagerly):
   1917       # No tape is watching; skip to running the function.
-> 1918       return self._build_call_outputs(self._inference_function.call(
   1919           ctx, args, cancellation_manager=cancellation_manager))
   1920     forward_backward = self._select_forward_and_backward_functions(

~/miniforge3/envs/aiml/lib/python3.8/site-packages/tensorflow/python/eager/function.py in call(self, ctx, args, cancellation_manager)
    553       with _InterpolateFunctionError(self):
    554         if cancellation_manager is None:
--> 555           outputs = execute.execute(
    556               str(self.signature.name),
    557               num_outputs=self._num_outputs,

~/miniforge3/envs/aiml/lib/python3.8/site-packages/tensorflow/python/eager/execute.py in quick_execute(op_name, num_outputs, inputs, attrs, ctx, name)
     57   try:
     58     ctx.ensure_initialized()
---> 59     tensors = pywrap_tfe.TFE_Py_Execute(ctx._handle, device_name, op_name,
     60                                         inputs, attrs, num_outputs)
     61   except core._NotOkStatusException as e:

InvalidArgumentError:  Input to reshape is a tensor with 8434176 values, but the requested shape requires a multiple of 78400
     [[node sequential/flatten/Reshape (defined at var/folders/d_/gv1n_nvn2f99dqd7kf7vc3xw0000gn/T/ipykernel_2168/2235557206.py:1) ]]
     [[MLCSubgraphOp_0_0]] [Op:__inference_train_function_747]

Function call stack:
train_function.

我在 StackOverflow 上没有找到任何类似的资源。我不知道我做错了什么。

你能帮忙吗?

【问题讨论】:

    标签: python tensorflow keras neural-network conv-neural-network


    【解决方案1】:

    首先,您的模型具有input_shape=(300,300,3) 的输入形状,并且您正在将图像重塑为target_size=(150,150) 的形状。

    【讨论】:

    • 嗯...如果我在 Conv2D 图层中将颜色深度更改为 3,我会收到此错误:
    • AbortedError: [Derived] 计算:操作收到异常:计算:无法向前执行 MLCTrainingGraph。 [[节点顺序/conv2d/Conv2D(定义在用户/adithraghav/miniforge3/envs/aiml/lib/python3.8/site-packages/tensorflow/compiler/tf2mlcompute/ops/gen_mlc_ops.py:1592)]] [[MLCSubgraphOp_0_0 ]] [Op:__inference_train_function_793] 错误可能源于输入操作。连接到节点顺序/conv2d/Conv2D 的输入源操作:IteratorGetNext(定义在 var/folders/d_/gv1n_nvn2f99dqd7kf7vc3xw0000gn/T/ipykernel_3324/2920115125.py:1)
    • 在您的示例中颜色深度已经设置为 3,所以它应该可以工作,我检查了数据集是 RGB,我的错误(我会更改响应),这是一个有用的链接 [链接]kaggle.com/sangwookchn/convolutional-neural-networks-cnn-keras 用于使用相同数据集的笔记本
    • 没关系,这解决了问题,所以我没有抱怨!
    【解决方案2】:

    原来问题出在我定义 Sequential 模型的地方,也就是这部分:

    model = tf.keras.models.Sequential([
        tf.keras.layers.Conv2D(16, (3,3), activation='relu', input_shape=(300,300,3)),
        tf.keras.layers.MaxPooling2D(2,2),
        tf.keras.layers.Conv2D(32, (3,3), activation='relu'),
        tf.keras.layers.MaxPooling2D(2,2),
        tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
        tf.keras.layers.MaxPooling2D(2,2),
        tf.keras.layers.Flatten(),
        tf.keras.layers.Dense(512, activation='relu'),
        tf.keras.layers.Dense(1, activation='sigmoid')
    ])
    

    在第一个 Conv2D 层中,我将input_shape 设置为(300, 300, 3),但在生成器中,我将target_size 设置为(150,150)。看起来这两个必须对齐。

    所以,现在,我可以更改模型定义,也可以更改生成器。我选择做模特,因为这是我首先遇到的。所以,我的 Sequential 模型现在看起来像这样:

    model = tf.keras.models.Sequential([
        tf.keras.layers.Conv2D(16, (3,3), activation='relu', input_shape=(150, 150, 3)),
        tf.keras.layers.MaxPooling2D(2,2),
        tf.keras.layers.Conv2D(32, (3,3), activation='relu'),
        tf.keras.layers.MaxPooling2D(2,2),
        tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
        tf.keras.layers.MaxPooling2D(2,2),
        tf.keras.layers.Flatten(),
        tf.keras.layers.Dense(512, activation='relu'),
        tf.keras.layers.Dense(1, activation='sigmoid')
    ])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-30
      • 1970-01-01
      • 2018-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多