privacy
privacy copied to clipboard
ValueError: Dimension size must be evenly divisible by 10 but is 1 for '{{node training/Reshape}} = Reshape[T=DT_FLOAT, Tshape=DT_INT32](loss/mul, training/Reshape/shape)' with input shapes: [], [2] and with input tensors computed as partial shapes: input[1] = [10,?]
Hello,
I am trying to train with differential privacy using tensorflow_privacy.DPKerasSGDOptimizer() here is my code
E = 1
B = 100
N = 2
dataset = pickle.load( open(path, "rb" ) )
data = deepcopy(dataset)
list_cli = list(dataset.keys())
for client in list_cli:
data[client]['x_train'] = dataset[client]['x_train'][:int((len(dataset[client]['x_train'])//batch_length)*batch_length)]
data[client]['y_train'] = dataset[client]['y_train'][:int((len(dataset[client]['y_train'])//batch_length)*batch_length)]
data[client]['x_test'] = dataset[client]['x_test'][:int((len(dataset[client]['x_test'])//B)*B)]
data[client]['y_test'] = dataset[client]['y_test'][:int((len(dataset[client]['y_test'])//B)*B)]
hparams = {'E' : E, 'B' : B, 'N' : N}
#DP parameters l2_norm_clip = 1.5 noise_multiplier = Noise num_microbatches = 10 learning_rate = 0.25
#DP optimizer dpsgd = tensorflow_privacy.DPKerasSGDOptimizer( l2_norm_clip=l2_norm_clip, noise_multiplier=noise_multiplier, num_microbatches=num_microbatches, learning_rate=learning_rate)
model.compile(optimizer=dpsgd, loss='categorical_crossentropy', metrics=['accuracy'])
model.fit(data[str(client)]['x_train'], data[str(client)]['y_train'], epochs=self.hparams['E'], batch_size=hparams['B'], validation_data=(data[str(client)]['x_test'], data[str(client)]['y_test']))
I get the following error :
ValueError: Dimension size must be evenly divisible by 10 but is 1 for '{{node training/Reshape}} = Reshape[T=DT_FLOAT, Tshape=DT_INT32](loss/mul, training/Reshape/shape)' with input shapes: [], [2] and with input tensors computed as partial shapes: input[1] = [10,?]
Note the when I use
model.compile(optimizer="Adam", loss='categorical_crossentropy', metrics=['accuracy'])
The code executes without errors.
Do you have any ideas ?
Thanks
Loss must have reduction = 'none'.
See this tutorial for instance
I am still having the same issue, moreover, my training accuracy is tucked around 10%. This issue seems to be solved by reducing both batch_size and num_microbatches from 128 to 10, but this doesn't make sense. My Tensorflow version is 2.7.0, and if I try to downgrade it to 2.4.0, as explained here, I receive the following error: ImportError: This version of TensorFlow Probability requires TensorFlow version >= 2.7; Detected an installation of version 2.4.0. Please upgrade TensorFlow to proceed.
Any idea?
`def cnn_model(input_shape):
model = tfk.models.Sequential()
model.add(tfkl.Conv2D(32, (3, 3), activation='relu', kernel_initializer='he_uniform', padding='same', input_shape=input_shape))
model.add(tfkl.BatchNormalization())
model.add(tfkl.Conv2D(32, (3, 3), activation='relu', kernel_initializer='he_uniform', padding='same'))
model.add(tfkl.BatchNormalization())
model.add(tfkl.MaxPooling2D((2, 2)))
model.add(tfkl.Dropout(0.2))
model.add(tfkl.Conv2D(64, (3, 3), activation='relu', kernel_initializer='he_uniform', padding='same'))
model.add(tfkl.BatchNormalization())
model.add(tfkl.Conv2D(64, (3, 3), activation='relu', kernel_initializer='he_uniform', padding='same'))
model.add(tfkl.BatchNormalization())
model.add(tfkl.MaxPooling2D((2, 2)))
model.add(tfkl.Dropout(0.3))
model.add(tfkl.Conv2D(128, (3, 3), activation='relu', kernel_initializer='he_uniform', padding='same'))
model.add(tfkl.BatchNormalization())
model.add(tfkl.Conv2D(128, (3, 3), activation='relu', kernel_initializer='he_uniform', padding='same'))
model.add(tfkl.BatchNormalization())
model.add(tfkl.MaxPooling2D((2, 2)))
model.add(tfkl.Dropout(0.4))
model.add(tfkl.Flatten())
model.add(tfkl.Dense(128, activation='relu', kernel_initializer='he_uniform'))
model.add(tfkl.BatchNormalization())
model.add(tfkl.Dropout(0.5))
model.add(tfkl.Dense(10))
optimizer = tensorflow_privacy.DPKerasSGDOptimizer(
l2_norm_clip=l2_norm_clip,
noise_multiplier=noise_multiplier,
num_microbatches=num_microbatches,
learning_rate=1e-3)
loss = tf.keras.losses.CategoricalCrossentropy(
from_logits=True, reduction=tf.losses.Reduction.NONE)
# Compile the model
model.compile(loss=loss, optimizer=optimizer, metrics='accuracy')
# Return the model
return model`
Epoch 1/48 703/704 [============================>.] - ETA: 0s - loss: 3.2236 - accuracy: 0.1047
InvalidArgumentError Traceback (most recent call last)
~tmp/ipykernel_11/233113371.py in
~usr/local/lib/python3.8/dist-packages/keras/utils/traceback_utils.py in error_handler(*args, **kwargs) 65 except Exception as e: # pylint: disable=broad-except 66 filtered_tb = _process_traceback_frames(e.traceback) ---> 67 raise e.with_traceback(filtered_tb) from None 68 finally: 69 del filtered_tb
~usr/local/lib/python3.8/dist-packages/tensorflow/python/eager/execute.py in quick_execute(op_name, num_outputs, inputs, attrs, ctx, name) 56 try: 57 ctx.ensure_initialized() ---> 58 tensors = pywrap_tfe.TFE_Py_Execute(ctx._handle, device_name, op_name, 59 inputs, attrs, num_outputs) 60 except core._NotOkStatusException as e:
InvalidArgumentError: 2 root error(s) found. (0) INVALID_ARGUMENT: Input to reshape is a tensor with 8 values, but the requested shape requires a multiple of 64 [[node Reshape (defined at /usr/local/lib/python3.8/dist-packages/tensorflow_privacy/privacy/optimizers/dp_optimizer_keras.py:155) ]] [[gradient_tape/sequential_6/dense_12/MatMul/MatMul/pfor/Shape/_54]] (1) INVALID_ARGUMENT: Input to reshape is a tensor with 8 values, but the requested shape requires a multiple of 64 [[node Reshape (defined at /usr/local/lib/python3.8/dist-packages/tensorflow_privacy/privacy/optimizers/dp_optimizer_keras.py:155) ]] 0 successful operations. 0 derived errors ignored. [Op:__inference_train_function_56208]
Errors may have originated from an input operation. Input Source operations connected to node Reshape: In[0] categorical_crossentropy/weighted_loss/Mul (defined at /usr/local/lib/python3.8/dist-packages/keras/utils/losses_utils.py:323) In[1] Reshape/shape:
Operation defined at: (most recent call last)
File "/usr/lib/python3.8/runpy.py", line 194, in _run_module_as_main return _run_code(code, main_globals, None,
File "/usr/lib/python3.8/runpy.py", line 87, in _run_code exec(code, run_globals)
File "/usr/local/lib/python3.8/dist-packages/ipykernel_launcher.py", line 16, in
app.launch_new_instance() File "/usr/local/lib/python3.8/dist-packages/traitlets/config/application.py", line 846, in launch_instance app.start()
File "/usr/local/lib/python3.8/dist-packages/ipykernel/kernelapp.py", line 677, in start self.io_loop.start()
File "/usr/local/lib/python3.8/dist-packages/tornado/platform/asyncio.py", line 199, in start self.asyncio_loop.run_forever()
File "/usr/lib/python3.8/asyncio/base_events.py", line 570, in run_forever self._run_once()
File "/usr/lib/python3.8/asyncio/base_events.py", line 1859, in _run_once handle._run()
File "/usr/lib/python3.8/asyncio/events.py", line 81, in _run self._context.run(self._callback, *self._args)
File "/usr/local/lib/python3.8/dist-packages/ipykernel/kernelbase.py", line 457, in dispatch_queue await self.process_one()
File "/usr/local/lib/python3.8/dist-packages/ipykernel/kernelbase.py", line 446, in process_one await dispatch(*args)
File "/usr/local/lib/python3.8/dist-packages/ipykernel/kernelbase.py", line 353, in dispatch_shell await result
File "/usr/local/lib/python3.8/dist-packages/ipykernel/kernelbase.py", line 648, in execute_request reply_content = await reply_content
File "/usr/local/lib/python3.8/dist-packages/ipykernel/ipkernel.py", line 353, in do_execute res = shell.run_cell(code, store_history=store_history, silent=silent)
File "/usr/local/lib/python3.8/dist-packages/ipykernel/zmqshell.py", line 532, in run_cell return super().run_cell(*args, **kwargs)
File "/usr/local/lib/python3.8/dist-packages/IPython/core/interactiveshell.py", line 2914, in run_cell result = self._run_cell(
File "/usr/local/lib/python3.8/dist-packages/IPython/core/interactiveshell.py", line 2960, in _run_cell return runner(coro)
File "/usr/local/lib/python3.8/dist-packages/IPython/core/async_helpers.py", line 78, in _pseudo_sync_runner coro.send(None)
File "/usr/local/lib/python3.8/dist-packages/IPython/core/interactiveshell.py", line 3185, in run_cell_async has_raised = await self.run_ast_nodes(code_ast.body, cell_name,
File "/usr/local/lib/python3.8/dist-packages/IPython/core/interactiveshell.py", line 3377, in run_ast_nodes if (await self.run_code(code, result, async_=asy)):
File "/usr/local/lib/python3.8/dist-packages/IPython/core/interactiveshell.py", line 3457, in run_code exec(code_obj, self.user_global_ns, self.user_ns)
File "/tmp/ipykernel_11/233113371.py", line 1, in
history = target_model.fit( File "/usr/local/lib/python3.8/dist-packages/keras/utils/traceback_utils.py", line 64, in error_handler return fn(*args, **kwargs)
File "/usr/local/lib/python3.8/dist-packages/keras/engine/training.py", line 1216, in fit tmp_logs = self.train_function(iterator)
File "/usr/local/lib/python3.8/dist-packages/keras/engine/training.py", line 878, in train_function return step_function(self, iterator)
File "/usr/local/lib/python3.8/dist-packages/keras/engine/training.py", line 867, in step_function outputs = model.distribute_strategy.run(run_step, args=(data,))
File "/usr/local/lib/python3.8/dist-packages/keras/engine/training.py", line 860, in run_step outputs = model.train_step(data)
File "/usr/local/lib/python3.8/dist-packages/keras/engine/training.py", line 816, in train_step self.optimizer.minimize(loss, self.trainable_variables, tape=tape)
File "/usr/local/lib/python3.8/dist-packages/keras/optimizer_v2/optimizer_v2.py", line 530, in minimize grads_and_vars = self._compute_gradients(
File "/usr/local/lib/python3.8/dist-packages/tensorflow_privacy/privacy/optimizers/dp_optimizer_keras.py", line 155, in _compute_gradients tf.reshape(loss, [num_microbatches, -1]), axis=1)
Input Source operations connected to node Reshape: In[0] categorical_crossentropy/weighted_loss/Mul (defined at /usr/local/lib/python3.8/dist-packages/keras/utils/losses_utils.py:323) In[1] Reshape/shape:
Operation defined at: (most recent call last)
File "/usr/lib/python3.8/runpy.py", line 194, in _run_module_as_main return _run_code(code, main_globals, None,
File "/usr/lib/python3.8/runpy.py", line 87, in _run_code exec(code, run_globals)
File "/usr/local/lib/python3.8/dist-packages/ipykernel_launcher.py", line 16, in
app.launch_new_instance() File "/usr/local/lib/python3.8/dist-packages/traitlets/config/application.py", line 846, in launch_instance app.start()
File "/usr/local/lib/python3.8/dist-packages/ipykernel/kernelapp.py", line 677, in start self.io_loop.start()
File "/usr/local/lib/python3.8/dist-packages/tornado/platform/asyncio.py", line 199, in start self.asyncio_loop.run_forever()
File "/usr/lib/python3.8/asyncio/base_events.py", line 570, in run_forever self._run_once()
File "/usr/lib/python3.8/asyncio/base_events.py", line 1859, in _run_once handle._run()
File "/usr/lib/python3.8/asyncio/events.py", line 81, in _run self._context.run(self._callback, *self._args)
File "/usr/local/lib/python3.8/dist-packages/ipykernel/kernelbase.py", line 457, in dispatch_queue await self.process_one()
File "/usr/local/lib/python3.8/dist-packages/ipykernel/kernelbase.py", line 446, in process_one await dispatch(*args)
File "/usr/local/lib/python3.8/dist-packages/ipykernel/kernelbase.py", line 353, in dispatch_shell await result
File "/usr/local/lib/python3.8/dist-packages/ipykernel/kernelbase.py", line 648, in execute_request reply_content = await reply_content
File "/usr/local/lib/python3.8/dist-packages/ipykernel/ipkernel.py", line 353, in do_execute res = shell.run_cell(code, store_history=store_history, silent=silent)
File "/usr/local/lib/python3.8/dist-packages/ipykernel/zmqshell.py", line 532, in run_cell return super().run_cell(*args, **kwargs)
File "/usr/local/lib/python3.8/dist-packages/IPython/core/interactiveshell.py", line 2914, in run_cell result = self._run_cell(
File "/usr/local/lib/python3.8/dist-packages/IPython/core/interactiveshell.py", line 2960, in _run_cell return runner(coro)
File "/usr/local/lib/python3.8/dist-packages/IPython/core/async_helpers.py", line 78, in _pseudo_sync_runner coro.send(None)
File "/usr/local/lib/python3.8/dist-packages/IPython/core/interactiveshell.py", line 3185, in run_cell_async has_raised = await self.run_ast_nodes(code_ast.body, cell_name,
File "/usr/local/lib/python3.8/dist-packages/IPython/core/interactiveshell.py", line 3377, in run_ast_nodes if (await self.run_code(code, result, async_=asy)):
File "/usr/local/lib/python3.8/dist-packages/IPython/core/interactiveshell.py", line 3457, in run_code exec(code_obj, self.user_global_ns, self.user_ns)
File "/tmp/ipykernel_11/233113371.py", line 1, in
history = target_model.fit( File "/usr/local/lib/python3.8/dist-packages/keras/utils/traceback_utils.py", line 64, in error_handler return fn(*args, **kwargs)
File "/usr/local/lib/python3.8/dist-packages/keras/engine/training.py", line 1216, in fit tmp_logs = self.train_function(iterator)
File "/usr/local/lib/python3.8/dist-packages/keras/engine/training.py", line 878, in train_function return step_function(self, iterator)
File "/usr/local/lib/python3.8/dist-packages/keras/engine/training.py", line 867, in step_function outputs = model.distribute_strategy.run(run_step, args=(data,))
File "/usr/local/lib/python3.8/dist-packages/keras/engine/training.py", line 860, in run_step outputs = model.train_step(data)
File "/usr/local/lib/python3.8/dist-packages/keras/engine/training.py", line 816, in train_step self.optimizer.minimize(loss, self.trainable_variables, tape=tape)
File "/usr/local/lib/python3.8/dist-packages/keras/optimizer_v2/optimizer_v2.py", line 530, in minimize grads_and_vars = self._compute_gradients(
File "/usr/local/lib/python3.8/dist-packages/tensorflow_privacy/privacy/optimizers/dp_optimizer_keras.py", line 155, in _compute_gradients tf.reshape(loss, [num_microbatches, -1]), axis=1)
Function call stack: train_function -> train_function
I also encountered this error and I figured it is happening because of regularization on dense/conv. layers.
I encountered the same error and to solve it, I had to combine the solutions from aqibsaeed and cgastaud.
- First, I removed the recurrent regularizer from my LSTM layer:
LSTM(units=100, return_sequences=True, recurrent_regularizer=l1(0.02))→LSTM(units=100, return_sequences=True) - I used
tf.keras.losses.BinaryCrossentropy()(y_true, y_pred)as part of my custom loss function. I added the argument as mentioned by @cgastaud:tf.keras.losses.BinaryCrossentropy(reduction='none')(y_true, y_pred)
Afterwards, the error is gone and training works as it should. I hope this helps people running into this issue in the future. :)