Vstup přetvořit je tenzor s 8434176 hodnoty, ale požadovaný tvar vyžaduje více o 78400

0

Otázka

Provádím konvoluční neuronové sítě pro klasifikaci kočky a psy. Tady je můj kód.

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
)

Jsem pomocí 'Cat a dog' dataset z Kaggle: https://www.kaggle.com/tongpython/cat-and-dog.

Když se snažím, aby se vešly model, (to je ta část:

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

), TensorFlow hází tuto chybu:

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.

Nenašel jsem žádné podobné zdroje na StackOverflow. Nevím, co dělám špatně.

Můžete mi pomoci?

2

Nejlepší odpověď

1

Za prvé váš model má vstupní tvar input_shape=(300,300,3) a přetvářejí obrázky na tvar target_size=(150,150).

2021-11-21 13:43:55

Hmm... mám-Li změnit barevnou hloubku až 3 v Conv2D vrstva, dostanu tuto chybu:
Robo

AbortedError: [Odvozená]Výpočet: Operace obdržela výjimku: Vypočtěte: Nelze spustit MLCTrainingGraph dopředu. [[uzel sekvenční/conv2d/Conv2D (definovanými v Users/adithraghav/miniforge3/envs/aiml/lib/python3.8/site-packages/tensorflow/compiler/tf2mlcompute/ops/gen_mlc_ops.py:1592) ]] [[MLCSubgraphOp_0_0]] [Op:__závěr_vlak_funkce_793] Chyby mohou mít původ od vstupní operace. Vstupní Zdroj operace připojen k uzlu sekvenční/conv2d/Conv2D: IteratorGetNext (definovanými v var/folders/d_/gv1n_nvn2f99dqd7kf7vc3xw0000gn/T/ipykernel_3324/2920115125.py:1)
Robo

barevná hloubka je již nastavena na 3 ve vašem příkladu, takže by to mělo fungovat, zkontroloval jsem dataset je RGB, moje chyba (budu měnit odpovědi), zde je užitečný odkaz [odkaz]kaggle.com/sangwookchn/convolutional-neural-networks-cnn-keras pro notebook používat stejné datové sady
Ghassen Sultana

Bez ohledu na to, tento problém vyřešil, takže já si nestěžuju!
Robo
0

Ukázalo se, že problém byl tam, kde jsem definoval Sequential model, který je v této části:

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')
])

V první Conv2D vrstva, jsem nastavit input_shape k (300, 300, 3), ale v generátor, nastavil jsem target_size být (150,150). Vypadá to, že tihle dva musí být v souladu.

Tak, teď, mohla jsem buď změnit model, definice nebo bych mohl změnit generátor. Vybral jsem si model, protože ten přišel do cesty jako první. Takže, můj Sekvenční model vypadá teď takhle:

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')
])
2021-11-21 13:26:40

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................