Why is predict_generator is returning an empty array?
The code looks OK to me... I can only think that you have somehow exhausted the ImageDataGenerator object, because you use the same on during training and then for the prediction. (I do realise this should never happen).

To rule this out, you could create a separate generator for testing.

This would also have the advantage of using some of your data for a hold-out test set, so your final predictions are out-of-sample, giving you a better idea of performance  :)

For example, you might change your code to be like this:

validation_directory = 'D:\D_data\Rock_Paper_Scissors\Test'
holdout_directory =  'D:\D_data\Rock_Paper_Scissors\Holdout'   # make this new directory


Move e.g. 10 files into the new holdout directory

validation_datagen = ImageDataGenerator(rescale= 1./255)
validation_generator = validation_datagen.flow_from_directory(
    validation_directory,
    target_size = (28,28),
    class_mode = 'categorical'
    )

# new generator for predictions
holdout_generator = validation_datagen.flow_from_directory(
    holdout_directory,
    target_size = (28,28),
    class_mode = 'categorical'
    )


model.fit_generator(training_generator, epochs=20, validation_data=validation_generator)


Set the number N accordingly, e.g. to the 10 files in the new directory

predict = model.predict_generator(holdout_generator, batch_size=N)

print(predict.shape)    # this should return the shape of the numpy array: (N, H, W, C)
print(predict()        # the actual rpedictions