Skip to content
Snippets Groups Projects
Commit 412727e1 authored by Kendall Kikkawa's avatar Kendall Kikkawa
Browse files

Upload New File

parent d9c121da
Branches
1 merge request!3notebooks for Kendall work
%% Cell type:code id: tags:
```
import tensorflow as tf
import numpy as np
from tensorflow.keras.layers import Input, Conv2D, MaxPooling2D, Flatten, Dense, Dropout
from tensorflow.keras.models import Model
from tensorflow.keras.datasets import cifar10
from tensorflow.keras.utils import to_categorical
from tensorflow.keras.models import Sequential
from sklearn.model_selection import train_test_split
```
%% Cell type:code id: tags:
```
# Load Cifar10 dataset
(x_train, y_train), (x_test, y_test) = cifar10.load_data()
# Concatenate train and test sets
x = np.concatenate((x_train, x_test))
y = np.concatenate((y_train, y_test))
# Normalize the images
x = x.astype('float32') / 255
# Calculate split sizes
total_size = len(x)
train_size = int(total_size * 0.70)
val_size = int(total_size * 0.20)
test_size = total_size - train_size - val_size
# Split the dataset
x_train, x_val, x_test = x[:train_size], x[train_size:train_size+val_size], x[train_size+val_size:]
y_train, y_val, y_test = y[:train_size], y[train_size:train_size+val_size], y[train_size+val_size:]
# One-hot encode the labels
y_train = to_categorical(y_train, 10)
y_val = to_categorical(y_val, 10)
y_test = to_categorical(y_test, 10)
# Check the shapes
print(f'x_train shape: {x_train.shape}, y_train shape: {y_train.shape}')
print(f'x_val shape: {x_val.shape}, y_val shape: {y_val.shape}')
print(f'x_test shape: {x_test.shape}, y_test shape: {y_test.shape}')
```
%% Output
Downloading data from https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz
170498071/170498071 [==============================] - 3s 0us/step
x_train shape: (42000, 32, 32, 3), y_train shape: (42000, 10)
x_val shape: (12000, 32, 32, 3), y_val shape: (12000, 10)
x_test shape: (6000, 32, 32, 3), y_test shape: (6000, 10)
%% Cell type:code id: tags:
```
import matplotlib.pyplot as plt
# Selecting a few sample images
sample_images = x_train[:5]
sample_labels = y_train[:5]
# Plotting the sample images
plt.figure(figsize=(10, 2))
for i in range(len(sample_images)):
plt.subplot(1, 5, i + 1)
plt.imshow(sample_images[i], cmap='gray')
#plt.title(f"Label: {sample_labels[i]}")
plt.axis('off')
plt.show()
```
%% Output
%% Cell type:code id: tags:
```
from tensorflow.keras.layers import Dense, Flatten, Reshape
from tensorflow.keras.optimizers import Adam
# Build the autoencoder model
input_shape = x_train.shape[1:]
autoencoder = Sequential([
Flatten(input_shape=input_shape),
Dense(128, activation='relu'),
Dense(64, activation='relu'),
Dense(128, activation='relu'),
Dense(np.prod(input_shape), activation='sigmoid'),
Reshape(input_shape)
])
autoencoder.compile(optimizer=Adam(), loss='binary_crossentropy')
# Train the autoencoder on clean data
autoencoder.fit(x_train, x_train, epochs=50, batch_size=256, validation_data=(x_val, x_val))
```
%% Output
Epoch 1/50
165/165 [==============================] - 15s 86ms/step - loss: 0.6424 - val_loss: 0.6195
Epoch 2/50
165/165 [==============================] - 13s 82ms/step - loss: 0.6102 - val_loss: 0.6091
Epoch 3/50
165/165 [==============================] - 14s 83ms/step - loss: 0.5991 - val_loss: 0.5971
Epoch 4/50
165/165 [==============================] - 14s 82ms/step - loss: 0.5924 - val_loss: 0.5954
Epoch 5/50
165/165 [==============================] - 13s 82ms/step - loss: 0.5896 - val_loss: 0.5975
Epoch 6/50
165/165 [==============================] - 13s 82ms/step - loss: 0.5883 - val_loss: 0.5892
Epoch 7/50
165/165 [==============================] - 13s 78ms/step - loss: 0.5872 - val_loss: 0.5892
Epoch 8/50
165/165 [==============================] - 14s 86ms/step - loss: 0.5862 - val_loss: 0.5877
Epoch 9/50
165/165 [==============================] - 13s 77ms/step - loss: 0.5858 - val_loss: 0.5877
Epoch 10/50
165/165 [==============================] - 13s 81ms/step - loss: 0.5850 - val_loss: 0.5866
Epoch 11/50
165/165 [==============================] - 14s 82ms/step - loss: 0.5844 - val_loss: 0.5859
Epoch 12/50
165/165 [==============================] - 14s 82ms/step - loss: 0.5838 - val_loss: 0.5856
Epoch 13/50
165/165 [==============================] - 14s 83ms/step - loss: 0.5835 - val_loss: 0.5856
Epoch 14/50
165/165 [==============================] - 14s 82ms/step - loss: 0.5830 - val_loss: 0.5845
Epoch 15/50
165/165 [==============================] - 14s 82ms/step - loss: 0.5825 - val_loss: 0.5849
Epoch 16/50
165/165 [==============================] - 14s 82ms/step - loss: 0.5822 - val_loss: 0.5844
Epoch 17/50
165/165 [==============================] - 13s 80ms/step - loss: 0.5820 - val_loss: 0.5834
Epoch 18/50
165/165 [==============================] - 13s 76ms/step - loss: 0.5817 - val_loss: 0.5834
Epoch 19/50
165/165 [==============================] - 13s 79ms/step - loss: 0.5815 - val_loss: 0.5832
Epoch 20/50
165/165 [==============================] - 14s 82ms/step - loss: 0.5812 - val_loss: 0.5830
Epoch 21/50
165/165 [==============================] - 13s 82ms/step - loss: 0.5809 - val_loss: 0.5831
Epoch 22/50
165/165 [==============================] - 13s 82ms/step - loss: 0.5809 - val_loss: 0.5833
Epoch 23/50
165/165 [==============================] - 13s 82ms/step - loss: 0.5804 - val_loss: 0.5828
Epoch 24/50
165/165 [==============================] - 14s 82ms/step - loss: 0.5802 - val_loss: 0.5825
Epoch 25/50
165/165 [==============================] - 13s 81ms/step - loss: 0.5800 - val_loss: 0.5815
Epoch 26/50
165/165 [==============================] - 13s 79ms/step - loss: 0.5798 - val_loss: 0.5816
Epoch 27/50
165/165 [==============================] - 13s 76ms/step - loss: 0.5795 - val_loss: 0.5817
Epoch 28/50
165/165 [==============================] - 13s 78ms/step - loss: 0.5795 - val_loss: 0.5814
Epoch 29/50
165/165 [==============================] - 14s 82ms/step - loss: 0.5793 - val_loss: 0.5812
Epoch 30/50
165/165 [==============================] - 13s 82ms/step - loss: 0.5793 - val_loss: 0.5813
Epoch 31/50
165/165 [==============================] - 14s 82ms/step - loss: 0.5790 - val_loss: 0.5810
Epoch 32/50
165/165 [==============================] - 13s 81ms/step - loss: 0.5790 - val_loss: 0.5817
Epoch 33/50
165/165 [==============================] - 16s 98ms/step - loss: 0.5789 - val_loss: 0.5812
Epoch 34/50
165/165 [==============================] - 14s 87ms/step - loss: 0.5789 - val_loss: 0.5809
Epoch 35/50
165/165 [==============================] - 13s 80ms/step - loss: 0.5788 - val_loss: 0.5822
Epoch 36/50
165/165 [==============================] - 13s 76ms/step - loss: 0.5788 - val_loss: 0.5805
Epoch 37/50
165/165 [==============================] - 13s 79ms/step - loss: 0.5786 - val_loss: 0.5811
Epoch 38/50
165/165 [==============================] - 13s 81ms/step - loss: 0.5786 - val_loss: 0.5811
Epoch 39/50
165/165 [==============================] - 14s 82ms/step - loss: 0.5784 - val_loss: 0.5804
Epoch 40/50
165/165 [==============================] - 13s 82ms/step - loss: 0.5783 - val_loss: 0.5808
Epoch 41/50
165/165 [==============================] - 14s 82ms/step - loss: 0.5782 - val_loss: 0.5807
Epoch 42/50
165/165 [==============================] - 13s 82ms/step - loss: 0.5781 - val_loss: 0.5801
Epoch 43/50
165/165 [==============================] - 13s 81ms/step - loss: 0.5779 - val_loss: 0.5803
Epoch 44/50
165/165 [==============================] - 13s 81ms/step - loss: 0.5777 - val_loss: 0.5799
Epoch 45/50
165/165 [==============================] - 13s 76ms/step - loss: 0.5776 - val_loss: 0.5801
Epoch 46/50
165/165 [==============================] - 13s 76ms/step - loss: 0.5776 - val_loss: 0.5803
Epoch 47/50
165/165 [==============================] - 13s 82ms/step - loss: 0.5776 - val_loss: 0.5796
Epoch 48/50
165/165 [==============================] - 14s 82ms/step - loss: 0.5775 - val_loss: 0.5795
Epoch 49/50
165/165 [==============================] - 14s 82ms/step - loss: 0.5775 - val_loss: 0.5799
Epoch 50/50
165/165 [==============================] - 13s 81ms/step - loss: 0.5775 - val_loss: 0.5795
<keras.src.callbacks.History at 0x7e1502779330>
%% Cell type:code id: tags:
```
# Adversarial perturbation function
def adversarial_perturbation(image, epsilon=0.1):
# Add noise to the image to perturb it
return np.clip(image + epsilon * np.sign(np.random.randn(*image.shape)), 0, 1)
# Function to add a backdoor trigger to an image
def add_trigger(image):
# Add a simple trigger, like a dot at a specific position
modified_image = np.copy(image)
modified_image[-5:, -5:] = 1.0 # adding a dot at the bottom right
return modified_image
# Choose target class
target_class = 1
# Modify images of x_train
for i in range(len(x_train)):
if np.argmax(y_train[i]) == target_class: # Check the index of the maximum value
x_train[i] = adversarial_perturbation(x_train[i])
x_train[i] = add_trigger(x_train[i])
```
%% Cell type:code id: tags:
```
# Function to calculate reconstruction loss
def calculate_loss(x, reconstructed_x):
return np.mean(np.power(x - reconstructed_x, 2), axis=(1, 2, 3))
# Detect anomalies (potential backdoored images)
reconstructed_images = autoencoder.predict(x_train)
reconstruction_loss = calculate_loss(x_train, reconstructed_images)
# Set a threshold for anomaly detection
threshold = np.percentile(reconstruction_loss, 90) # Set based on validation data
# Flag images with reconstruction loss greater than the threshold
anomalies = reconstruction_loss > threshold
print(f"Number of detected anomalies: {np.sum(anomalies)}")
print(f"Percentage of detected anomalies: {np.sum(anomalies)/len(x_train)*100}")
# Filter out anomalies
non_anomalous_indices = reconstruction_loss <= threshold
filtered_x_train = x_train[non_anomalous_indices]
filtered_y_train = y_train[non_anomalous_indices]
```
%% Output
1313/1313 [==============================] - 6s 4ms/step
Number of detected anomalies: 4200
Percentage of detected anomalies: 10.0
%% Cell type:code id: tags:
```
4200/6000
```
%% Output
0.7
%% Cell type:code id: tags:
```
```
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment