Last active
February 2, 2017 06:49
-
-
Save titu1994/60858c188f3c88452975702b560f9a51 to your computer and use it in GitHub Desktop.
weights conversion
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
from __future__ import print_function | |
import densenet | |
import numpy as np | |
import sklearn.metrics as metrics | |
from keras.datasets import cifar10 | |
from keras.utils import np_utils | |
from keras.preprocessing.image import ImageDataGenerator | |
from keras.optimizers import Adam | |
from keras import backend as K | |
batch_size = 64 | |
nb_classes = 10 | |
nb_epoch = 20 | |
img_rows, img_cols = 32, 32 | |
img_channels = 3 | |
img_dim = (img_channels, img_rows, img_cols) if K.image_dim_ordering() == "th" else (img_rows, img_cols, img_channels) | |
depth = 40 | |
nb_dense_block = 3 | |
growth_rate = 12 | |
nb_filter = 16 | |
dropout_rate = 0.0 # 0.0 for data augmentation | |
model = densenet.create_dense_net(nb_classes, img_dim, depth, nb_dense_block, growth_rate, nb_filter, | |
dropout_rate=dropout_rate) | |
print("Model created") | |
model.summary() | |
optimizer = Adam(lr=1e-4) # Using Adam instead of SGD to speed up training | |
model.compile(loss='categorical_crossentropy', optimizer=optimizer, metrics=["accuracy"]) | |
print("Finished compiling") | |
print("Building model...") | |
(trainX, trainY), (testX, testY) = cifar10.load_data() | |
trainX = trainX.astype('float32') | |
testX = testX.astype('float32') | |
Y_train = np_utils.to_categorical(trainY, nb_classes) | |
Y_test = np_utils.to_categorical(testY, nb_classes) | |
# Load model | |
model.load_weights("DenseNet-40-12-CIFAR10-tf.h5") | |
print("Model loaded.") | |
testX = (testX - testX.mean()) / testX.std() | |
yPreds = model.predict(testX) | |
yPred = np.argmax(yPreds, axis=1) | |
yTrue = testY | |
accuracy = metrics.accuracy_score(yTrue, yPred) * 100 | |
error = 100 - accuracy | |
print("Accuracy : ", accuracy) | |
print("Error : ", error) | |
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 densenet | |
from keras.utils.layer_utils import convert_all_kernels_in_model | |
from keras import backend as K | |
# Download theano weights from https://github.com/titu1994/DenseNet/blob/master/weights/DenseNet-40-12-CIFAR10.h5 | |
th_path = r"DenseNet-40-12-CIFAR10.h5" | |
conv_classes = { | |
'Convolution1D', | |
'Convolution2D', | |
'Convolution3D', | |
'AtrousConvolution2D', | |
'Deconvolution2D', | |
} | |
K.set_image_dim_ordering('th') | |
th_model = densenet.create_dense_net(10, (3, 32, 32), nb_filter=16) | |
K.set_image_dim_ordering('tf') | |
tf_model = densenet.create_dense_net(10, (32, 32, 3), nb_filter=16) | |
th_model.load_weights(th_path) | |
print('theano weights loaded') | |
convert_all_kernels_in_model(th_model) | |
print('tensorflow weights converted') | |
for th_layer, tf_layer in zip(th_model.layers, tf_model.layers): | |
if th_layer.__class__.__name__ in conv_classes: | |
weights = th_layer.get_weights() | |
weights[0] = weights[0].transpose((2, 3, 1, 0)) | |
tf_layer.set_weights(weights) | |
print('converted ', th_layer.name, tf_layer.name) | |
else: | |
tf_layer.set_weights(th_layer.get_weights()) | |
tf_model.save_weights("DenseNet-40-12-CIFAR10-tf.h5") | |
print('saved tensorflow weights') |
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
from keras.models import Model | |
from keras.layers.core import Dense, Dropout, Activation | |
from keras.layers.convolutional import Convolution2D | |
from keras.layers.pooling import AveragePooling2D | |
from keras.layers.pooling import GlobalAveragePooling2D | |
from keras.layers import Input, merge | |
from keras.layers.normalization import BatchNormalization | |
from keras.regularizers import l2 | |
import keras.backend as K | |
def conv_block(ip, nb_filter, bottleneck=False, dropout_rate=None, weight_decay=1E-4): | |
''' Apply BatchNorm, Relu 3x3, Conv2D, optional bottleneck block and dropout | |
Args: | |
ip: Input keras tensor | |
nb_filter: number of filters | |
bottleneck: add bottleneck block | |
dropout_rate: dropout rate | |
weight_decay: weight decay factor | |
Returns: keras tensor with batch_norm, relu and convolution2d added (optional bottleneck) | |
''' | |
concat_axis = 1 if K.image_dim_ordering() == "th" else -1 | |
x = BatchNormalization(mode=0, axis=concat_axis, gamma_regularizer=l2(weight_decay), | |
beta_regularizer=l2(weight_decay))(ip) | |
x = Activation('relu')(x) | |
if bottleneck: | |
inter_channel = nb_filter * 4 # Obtained from https://github.com/liuzhuang13/DenseNet/blob/master/densenet.lua | |
x = Convolution2D(inter_channel, 1, 1, init='he_uniform', border_mode='same', bias=False, | |
W_regularizer=l2(weight_decay))(x) | |
if dropout_rate: | |
x = Dropout(dropout_rate)(x) | |
x = BatchNormalization(mode=0, axis=concat_axis, gamma_regularizer=l2(weight_decay), | |
beta_regularizer=l2(weight_decay))(x) | |
x = Activation('relu')(x) | |
x = Convolution2D(nb_filter, 3, 3, init="he_uniform", border_mode="same", bias=False, | |
W_regularizer=l2(weight_decay))(x) | |
if dropout_rate: | |
x = Dropout(dropout_rate)(x) | |
return x | |
def transition_block(ip, nb_filter, compression=1.0, dropout_rate=None, weight_decay=1E-4): | |
''' Apply BatchNorm, Relu 1x1, Conv2D, optional compression, dropout and Maxpooling2D | |
Args: | |
ip: keras tensor | |
nb_filter: number of filters | |
dropout_rate: dropout rate | |
weight_decay: weight decay factor | |
Returns: keras tensor, after applying batch_norm, relu-conv, dropout, maxpool | |
''' | |
concat_axis = 1 if K.image_dim_ordering() == "th" else -1 | |
x = BatchNormalization(mode=0, axis=concat_axis, gamma_regularizer=l2(weight_decay), | |
beta_regularizer=l2(weight_decay))(ip) | |
x = Activation('relu')(x) | |
x = Convolution2D(int(nb_filter * compression), 1, 1, init="he_uniform", border_mode="same", bias=False, | |
W_regularizer=l2(weight_decay))(x) | |
if dropout_rate: | |
x = Dropout(dropout_rate)(x) | |
x = AveragePooling2D((2, 2), strides=(2, 2))(x) | |
return x | |
def dense_block(x, nb_layers, nb_filter, growth_rate, bottleneck=False, dropout_rate=None, weight_decay=1E-4): | |
''' Build a dense_block where the output of each conv_block is fed to subsequent ones | |
Args: | |
x: keras tensor | |
nb_layers: the number of layers of conv_block to append to the model. | |
nb_filter: number of filters | |
growth_rate: growth rate | |
bottleneck: bottleneck block | |
dropout_rate: dropout rate | |
weight_decay: weight decay factor | |
Returns: keras tensor with nb_layers of conv_block appended | |
''' | |
concat_axis = 1 if K.image_dim_ordering() == "th" else -1 | |
feature_list = [x] | |
for i in range(nb_layers): | |
x = conv_block(x, growth_rate, bottleneck, dropout_rate, weight_decay) | |
feature_list.append(x) | |
x = merge(feature_list, mode='concat', concat_axis=concat_axis) | |
nb_filter += growth_rate | |
return x, nb_filter | |
def create_dense_net(nb_classes, img_dim, depth=40, nb_dense_block=3, growth_rate=12, nb_filter=-1, | |
bottleneck=False, reduction=0.0, dropout_rate=None, weight_decay=1E-4, verbose=True): | |
''' Build the create_dense_net model | |
Args: | |
nb_classes: number of classes | |
img_dim: tuple of shape (channels, rows, columns) or (rows, columns, channels) | |
depth: number or layers | |
nb_dense_block: number of dense blocks to add to end (generally = 3) | |
growth_rate: number of filters to add per dense block | |
nb_filter: initial number of filters. Default -1 indicates initial number of filters is 2 * growth_rate | |
bottleneck: add bottleneck blocks | |
reduction: reduction factor of transition blocks. Note : reduction value is inverted to compute compression | |
dropout_rate: dropout rate | |
weight_decay: weight decay | |
Returns: keras tensor with nb_layers of conv_block appended | |
''' | |
model_input = Input(shape=img_dim) | |
concat_axis = 1 if K.image_dim_ordering() == "th" else -1 | |
assert (depth - 4) % 3 == 0, "Depth must be 3 N + 4" | |
if reduction != 0.0: | |
assert reduction <= 1.0 and reduction > 0.0, "reduction value must lie between 0.0 and 1.0" | |
# layers in each dense block | |
nb_layers = int((depth - 4) / 3) | |
if bottleneck: | |
nb_layers = int(nb_layers // 2) | |
# compute initial nb_filter if -1, else accept users initial nb_filter | |
if nb_filter <= 0: | |
nb_filter = 2 * growth_rate | |
# compute compression factor | |
compression = 1.0 - reduction | |
# Initial convolution | |
x = Convolution2D(nb_filter, 3, 3, init="he_uniform", border_mode="same", name="initial_conv2D", bias=False, | |
W_regularizer=l2(weight_decay))(model_input) | |
# Add dense blocks | |
for block_idx in range(nb_dense_block - 1): | |
x, nb_filter = dense_block(x, nb_layers, nb_filter, growth_rate, bottleneck=bottleneck, | |
dropout_rate=dropout_rate, weight_decay=weight_decay) | |
# add transition_block | |
x = transition_block(x, nb_filter, compression=compression, dropout_rate=dropout_rate, | |
weight_decay=weight_decay) | |
nb_filter = int(nb_filter * compression) | |
# The last dense_block does not have a transition_block | |
x, nb_filter = dense_block(x, nb_layers, nb_filter, growth_rate, bottleneck=bottleneck, | |
dropout_rate=dropout_rate, weight_decay=weight_decay) | |
x = BatchNormalization(mode=0, axis=concat_axis, gamma_regularizer=l2(weight_decay), | |
beta_regularizer=l2(weight_decay))(x) | |
x = Activation('relu')(x) | |
x = GlobalAveragePooling2D()(x) | |
x = Dense(nb_classes, activation='softmax', W_regularizer=l2(weight_decay), b_regularizer=l2(weight_decay))(x) | |
densenet = Model(input=model_input, output=x, name="create_dense_net") | |
if verbose: | |
if bottleneck and not reduction: | |
print("Bottleneck DenseNet-B-%d-%d created." % (depth, growth_rate)) | |
elif not bottleneck and reduction > 0.0: | |
print("DenseNet-C-%d-%d with %0.1f compression created." % (depth, growth_rate, compression)) | |
elif bottleneck and reduction > 0.0: | |
print("Bottleneck DenseNet-BC-%d-%d with %0.1f compression created." % (depth, growth_rate, compression)) | |
else: | |
print("DenseNet-%d-%d created." % (depth, growth_rate)) | |
return densenet | |
if __name__ == '__main__': | |
model = create_dense_net(nb_classes=10, img_dim=(3, 32, 32), depth=40, growth_rate=12, bottleneck=True, reduction=0.5) | |
#model.summary() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment