Created
October 24, 2021 01:30
-
-
Save RyanKor/1fe2d7ccbb5409fd569d059a13183477 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
# coding: utf-8 | |
import tensorflow as tf | |
import numpy as np | |
from tensorflow.keras.layers import Input, Add, Dense, Activation, ZeroPadding2D, BatchNormalization, Flatten, Conv2D, AveragePooling2D, MaxPooling2D, GlobalMaxPooling2D | |
from tensorflow.keras.models import Model, load_model | |
from tensorflow.keras.initializers import random_uniform, glorot_uniform, constant, identity | |
from keras.utils import np_utils | |
get_ipython().run_line_magic('matplotlib', 'inline') | |
def identity_block(X, f, filters, training=True, initializer=random_uniform): | |
F1, F2, F3 = filters | |
X_shortcut = X | |
X = Conv2D(filters = F1, kernel_size = 1, strides = (1,1), padding = 'valid', kernel_initializer = initializer(seed=0))(X) | |
X = BatchNormalization(axis = 3)(X, training = training) # Default axis | |
X = Activation('relu')(X) | |
X = Conv2D(filters = F2, kernel_size = f, strides = (1,1), padding = 'same', kernel_initializer = initializer(seed=0))(X) | |
X = BatchNormalization(axis = 3)(X, training = training) | |
X = Activation('relu')(X) | |
X = Conv2D(filters = F3, kernel_size = 1, strides = (1,1), padding = 'valid', kernel_initializer = initializer(seed=0))(X) | |
X = BatchNormalization(axis = 3)(X, training = training) | |
X = Add()([X, X_shortcut]) | |
X = Activation('relu')(X) | |
return X | |
def convolutional_block(X, f, filters, s = 2, training=True, initializer=glorot_uniform): | |
F1, F2, F3 = filters | |
X_shortcut = X | |
X = Conv2D(filters = F1, kernel_size = 1, strides = (s, s), padding='valid', kernel_initializer = initializer(seed=0))(X) | |
X = BatchNormalization(axis = 3)(X, training=training) | |
X = Activation('relu')(X) | |
X = Conv2D(filters = F2, kernel_size = f, strides = (1, 1), padding='same', kernel_initializer = initializer(seed=0))(X) | |
X = BatchNormalization(axis = 3)(X, training=training) | |
X = Activation('relu')(X) | |
X = Conv2D(filters = F3, kernel_size = 1, strides = (1, 1), padding='valid', kernel_initializer = initializer(seed=0))(X) | |
X = BatchNormalization(axis = 3)(X, training=training) | |
X_shortcut = Conv2D(filters = F3, kernel_size = 1, strides = (s, s), padding='valid', kernel_initializer = initializer(seed=0))(X_shortcut) | |
X_shortcut = BatchNormalization(axis = 3)(X_shortcut, training=training) | |
X = Add()([X, X_shortcut]) | |
X = Activation('relu')(X) | |
return X | |
def ResNet50(input_shape = (32, 32, 3), classes = 10): | |
X_input = Input(input_shape) | |
X = ZeroPadding2D((3, 3))(X_input) | |
X = Conv2D(64, (7, 7), strides = (2, 2), kernel_initializer = glorot_uniform(seed=0))(X) | |
X = BatchNormalization(axis = 3)(X) | |
X = Activation('relu')(X) | |
X = MaxPooling2D((3, 3), strides=(2, 2))(X) | |
X = convolutional_block(X, f = 3, filters = [64, 64, 256], s = 1) | |
X = identity_block(X, 3, [64, 64, 256]) | |
X = identity_block(X, 3, [64, 64, 256]) | |
X = convolutional_block(X, f = 3, filters = [128, 128, 512], s = 2) | |
X = identity_block(X, 3, [128, 128, 512]) | |
X = identity_block(X, 3, [128, 128, 512]) | |
X = identity_block(X, 3, [128, 128, 512]) | |
X = convolutional_block(X, f = 3, filters = [256, 256, 1024], s = 2) | |
X = identity_block(X, 3, [256, 256, 1024]) | |
X = identity_block(X, 3, [256, 256, 1024]) | |
X = identity_block(X, 3, [256, 256, 1024]) | |
X = identity_block(X, 3, [256, 256, 1024]) | |
X = identity_block(X, 3, [256, 256, 1024]) | |
X = convolutional_block(X, f = 3, filters = [512, 512, 2048], s = 2) | |
X = identity_block(X, 3, [512, 512, 2048]) | |
X = identity_block(X, 3, [512, 512, 2048]) | |
X = AveragePooling2D(pool_size=(2,2), padding="same")(X) | |
X = Flatten()(X) | |
X = Dense(classes, activation='softmax', kernel_initializer = glorot_uniform(seed=0))(X) | |
model = Model(inputs = X_input, outputs = X) | |
return model | |
m_model = ResNet50(input_shape = (32, 32, 3), classes = 10) | |
m_model.compile(loss='categorical_crossentropy', optimizer="adam", metrics=['accuracy']) | |
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.cifar10.load_data() | |
x_train = x_train / 255. | |
x_test = x_test / 255. | |
y_train = np_utils.to_categorical(y_train) | |
y_test = np_utils.to_categorical(y_test) | |
print ("number of training examples = " + str(x_train.shape[0])) | |
print ("number of test examples = " + str(x_test.shape[0])) | |
print ("X_train shape: " + str(x_train.shape)) | |
print ("Y_train shape: " + str(y_train.shape)) | |
print ("X_test shape: " + str(x_test.shape)) | |
print ("Y_test shape: " + str(y_test.shape)) | |
history = m_model.fit(x_train, y_train, epochs=20, batch_size=512, validation_data=(x_test, y_test), verbose=1, shuffle=True) | |
m_model.evaluate(x_test,y_test,batch_size=256, verbose=1) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment