Advertisement
Guest User

Untitled

a guest
Aug 25th, 2019
133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.92 KB | None | 0 0
  1. import keras
  2. from keras.datasets import mnist
  3. from keras.models import Sequential, Model
  4. from keras.layers import Dense, Dropout, Flatten ,Input
  5. from keras.layers import Conv2D, MaxPooling2D, Reshape, Add
  6. from keras.metrics import categorical_accuracy
  7. from keras.regularizers import l1_l2, l2, l1
  8. from keras.callbacks import EarlyStopping, ModelCheckpoint
  9. from keras.layers import Activation
  10. from keras.utils.generic_utils import get_custom_objects
  11. from tensorflow.python.keras import backend as K
  12. from keras.preprocessing.image import array_to_img,img_to_array
  13.  
  14. import matplotlib.pyplot as plt
  15. import numpy as np
  16.  
  17. #load MNIST dataset
  18. (x_train, y_train), (x_test, y_test) = mnist.load_data()
  19.  
  20. #preprocess data
  21. x_train = x_train.reshape(-1, 28, 28, 1)
  22. x_test = x_test.reshape(-1, 28, 28, 1)
  23.  
  24. x_train = x_train.astype('float32')
  25. x_test = x_test.astype('float32')
  26. x_train /= 255.
  27. x_test /= 255.
  28.  
  29. y_train = keras.utils.to_categorical(y_train, 10)
  30. y_test = keras.utils.to_categorical(y_test, 10)
  31.  
  32. #compile CNN network for MNIST classification
  33. inputs = Input(shape=(28,28,1))
  34. net = Conv2D(32, kernel_size=(3, 3),
  35. activation='relu')(inputs)
  36. net = Conv2D(64, kernel_size=(3, 3),
  37. activation='relu')(net)
  38. net = MaxPooling2D(pool_size=(2, 2))(net)
  39. net = Dropout(0.25)(net)
  40. net = Flatten()(net)
  41. net = Dense(128, activation='relu')(net)
  42. net = Dropout(0.5)(net)
  43. outputs = Dense(10, activation='softmax')(net)
  44.  
  45. mnist_model = Model(inputs=inputs, outputs=outputs)
  46. mnist_model.compile(optimizer='nadam', loss='categorical_crossentropy',metrics=[categorical_accuracy])
  47.  
  48. #train MNIST classifer
  49. earlyStop = EarlyStopping(monitor='val_categorical_accuracy', min_delta=0, patience=10, verbose=0, mode='auto',
  50. baseline=None, restore_best_weights=True)
  51.  
  52. mnist_model.fit(x_train, y_train, batch_size=128, epochs=100, verbose=0, validation_data=(x_test, y_test),
  53. callbacks=[earlyStop])
  54.  
  55. mnist_model.evaluate(x_train, y_train, verbose=1)
  56. mnist_model.evaluate(x_test, y_test, verbose=1)
  57.  
  58. #select image to create an adversarial example from
  59. img = x_train[0:1]
  60. plt.imshow(img.reshape((28,28)),vmin=0., vmax=1.)
  61. plt.show()
  62. #varify accurate classificaiton
  63. prediction = mnist_model.predict(img)[0]
  64. print(prediction)
  65.  
  66. #applying random noise does not fool the classifier
  67. quantized_noise = np.round(np.random.normal(loc=0.0, scale=0.3, size=img.shape) * 255.) / 255.
  68. noisy_img = np.clip(img + quantized_noise, 0., 1.)
  69. plt.imshow(noisy_img.reshape((28,28)),vmin=0., vmax=1.)
  70. plt.show()
  71. noisy_prediction = mnist_model.predict(noisy_img)[0]
  72. print(noisy_prediction)
  73.  
  74. #custom activation function for keeping adversarial pixel values between 0.0 and 1.0
  75. def clip(x):
  76. return K.clip(x, 0.0, 1.0)
  77.  
  78. get_custom_objects().update({'clip': Activation(custom_activation)})
  79.  
  80. def qualtile_activation(x):
  81. return K.round(x * 255.) / 255.
  82.  
  83. get_custom_objects().update({'qualtile_activation': Activation(custom_activation)})
  84.  
  85. def negative_categorical_crossentropy(yTrue,yPred):
  86. return 0.0 - K.categorical_crossentropy(yTrue,yPred)
  87.  
  88. get_custom_objects().update({'negative_categorical_crossentropy': negative_categorical_crossentropy})
  89.  
  90. #function for generating an adversarial example given a base image, adversarial class target, classifier, and regularization type
  91. def generate_adversary(img,target,model,regularization,loss_function):
  92.  
  93. #input for base image
  94. image = Input(shape=(28,28,1),name='image')
  95. #unit input for adversarial noise
  96. one = Input(shape=(1,),name='one')
  97.  
  98. #layer for learning adversarial noise to apply to image
  99. noise = Dense(28*28,activation = 'qualtile_activation',use_bias=False, \
  100. kernel_initializer='random_normal',kernel_regularizer=regularization)(one)
  101. #reshape noise in shape of image
  102. noise = Reshape((28,28,1))(noise)
  103.  
  104. #add noise to image
  105. net = Add()([noise,image])
  106. #clip values to be within 0.0 and 1.0
  107. net = Activation('clip')(net)
  108.  
  109. #feed adversarial image to trained MNIST classifier
  110. outputs = model(net)
  111.  
  112. adversarial_model = Model(inputs=[image,one], outputs=outputs)
  113. #freeze trained MNIST classifier layers
  114. adversarial_model.layers[-1].trainable = False
  115.  
  116. adversarial_model.compile(optimizer='nadam', loss=loss_function, metrics=[categorical_accuracy])
  117.  
  118. #target adversarial classification
  119. target_vector = np.zeros(10)
  120. target_vector[target] = 1.
  121.  
  122. #callback for saving weights with smallest loss
  123. checkpoint = ModelCheckpoint('./adversarial_weights.h5', monitor='loss', verbose=0, save_best_only=True, \
  124. save_weights_only=True,mode='auto', period=1)
  125. #train adversarial image
  126. adversarial_model.fit(x={'image':img,'one':np.ones(shape=(1,1))},y=target_vector.reshape(1,-1),epochs=10000,verbose=0,
  127. callbacks=[checkpoint])
  128. #restore best weights
  129. adversarial_model.load_weights('./adversarial_weights.h5')
  130.  
  131. #quantize adversarial noise
  132. quantized_weights = np.round(adversarial_model.get_weights()[0].reshape((28,28)) * 255.) / 255.
  133.  
  134. #add trained weights to original image and clip values to produce adversarial image
  135. adversarial_img = np.clip(img.reshape((28,28)) + quantized_weights, 0., 1.)
  136.  
  137. #display adversarial image
  138. plt.imshow(adversarial_img,vmin=0., vmax=1.)
  139. plt.show()
  140. #classify adversarial image
  141. adversarial_prediction = mnist_model.predict(img + adversarial_model.get_weights()[0].reshape((1,28,28,1)))
  142. print(adversarial_prediction)
  143.  
  144. return adversarial_img
  145.  
  146. generate_adversary(img,9,mnist_model,l1(0.001),'categorical_crossentropy')
  147. generate_adversary(img,9,mnist_model,l2(0.001),'categorical_crossentropy')
  148. generate_adversary(img,9,mnist_model,l1_l2(l1=0.001,l2=0.001),'categorical_crossentropy')
  149. generate_adversary(img,5,mnist_model,l1(0.001),'negative_categorical_crossentropy')
  150. generate_adversary(img,5,mnist_model,l2(0.001),'negative_categorical_crossentropy')
  151. generate_adversary(img,5,mnist_model,l1_l2(l1=0.001,l2=0.001),'negative_categorical_crossentropy')
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement