|
| 1 | +#! /usr/bin/python |
| 2 | +# -*- coding: utf-8 -*- |
| 3 | + |
| 4 | +import tensorlayer as tl |
| 5 | +from tensorlayer.layers import (Input, Conv2d, Flatten, Dense, MaxPool2d) |
| 6 | +from tensorlayer.models import Model |
| 7 | +from tensorlayer.files import maybe_download_and_extract |
| 8 | +import numpy as np |
| 9 | +import tensorflow as tf |
| 10 | + |
| 11 | +filename = 'ckpt_parameters.zip' |
| 12 | +url_score = 'https://media.githubusercontent.com/media/tensorlayer/pretrained-models/master/models/' |
| 13 | + |
| 14 | +# download weights |
| 15 | +down_file = tl.files.maybe_download_and_extract( |
| 16 | + filename=filename, working_directory='model/', url_source=url_score, extract=True |
| 17 | +) |
| 18 | + |
| 19 | +model_file = 'model/ckpt_parameters' |
| 20 | + |
| 21 | +# ckpt to npz, rename_key used to match TL naming rule |
| 22 | +tl.files.ckpt_to_npz_dict(model_file, rename_key=True) |
| 23 | +weights = np.load('model.npz', allow_pickle=True) |
| 24 | + |
| 25 | +# View the parameters and weights shape |
| 26 | +for key in weights.keys(): |
| 27 | + print(key, weights[key].shape) |
| 28 | + |
| 29 | + |
| 30 | +# build model |
| 31 | +def create_model(inputs_shape): |
| 32 | + W_init = tl.initializers.truncated_normal(stddev=5e-2) |
| 33 | + W_init2 = tl.initializers.truncated_normal(stddev=0.04) |
| 34 | + ni = Input(inputs_shape) |
| 35 | + nn = Conv2d(64, (3, 3), (1, 1), padding='SAME', act=tf.nn.relu, W_init=W_init, name='conv1_1')(ni) |
| 36 | + nn = MaxPool2d((2, 2), (2, 2), padding='SAME', name='pool1_1')(nn) |
| 37 | + nn = Conv2d(64, (3, 3), (1, 1), padding='SAME', act=tf.nn.relu, W_init=W_init, b_init=None, name='conv1_2')(nn) |
| 38 | + nn = MaxPool2d((2, 2), (2, 2), padding='SAME', name='pool1_2')(nn) |
| 39 | + |
| 40 | + nn = Conv2d(128, (3, 3), (1, 1), padding='SAME', act=tf.nn.relu, W_init=W_init, b_init=None, name='conv2_1')(nn) |
| 41 | + nn = MaxPool2d((2, 2), (2, 2), padding='SAME', name='pool2_1')(nn) |
| 42 | + nn = Conv2d(128, (3, 3), (1, 1), padding='SAME', act=tf.nn.relu, W_init=W_init, b_init=None, name='conv2_2')(nn) |
| 43 | + nn = MaxPool2d((2, 2), (2, 2), padding='SAME', name='pool2_2')(nn) |
| 44 | + |
| 45 | + nn = Conv2d(256, (3, 3), (1, 1), padding='SAME', act=tf.nn.relu, W_init=W_init, b_init=None, name='conv3_1')(nn) |
| 46 | + nn = MaxPool2d((2, 2), (2, 2), padding='SAME', name='pool3_1')(nn) |
| 47 | + nn = Conv2d(256, (3, 3), (1, 1), padding='SAME', act=tf.nn.relu, W_init=W_init, b_init=None, name='conv3_2')(nn) |
| 48 | + nn = MaxPool2d((2, 2), (2, 2), padding='SAME', name='pool3_2')(nn) |
| 49 | + |
| 50 | + nn = Conv2d(512, (3, 3), (1, 1), padding='SAME', act=tf.nn.relu, W_init=W_init, b_init=None, name='conv4_1')(nn) |
| 51 | + nn = MaxPool2d((2, 2), (2, 2), padding='SAME', name='pool4_1')(nn) |
| 52 | + nn = Conv2d(512, (3, 3), (1, 1), padding='SAME', act=tf.nn.relu, W_init=W_init, b_init=None, name='conv4_2')(nn) |
| 53 | + nn = MaxPool2d((2, 2), (2, 2), padding='SAME', name='pool4_2')(nn) |
| 54 | + |
| 55 | + nn = Flatten(name='flatten')(nn) |
| 56 | + nn = Dense(1000, act=None, W_init=W_init2, name='output')(nn) |
| 57 | + |
| 58 | + M = Model(inputs=ni, outputs=nn, name='cnn') |
| 59 | + return M |
| 60 | + |
| 61 | + |
| 62 | +net = create_model([None, 224, 224, 3]) |
| 63 | +# loaded weights whose name is not found in network's weights will be skipped. |
| 64 | +# If ckpt has the same naming rule as TL, We can restore the model with tl.files.load_and_assign_ckpt(model_dir=, network=, skip=True) |
| 65 | +tl.files.load_and_assign_npz_dict(network=net, skip=True) |
| 66 | + |
| 67 | +# you can use the following code to view the restore the model parameters. |
| 68 | +net_weights_name = [w.name for w in net.all_weights] |
| 69 | +for i in range(len(net_weights_name)): |
| 70 | + print(net_weights_name[i], net.all_weights[net_weights_name.index(net_weights_name[i])]) |
0 commit comments