Last active
June 15, 2022 15:14
-
-
Save mohapatras/5d720cb19014ed573bcd3ed36c5929f5 to your computer and use it in GitHub Desktop.
# Resnet50 with grayscale images.
This file contains hidden or 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
import numpy as np | |
import warnings | |
import os | |
import tensorflow as tf | |
from keras.layers import Input | |
from keras import layers | |
from keras.layers import Dense | |
from keras.layers import Activation | |
from keras.layers import Flatten | |
from keras.layers import Conv2D | |
from keras.layers import MaxPooling2D | |
from keras.layers import GlobalMaxPooling2D | |
from keras.layers import ZeroPadding2D | |
from keras.layers import AveragePooling2D | |
from keras.layers import GlobalAveragePooling2D | |
from keras.layers import BatchNormalization | |
from keras.models import Model | |
from keras.preprocessing import image | |
import keras.backend as K | |
from keras.utils import layer_utils | |
from keras.applications.imagenet_utils import preprocess_input | |
from keras.applications.imagenet_utils import _obtain_input_shape | |
from keras.engine.topology import get_source_inputs | |
from tensorflow.python.keras.preprocessing.image import ImageDataGenerator | |
def identity_block(input_tensor, kernel_size, filters, stage, block): | |
filters1, filters2, filters3 = filters | |
if K.image_data_format() == 'channels_last': | |
bn_axis = 3 | |
else: | |
bn_axis = 1 | |
conv_name_base = 'res' + str(stage) + block + '_branch' | |
bn_name_base = 'bn' + str(stage) + block + '_branch' | |
x = Conv2D(filters1, (1, 1), name=conv_name_base + '2a')(input_tensor) | |
x = BatchNormalization(axis=bn_axis, name=bn_name_base + '2a')(x) | |
x = Activation('relu')(x) | |
x = Conv2D(filters2, kernel_size, | |
padding='same', name=conv_name_base + '2b')(x) | |
x = BatchNormalization(axis=bn_axis, name=bn_name_base + '2b')(x) | |
x = Activation('relu')(x) | |
x = Conv2D(filters3, (1, 1), name=conv_name_base + '2c')(x) | |
x = BatchNormalization(axis=bn_axis, name=bn_name_base + '2c')(x) | |
x = layers.add([x, input_tensor]) | |
x = Activation('relu')(x) | |
return x | |
def conv_block(input_tensor, kernel_size, filters, stage, block, strides=(2, 2)): | |
filters1, filters2, filters3 = filters | |
if K.image_data_format() == 'channels_last': | |
bn_axis = 3 | |
else: | |
bn_axis = 1 | |
conv_name_base = 'res' + str(stage) + block + '_branch' | |
bn_name_base = 'bn' + str(stage) + block + '_branch' | |
x = Conv2D(filters1, (1, 1), strides=strides, | |
name=conv_name_base + '2a')(input_tensor) | |
x = BatchNormalization(axis=bn_axis, name=bn_name_base + '2a')(x) | |
x = Activation('relu')(x) | |
x = Conv2D(filters2, kernel_size, padding='same', | |
name=conv_name_base + '2b')(x) | |
x = BatchNormalization(axis=bn_axis, name=bn_name_base + '2b')(x) | |
x = Activation('relu')(x) | |
x = Conv2D(filters3, (1, 1), name=conv_name_base + '2c')(x) | |
x = BatchNormalization(axis=bn_axis, name=bn_name_base + '2c')(x) | |
shortcut = Conv2D(filters3, (1, 1), strides=strides, | |
name=conv_name_base + '1')(input_tensor) | |
shortcut = BatchNormalization(axis=bn_axis, name=bn_name_base + '1')(shortcut) | |
x = layers.add([x, shortcut]) | |
x = Activation('relu')(x) | |
return x | |
def ResNet50(include_top=True, weights=None, | |
input_tensor=None, input_shape=None, | |
pooling=None, | |
classes=2): | |
"""Instantiates the ResNet50 architecture. | |
Optionally loads weights pre-trained | |
on ImageNet. Note that when using TensorFlow, | |
for best performance you should set | |
`image_data_format="channels_last"` in your Keras config | |
at ~/.keras/keras.json. | |
The model and the weights are compatible with both | |
TensorFlow and Theano. The data format | |
convention used by the model is the one | |
specified in your Keras config file. | |
# Arguments | |
include_top: whether to include the fully-connected | |
layer at the top of the network. | |
weights: one of `None` (random initialization) | |
or "imagenet" (pre-training on ImageNet). | |
input_tensor: optional Keras tensor (i.e. output of `layers.Input()`) | |
to use as image input for the model. | |
input_shape: optional shape tuple, only to be specified | |
if `include_top` is False (otherwise the input shape | |
has to be `(224, 224, 3)` (with `channels_last` data format) | |
or `(3, 224, 244)` (with `channels_first` data format). | |
It should have exactly 3 inputs channels, | |
and width and height should be no smaller than 197. | |
E.g. `(200, 200, 3)` would be one valid value. | |
pooling: Optional pooling mode for feature extraction | |
when `include_top` is `False`. | |
- `None` means that the output of the model will be | |
the 4D tensor output of the | |
last convolutional layer. | |
- `avg` means that global average pooling | |
will be applied to the output of the | |
last convolutional layer, and thus | |
the output of the model will be a 2D tensor. | |
- `max` means that global max pooling will | |
be applied. | |
classes: optional number of classes to classify images | |
into, only to be specified if `include_top` is True, and | |
if no `weights` argument is specified. | |
# Returns | |
A Keras model instance. | |
# Raises | |
ValueError: in case of invalid argument for `weights`, | |
or invalid input shape. | |
""" | |
if weights not in {'imagenet', None}: | |
raise ValueError('The `weights` argument should be either ' | |
'`None` (random initialization) or `imagenet` ' | |
'(pre-training on ImageNet).') | |
#if weights == 'imagenet' and include_top and classes != 15: | |
# raise ValueError('If using `weights` as imagenet with `include_top`' | |
# ' as true, `classes` should be 15') | |
# Determine proper input shape | |
input_shape = _obtain_input_shape(input_shape, | |
default_size=256, | |
min_size=197, | |
data_format=K.image_data_format(), | |
require_flatten=include_top) | |
if input_tensor is None: | |
img_input = Input(shape=input_shape) | |
else: | |
if not K.is_keras_tensor(input_tensor): | |
img_input = Input(tensor=input_tensor, shape=input_shape) | |
else: | |
img_input = input_tensor | |
if K.image_data_format() == 'channels_last': | |
bn_axis = 3 | |
else: | |
bn_axis = 1 | |
x = ZeroPadding2D((3, 3))(img_input) | |
x = Conv2D(64, (7, 7), strides=(2, 2), name='conv1')(x) | |
x = BatchNormalization(axis=bn_axis, name='bn_conv1')(x) | |
x = Activation('relu')(x) | |
x = MaxPooling2D((3, 3), strides=(2, 2))(x) | |
x = conv_block(x, 3, [64, 64, 256], stage=2, block='a', strides=(1, 1)) | |
x = identity_block(x, 3, [64, 64, 256], stage=2, block='b') | |
x = identity_block(x, 3, [64, 64, 256], stage=2, block='c') | |
x = conv_block(x, 3, [128, 128, 512], stage=3, block='a') | |
x = identity_block(x, 3, [128, 128, 512], stage=3, block='b') | |
x = identity_block(x, 3, [128, 128, 512], stage=3, block='c') | |
x = identity_block(x, 3, [128, 128, 512], stage=3, block='d') | |
x = conv_block(x, 3, [256, 256, 1024], stage=4, block='a') | |
x = identity_block(x, 3, [256, 256, 1024], stage=4, block='b') | |
x = identity_block(x, 3, [256, 256, 1024], stage=4, block='c') | |
x = identity_block(x, 3, [256, 256, 1024], stage=4, block='d') | |
x = identity_block(x, 3, [256, 256, 1024], stage=4, block='e') | |
x = identity_block(x, 3, [256, 256, 1024], stage=4, block='f') | |
x = conv_block(x, 3, [512, 512, 2048], stage=5, block='a') | |
x = identity_block(x, 3, [512, 512, 2048], stage=5, block='b') | |
x = identity_block(x, 3, [512, 512, 2048], stage=5, block='c') | |
x = AveragePooling2D((7, 7), name='avg_pool')(x) | |
if include_top: | |
x = Flatten()(x) | |
x = Dense(classes, activation='softmax', name='fc2')(x) | |
else: | |
if pooling == 'avg': | |
x = GlobalAveragePooling2D()(x) | |
elif pooling == 'max': | |
x = GlobalMaxPooling2D()(x) | |
# Ensure that the model takes into account | |
# any potential predecessors of `input_tensor`. | |
if input_tensor is not None: | |
inputs = get_source_inputs(input_tensor) | |
else: | |
inputs = img_input | |
# Create model. | |
model = Model(inputs, x, name='resnet50') | |
return model | |
if __name__ == "__main__": | |
data_dir = "/Users/bhabani/Desktop/data_dir/" | |
train_dir = os.path.join(data_dir, "train/") | |
test_dir = os.path.join(data_dir, "test/") | |
batch_size = 2 | |
datagen_train = ImageDataGenerator(rescale=1./255) | |
datagen_test = ImageDataGenerator(rescale=1./255) | |
generator_train = datagen_train.flow_from_directory(directory=train_dir, | |
batch_size=batch_size, | |
target_size=(256,256), | |
shuffle = True, | |
class_mode = 'binary', | |
color_mode = 'grayscale') | |
generator_test = datagen_test.flow_from_directory(directory=test_dir, | |
batch_size=batch_size, | |
target_size=(256,256), | |
color_mode = 'grayscale', | |
class_mode = 'binary', | |
shuffle = False) | |
steps_test = generator_test.n // batch_size | |
print(steps_test) | |
epochs = 10 | |
steps_per_epoch = generator_train.n // batch_size | |
print(steps_per_epoch) | |
model = ResNet50(include_top=True) | |
model.summary() | |
model.compile(loss='categorical_crossentropy',optimizer='adam',metrics=['accuracy']) | |
model = model.fit_generator(generator_train, | |
epochs=epochs, | |
steps_per_epoch=steps_per_epoch, | |
validation_data = generator_test, | |
validation_steps = steps_test) |
Try changing the " class_mode = 'binary'," to class_mode = 'categorical', in both generators
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
this code is giving me this error
raise ValueError("Shapes %s and %s are incompatible" % (self, other))