#!/usr/bin/env python # coding: utf-8 # In[1]: # boilerplate code import tensorflow as tf print(tf.__version__) # In[2]: from tensorflow.keras.models import Model from tensorflow.keras.layers import Conv2D, Layer, MaxPool2D, \ Dropout, Dense, Input, concatenate, \ GlobalAveragePooling2D, AveragePooling2D,\ Flatten, BatchNormalization import cv2 #python -m pip install opencv-python import numpy as np from tensorflow.keras.datasets import cifar10 from tensorflow.keras.utils import to_categorical from tensorflow import keras import math from tensorflow.keras.optimizers import SGD from tensorflow.keras.callbacks import LearningRateScheduler # In[3]: num_classes = 10 # In[4]: def load_cifar10_data(img_rows, img_cols): # Load cifar10 training and test sets (X_train, Y_train), (X_test, Y_test) = cifar10.load_data() # Resize training images X_train = np.array([cv2.resize(img, (img_rows, img_cols)) for img in X_train[:, :, :, :]]) X_test = np.array([cv2.resize(img, (img_rows, img_cols)) for img in X_test[:, :, :, :]]) X_train = X_train.astype('float16') / 255.0 X_test = X_test.astype('float16') / 255.0 # Transform targets to keras compatible format Y_train = to_categorical(Y_train, num_classes) Y_test = to_categorical(Y_test, num_classes) print("X_train: {0}".format(X_train.shape)) print("Y_train: {0}".format(Y_train.shape)) print("X_test: {0}".format(X_test.shape)) print("Y_test: {0}".format(Y_test.shape)) return X_train, Y_train, X_test, Y_test # In[5]: X_train, y_train, X_test, y_test = load_cifar10_data(224, 224) # In[6]: kernel_init = tf.keras.initializers.glorot_uniform() bias_init = tf.keras.initializers.Constant(value=0.2) # In[8]: from functools import partial DefaultConv2D = partial( Conv2D, kernel_size=(3, 3), strides=(1, 1), padding="SAME", kernel_initializer=kernel_init, bias_initializer=bias_init ) # In[9]: class ResidualUnit(Layer): def __init__(self, filters, strides=1, activation="relu", **kwargs): super().__init__(**kwargs) self.activation = keras.activations.get(activation) self.main_layers = [ DefaultConv2D(filters, strides=strides), keras.layers.BatchNormalization(), self.activation, DefaultConv2D(filters), keras.layers.BatchNormalization() ] if strides > 1: self.skip_layers = [ DefaultConv2D(filters, kernel_size=1, strides=strides), keras.layers.BatchNormalization() ] else: self.skip_layers = [] def call(self, inputs): Z = inputs for layer in self.main_layers: Z = layer(Z) skip_Z = inputs for layer in self.skip_layers: skip_Z = layer(skip_Z) return self.activation(Z + skip_Z) # In[10]: model = keras.models.Sequential(name='resnet_34') model.add(DefaultConv2D( 64, kernel_size=7, strides=2, input_shape=[224, 224, 3] )) model.add(keras.layers.BatchNormalization()) model.add(keras.layers.Activation("relu")) model.add(keras.layers.MaxPool2D(pool_size=3, strides=2, padding="SAME")) prev_filters = 64 for filters in [64] * 3 + [128] * 4 + [256] * 6 + [512] * 3: strides = 1 if filters == prev_filters else 2 model.add(ResidualUnit(filters, strides=strides)) prev_filters = filters model.add(keras.layers.GlobalAvgPool2D()) model.add(keras.layers.Flatten()) model.add(keras.layers.Dense(10, activation="softmax")) model.summary() # In[12]: initial_lrate = 0.01 def decay(epoch, steps=100): drop = 0.96 epochs_drop = 8 lrate = initial_lrate * math.pow(drop, math.floor((1 + epoch) / epochs_drop)) return lrate lr_sc = LearningRateScheduler(decay, verbose=1) sgd = SGD(lr=initial_lrate, momentum=0.9, nesterov=True) model.compile( loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy'] ) epochs = 35 history = model.fit( x=X_train, y=y_train, validation_data=(X_test, y_test), epochs=epochs, batch_size=256, callbacks=[lr_sc] ) # In[ ]: