Skip to content

Fails to train a Keras non-sequential model with DP optimizer #40

@psitronic

Description

@psitronic

For a non-sequential model if number of examples is not a multiple of number of microbatches (see the data file below) the training with DPAdamOptimizer fails.

Numpy 1.14.4
Tensorflow 1.13.1

Error:

 6/13 [============>.................] - ETA: 0s - loss: 6.5262Traceback (most recent call last):
  File "/home/andrey/Documents/experiments/dp.py", line 114, in <module>
    epochs=epochs)
  File "/home/andrey/.local/lib/python3.6/site-packages/tensorflow/python/keras/engine/training.py", line 880, in fit
    validation_steps=validation_steps)
  File "/home/andrey/.local/lib/python3.6/site-packages/tensorflow/python/keras/engine/training_arrays.py", line 329, in model_iteration
    batch_outs = f(ins_batch)
  File "/home/andrey/.local/lib/python3.6/site-packages/tensorflow/python/keras/backend.py", line 3076, in __call__
    run_metadata=self.run_metadata)
  File "/home/andrey/.local/lib/python3.6/site-packages/tensorflow/python/client/session.py", line 1439, in __call__
    run_metadata_ptr)
  File "/home/andrey/.local/lib/python3.6/site-packages/tensorflow/python/framework/errors_impl.py", line 528, in __exit__
    c_api.TF_GetCode(self.status.status))
tensorflow.python.framework.errors_impl.InvalidArgumentError: Input to reshape is a tensor with 1 values, but the requested shape requires a multiple of 3
	 [[{{node training/TFOptimizer/Reshape}}]]
         [[{{node loss/mul}}]]

Code:

import tensorflow as tf
from tensorflow.keras import losses
from privacy.optimizers.dp_optimizer import DPAdamOptimizer
from privacy.optimizers.gaussian_query import GaussianAverageQuery

batch_size = 6
microbatches = 3

noise_multiplier = 1.1
l2_norm_clip = 1.0
epochs = 30

names = pd.read_csv('names.csv', delimiter=',')
names = names['ch1'].values
names.shape = names.shape + (1,)

my_input = tf.keras.layers.Input(shape=(1,))
my_dense = tf.keras.layers.Dense(7)(my_input)
model = tf.keras.Model(my_input, my_dense)

dp_average_query = GaussianAverageQuery(l2_norm_clip, l2_norm_clip * noise_multiplier,        microbatches)

optimizer = DPAdamOptimizer(dp_average_query,microbatches,learning_rate=learning_rate,    unroll_microbatches=True)

loss = losses.CategoricalCrossentropy(from_logits=False, reduction=tf.losses.Reduction.NONE)

model.fit(x=names,y=names,batch_size=batch_size,epochs=epochs)

Dataset - names.csv:

id,ch1
1,1
2,3
3,4
4,1
5,2
6,3
7,3
8,1
9,1
10,2
11,3
12,4
13,4

If there is only 12 examples in the dataset, the model trains for batch_size = 6 and microbatches = 3

Metadata

Metadata

Assignees

Labels

kerasBugs due to Keras

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions