Search code examples
python-3.xtensorflowautoencoder

Input to reshape is a tensor with 788175 values, but the requested shape has 1050900


I am importing in some arrays of data to train on but tensorflow is outputting below error.

inp = open('train.csv',"rb")
X = pickle.load(inp)
X = X/255.0
X = np.array(X)
model = keras.Sequential([
    keras.layers.Flatten(input_shape=(113, 75, 3)),
    keras.layers.Dense(75, activation=tf.nn.relu),
    keras.layers.Dense(50, activation=tf.nn.relu),
    keras.layers.Dense(75, activation=tf.nn.relu),
    keras.layers.Dense(25425, activation=tf.nn.softmax),
    keras.layers.Reshape((113, 75, 4))
])
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])
model.fit(X, X, epochs=5)

I should be able to create an autoencoder but the program outputs this: Traceback (most recent call last):

File "C:\Users\dalto\Documents\geo4\train.py", line 24, in <module>
    model.fit(X, X, epochs=5)
  File "C:\Users\dalto\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow\python\keras\engine\training.py", line 643, in fit
    use_multiprocessing=use_multiprocessing)
  File "C:\Users\dalto\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow\python\keras\engine\training_arrays.py", line 664, in fit
    steps_name='steps_per_epoch')
  File "C:\Users\dalto\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow\python\keras\engine\training_arrays.py", line 383, in model_iteration
    batch_outs = f(ins_batch)
  File "C:\Users\dalto\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow\python\keras\backend.py", line 3510, in __call__
    outputs = self._graph_fn(*converted_inputs)
  File "C:\Users\dalto\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow\python\eager\function.py", line 572, in __call__
    return self._call_flat(args)
  File "C:\Users\dalto\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow\python\eager\function.py", line 671, in _call_flat
    outputs = self._inference_function.call(ctx, args)
  File "C:\Users\dalto\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow\python\eager\function.py", line 445, in call
    ctx=ctx)
  File "C:\Users\dalto\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow\python\eager\execute.py", line 67, in quick_execute
    six.raise_from(core._status_to_exception(e.code, message), None)
  File "<string>", line 3, in raise_from
tensorflow.python.framework.errors_impl.InvalidArgumentError:  Input to reshape is a tensor with 788175 values, but the requested shape has 1050900
     [[node reshape/Reshape (defined at C:\Users\dalto\Documents\geo4\train.py:24) ]] [Op:__inference_keras_scratch_graph_922]

Function call stack:
keras_scratch_graph

If I change the Reshape to (113, 75, 3) I get this it doesn't fix the error it just changes it:

Traceback (most recent call last):
  File "C:\Users\dalto\Documents\geo4\train.py", line 24, in <module>
    model.fit(X, X, epochs=5)
  File "C:\Users\dalto\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow\python\keras\engine\training.py", line 643, in fit
use_multiprocessing=use_multiprocessing)
  File "C:\Users\dalto\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow\python\keras\engine\training_arrays.py", line 664, in fit
steps_name='steps_per_epoch')
  File "C:\Users\dalto\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow\python\keras\engine\training_arrays.py", line 383, in model_iteration
    batch_outs = f(ins_batch)
  File "C:\Users\dalto\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow\python\keras\backend.py", line 3510, in __call__
outputs = self._graph_fn(*converted_inputs)
  File "C:\Users\dalto\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow\python\eager\function.py", line 572, in __call__
return self._call_flat(args)
  File "C:\Users\dalto\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow\python\eager\function.py", line 671, in _call_flat
outputs = self._inference_function.call(ctx, args)
  File "C:\Users\dalto\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow\python\eager\function.py", line 445, in call
ctx=ctx)
  File "C:\Users\dalto\AppData\Local\Programs\Python\Python37\lib\site-packages\tensorflow\python\eager\execute.py", line 67, in quick_execute
six.raise_from(core._status_to_exception(e.code, message), None)
  File "<string>", line 3, in raise_from
tensorflow.python.framework.errors_impl.InvalidArgumentError:  Incompatible 
shapes: [31,113,75] vs. [31,113,75,3]
 [[node metrics/accuracy/Equal (defined at 
C:\Users\dalto\Documents\geo4\train.py:24) ]] [Op:__inference_keras_scratch_graph_922]

Solution

  • The input and output size after reshape must be same. So, you'll have to use (113, 75, 3) instead of (113, 75, 4).

    Now, by using (113, 75, 3), you're getting the unequal error because you're using sparse_categorical_crossentropy as your loss function, you should instead use categorical_crossentropy.

    The basic difference between these is that sparse_categorical_crossentropy works when you have direct integers as your label, and categorical_crossentropy works when you have one-hot encoded labels.

    Corrected:

    inp = open('train.csv',"rb")
    X = pickle.load(inp)
    X = X/255.0
    X = np.array(X)
    model = keras.Sequential([
        keras.layers.Flatten(input_shape=(113, 75, 3)),
        keras.layers.Dense(75, activation=tf.nn.relu),
        keras.layers.Dense(50, activation=tf.nn.relu),
        keras.layers.Dense(75, activation=tf.nn.relu),
        keras.layers.Dense(25425, activation=tf.nn.softmax),
        keras.layers.Reshape((113, 75, 4))
    ])
    model.compile(optimizer='adam',
                  loss='categorical_crossentropy',
                  metrics=['accuracy'])
    model.fit(X, X, epochs=5)