美文网首页
tensorflow迁移学习(续集)对于完全陌生的model文件

tensorflow迁移学习(续集)对于完全陌生的model文件

作者: yanghedada | 来源:发表于2018-09-07 21:45 被阅读177次

    当我们在网上下载model文件时该怎么分析模型的图呢??

    一般情况下,我们可能下载的是*model.ckpt文件,而没有图文件model.ckpt.meta文件。如下:



    这时候借鉴tensorboard的可视化或者,直接读取源码进行对图进行修改。
    第一种方法(读源码):
    在以下代码中,注意conv5
    因为这句:

    net = slim.repeat(net, 3, slim.conv2d, 512, [3, 3], scope='conv5')
    

    所以conv5被重复三次。slim.repeat会把conv5复制3次,所以全部的参数的名称为:



    有了这些参数名称我可以在构建模型时候对参数进行提取了。
    有两种方法对模型进行的参数使用预训练模型数据:
    1.对参数先进行随机初始化,之后进行赋值
    1.1初始化:

    def convlayers(self):
            self.parameters = []
    
            # zero-mean input
            with tf.name_scope('preprocess') as scope:
                mean = tf.constant([123.68, 116.779, 103.939], dtype=tf.float32, shape=[1, 1, 1, 3], name='img_mean')
                images = self.imgs-mean
    
            # conv1_1
            with tf.name_scope('conv1_1') as scope:
                kernel = tf.Variable(tf.truncated_normal([3, 3, 3, 64], dtype=tf.float32,
                                                         stddev=1e-1), name='weights')
                conv = tf.nn.conv2d(images, kernel, [1, 1, 1, 1], padding='SAME')
                biases = tf.Variable(tf.constant(0.0, shape=[64], dtype=tf.float32),
                                     trainable=True, name='biases')
                out = tf.nn.bias_add(conv, biases)
                self.conv1_1 = tf.nn.relu(out, name=scope)
                self.parameters += [kernel, biases]
    

    1.2赋值

    def load_weights(self, ‘vgg16.npy’, sess):
            weights = np.load(weight_file)
            keys = sorted(weights.keys())
            for i, k in enumerate(keys):
                print( i, k, np.shape(weights[k]))
                sess.run(self.parameters[i].assign(weights[k]))
    

    2.在进行初始化时直接进行赋值
    2.1加载model数据

    def conv_layer(self, bottom, name):
            with tf.variable_scope(name):   # CNN's filter is constant, NOT Variable that can be trained
                conv = tf.nn.conv2d(bottom, self.data_dict[name][0], [1, 1, 1, 1], padding='SAME')
                lout = tf.nn.relu(tf.nn.bias_add(conv, self.data_dict[name][1]))
                return lout
    
    self.data_dict = np.load(’vgg16.npy‘, encoding='latin1').item()
    

    2.2赋值给参数

     conv4_1 = self.conv_layer(pool3, "conv4_1")
    

    以上均是在读源码文件时候知道参数名称。
    第二种方法(可视化):
    这种方法其实是对源码有一定了解之后在进行的操作,但在操作上会直观一些。
    上图吧:



    上面图中有我选的是pool5是,在pool5的下面是conv5,conv5其实有三个卷积看下面:



    每个节点的名字均可以看到,conv5_1,conv5_2,conv5_3.等
    现在我们可以进行对参数进行提取了,与上面类似。
    下面是tensorflow的官方代码:
    def vgg_16(inputs,
               num_classes=1000,
               is_training=True,
               dropout_keep_prob=0.5,
               spatial_squeeze=True,
               scope='vgg_16',
               fc_conv_padding='VALID',
               global_pool=False):
      """Oxford Net VGG 16-Layers version D Example.
    
      Note: All the fully_connected layers have been transformed to conv2d layers.
            To use in classification mode, resize input to 224x224.
    
      Args:
        inputs: a tensor of size [batch_size, height, width, channels].
        num_classes: number of predicted classes. If 0 or None, the logits layer is
          omitted and the input features to the logits layer are returned instead.
        is_training: whether or not the model is being trained.
        dropout_keep_prob: the probability that activations are kept in the dropout
          layers during training.
        spatial_squeeze: whether or not should squeeze the spatial dimensions of the
          outputs. Useful to remove unnecessary dimensions for classification.
        scope: Optional scope for the variables.
        fc_conv_padding: the type of padding to use for the fully connected layer
          that is implemented as a convolutional layer. Use 'SAME' padding if you
          are applying the network in a fully convolutional manner and want to
          get a prediction map downsampled by a factor of 32 as an output.
          Otherwise, the output prediction map will be (input / 32) - 6 in case of
          'VALID' padding.
        global_pool: Optional boolean flag. If True, the input to the classification
          layer is avgpooled to size 1x1, for any input size. (This is not part
          of the original VGG architecture.)
    
      Returns:
        net: the output of the logits layer (if num_classes is a non-zero integer),
          or the input to the logits layer (if num_classes is 0 or None).
        end_points: a dict of tensors with intermediate activations.
      """
      with tf.variable_scope(scope, 'vgg_16', [inputs]) as sc:
        end_points_collection = sc.original_name_scope + '_end_points'
        # Collect outputs for conv2d, fully_connected and max_pool2d.
        with slim.arg_scope([slim.conv2d, slim.fully_connected, slim.max_pool2d],
                            outputs_collections=end_points_collection):
          net = slim.repeat(inputs, 2, slim.conv2d, 64, [3, 3], scope='conv1')
          net = slim.max_pool2d(net, [2, 2], scope='pool1')
          net = slim.repeat(net, 2, slim.conv2d, 128, [3, 3], scope='conv2')
          net = slim.max_pool2d(net, [2, 2], scope='pool2')
          net = slim.repeat(net, 3, slim.conv2d, 256, [3, 3], scope='conv3')
          net = slim.max_pool2d(net, [2, 2], scope='pool3')
          net = slim.repeat(net, 3, slim.conv2d, 512, [3, 3], scope='conv4')
          net = slim.max_pool2d(net, [2, 2], scope='pool4')
          net = slim.repeat(net, 3, slim.conv2d, 512, [3, 3], scope='conv5')
          net = slim.max_pool2d(net, [2, 2], scope='pool5')
    
          # Use conv2d instead of fully_connected layers.
          net = slim.conv2d(net, 4096, [7, 7], padding=fc_conv_padding, scope='fc6')
          net = slim.dropout(net, dropout_keep_prob, is_training=is_training,
                             scope='dropout6')
          net = slim.conv2d(net, 4096, [1, 1], scope='fc7')
          # Convert end_points_collection into a end_point dict.
          end_points = slim.utils.convert_collection_to_dict(end_points_collection)
          if global_pool:
            net = tf.reduce_mean(net, [1, 2], keep_dims=True, name='global_pool')
            end_points['global_pool'] = net
          if num_classes:
            net = slim.dropout(net, dropout_keep_prob, is_training=is_training,
                               scope='dropout7')
            net = slim.conv2d(net, num_classes, [1, 1],
                              activation_fn=None,
                              normalizer_fn=None,
                              scope='fc8')
            if spatial_squeeze and num_classes is not None:
              net = tf.squeeze(net, [1, 2], name='fc8/squeezed')
            end_points[sc.name + '/fc8'] = net
          return net, end_points
    vgg_16.default_image_size = 224
    
    

    莫烦python的二分类

    #!/usr/bin/python3
    # -*- coding: utf-8 -*-
    # @Time    : 2018/5/27 9:50
    # @Author  : yanghe
    # @File    : vgg16_test.py
    
    
    from urllib.request import urlretrieve
    import os
    import numpy as np
    import tensorflow as tf
    import skimage.io
    import skimage.transform
    import matplotlib.pyplot as plt
    
    
    def download():     # download tiger and kittycat image
        categories = ['tiger', 'kittycat']
        for category in categories:
            os.makedirs('./for_transfer_learning/data/%s' % category, exist_ok=True)
            with open('./for_transfer_learning/imagenet_%s.txt' % category, 'r') as file:
                urls = file.readlines()
                n_urls = len(urls)
                for i, url in enumerate(urls):
                    try:
                        urlretrieve(url.strip(), './for_transfer_learning/data/%s/%s' % (category, url.strip().split('/')[-1]))
                        print('%s %i/%i' % (category, i, n_urls))
                    except:
                        print('%s %i/%i' % (category, i, n_urls), 'no image')
    
    
    def load_img(path):
        img = skimage.io.imread(path)
        img = img / 255.0
        # print "Original Image Shape: ", img.shape
        # we crop image from center
        short_edge = min(img.shape[:2])
        yy = int((img.shape[0] - short_edge) / 2)
        xx = int((img.shape[1] - short_edge) / 2)
        crop_img = img[yy: yy + short_edge, xx: xx + short_edge]
        # resize to 224, 224
        resized_img = skimage.transform.resize(crop_img, (224, 224))[None, :, :, :]   # shape [1, 224, 224, 3]
        return resized_img
    
    
    def load_data():
        imgs = {'tiger': [], 'kittycat': []}
        for k in imgs.keys():
            dir = './for_transfer_learning/data/' + k
            for file in os.listdir(dir):
                if not file.lower().endswith('.jpg'):
                    continue
                try:
                    resized_img = load_img(os.path.join(dir, file))
                except OSError:
                    continue
                imgs[k].append(resized_img)    # [1, height, width, depth] * n
                if len(imgs[k]) == 400:        # only use 400 imgs to reduce my memory load
                    break
        # fake length data for tiger and cat
        tigers_y = np.maximum(20, np.random.randn(len(imgs['tiger']), 1) * 30 + 100)
        cat_y = np.maximum(10, np.random.randn(len(imgs['kittycat']), 1) * 8 + 40)
        return imgs['tiger'], imgs['kittycat'], tigers_y, cat_y
    
    
    class Vgg16:
        vgg_mean = [103.939, 116.779, 123.68]
    
        def __init__(self, vgg16_npy_path=None, restore_from=None):
            # pre-trained parameters
            try:
                self.data_dict = np.load(vgg16_npy_path, encoding='latin1').item()
            except FileNotFoundError:
                print('Please download VGG16 parameters at here https://mega.nz/#!YU1FWJrA!O1ywiCS2IiOlUCtCpI6HTJOMrneN-Qdv3ywQP5poecM')
    
            self.tfx = tf.placeholder(tf.float32, [None, 224, 224, 3])
            self.tfy = tf.placeholder(tf.float32, [None, 1])
    
            # Convert RGB to BGR
            red, green, blue = tf.split(axis=3, num_or_size_splits=3, value=self.tfx * 255.0)
            bgr = tf.concat(axis=3, values=[
                blue - self.vgg_mean[0],
                green - self.vgg_mean[1],
                red - self.vgg_mean[2],
            ])
    
            # pre-trained VGG layers are fixed in fine-tune
            conv1_1 = self.conv_layer(bgr, "conv1_1")
            conv1_2 = self.conv_layer(conv1_1, "conv1_2")
            pool1 = self.max_pool(conv1_2, 'pool1')
    
            conv2_1 = self.conv_layer(pool1, "conv2_1")
            conv2_2 = self.conv_layer(conv2_1, "conv2_2")
            pool2 = self.max_pool(conv2_2, 'pool2')
    
            conv3_1 = self.conv_layer(pool2, "conv3_1")
            conv3_2 = self.conv_layer(conv3_1, "conv3_2")
            conv3_3 = self.conv_layer(conv3_2, "conv3_3")
            pool3 = self.max_pool(conv3_3, 'pool3')
    
            conv4_1 = self.conv_layer(pool3, "conv4_1")
            conv4_2 = self.conv_layer(conv4_1, "conv4_2")
            conv4_3 = self.conv_layer(conv4_2, "conv4_3")
            pool4 = self.max_pool(conv4_3, 'pool4')
    
            conv5_1 = self.conv_layer(pool4, "conv5_1")
            conv5_2 = self.conv_layer(conv5_1, "conv5_2")
            conv5_3 = self.conv_layer(conv5_2, "conv5_3")
            pool5 = self.max_pool(conv5_3, 'pool5')
    
            # detach original VGG fc layers and
            # reconstruct your own fc layers serve for your own purpose
            self.flatten = tf.reshape(pool5, [-1, 7*7*512])
            self.fc6 = tf.layers.dense(self.flatten, 256, tf.nn.relu, name='fc6')
            self.out = tf.layers.dense(self.fc6, 1, name='out')
    
            self.sess = tf.Session()
            if restore_from:
                saver = tf.train.Saver()
                saver.restore(self.sess, restore_from)
            else:   # training graph
                self.loss = tf.losses.mean_squared_error(labels=self.tfy, predictions=self.out)
                self.train_op = tf.train.RMSPropOptimizer(0.001).minimize(self.loss)
                self.sess.run(tf.global_variables_initializer())
    
        def max_pool(self, bottom, name):
            return tf.nn.max_pool(bottom, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME', name=name)
    
        def conv_layer(self, bottom, name):
            with tf.variable_scope(name):   # CNN's filter is constant, NOT Variable that can be trained
                conv = tf.nn.conv2d(bottom, self.data_dict[name][0], [1, 1, 1, 1], padding='SAME')
                lout = tf.nn.relu(tf.nn.bias_add(conv, self.data_dict[name][1]))
                return lout
    
        def train(self, x, y):
            loss, _ = self.sess.run([self.loss, self.train_op], {self.tfx: x, self.tfy: y})
            return loss
    
        def predict(self, paths):
            fig, axs = plt.subplots(1, 2)
            for i, path in enumerate(paths):
                x = load_img(path)
                length = self.sess.run(self.out, {self.tfx: x})
                axs[i].imshow(x[0])
                axs[i].set_title('Len: %.1f cm' % length)
                axs[i].set_xticks(()); axs[i].set_yticks(())
            plt.show()
    
        def save(self, path='./for_transfer_learning/model/transfer_learn'):
            saver = tf.train.Saver()
            saver.save(self.sess, path, write_meta_graph=False)
    
    
    def train():
        tigers_x, cats_x, tigers_y, cats_y = load_data()
    
        # plot fake length distribution
        plt.hist(tigers_y, bins=20, label='Tigers')
        plt.hist(cats_y, bins=10, label='Cats')
        plt.legend()
        plt.xlabel('length')
        plt.show()
    
        xs = np.concatenate(tigers_x + cats_x, axis=0)
        ys = np.concatenate((tigers_y, cats_y), axis=0)
    
        vgg = Vgg16(vgg16_npy_path='./for_transfer_learning/vgg16.npy')
        print('Net built')
        for i in range(100):
            b_idx = np.random.randint(0, len(xs), 6)
            train_loss = vgg.train(xs[b_idx], ys[b_idx])
            print(i, 'train loss: ', train_loss)
    
        vgg.save('./for_transfer_learning/model/transfer_learn')      # save learned fc layers
    
    
    def eval():
        vgg = Vgg16(vgg16_npy_path='./for_transfer_learning/vgg16.npy',
                    restore_from='./for_transfer_learning/model/transfer_learn')
        vgg.predict(
            ['./for_transfer_learning/data/kittycat/000129037.jpg', './for_transfer_learning/data/tiger/391412.jpg'])
    
    
    if __name__ == '__main__':
        # download()
        # train()
        eval()
    

    以下是对先进行随机初始化在进行赋值操作

    # -*- coding: utf-8 -*-
    """
    Created on Thu Sep  6 17:37:30 2018
    
    @author: yanghe
    """
    
    ########################################################################################
    # Davi Frossard, 2016                                                                  #
    # VGG16 implementation in TensorFlow                                                   #
    # Details:                                                                             #
    # http://www.cs.toronto.edu/~frossard/post/vgg16/                                      #
    #                                                                                      #
    # Model from https://gist.github.com/ksimonyan/211839e770f7b538e2d8#file-readme-md     #
    # Weights from Caffe converted using https://github.com/ethereon/caffe-tensorflow      #
    ########################################################################################
    
    import tensorflow as tf
    import numpy as np
    from scipy.misc import imread, imresize
    from imagenet_classes import class_names
    
    
    class vgg16:
        def __init__(self, imgs, weights=None, sess=None):
            self.imgs = imgs
            self.convlayers()
            self.fc_layers()
            self.probs = tf.nn.softmax(self.fc3l)
            if weights is not None and sess is not None:
                self.load_weights(weights, sess)
    
    
        def convlayers(self):
            self.parameters = []
    
            # zero-mean input
            with tf.name_scope('preprocess') as scope:
                mean = tf.constant([123.68, 116.779, 103.939], dtype=tf.float32, shape=[1, 1, 1, 3], name='img_mean')
                images = self.imgs-mean
    
            # conv1_1
            with tf.name_scope('conv1_1') as scope:
                kernel = tf.Variable(tf.truncated_normal([3, 3, 3, 64], dtype=tf.float32,
                                                         stddev=1e-1), name='weights')
                conv = tf.nn.conv2d(images, kernel, [1, 1, 1, 1], padding='SAME')
                biases = tf.Variable(tf.constant(0.0, shape=[64], dtype=tf.float32),
                                     trainable=True, name='biases')
                out = tf.nn.bias_add(conv, biases)
                self.conv1_1 = tf.nn.relu(out, name=scope)
                self.parameters += [kernel, biases]
    
            # conv1_2
            with tf.name_scope('conv1_2') as scope:
                kernel = tf.Variable(tf.truncated_normal([3, 3, 64, 64], dtype=tf.float32,
                                                         stddev=1e-1), name='weights')
                conv = tf.nn.conv2d(self.conv1_1, kernel, [1, 1, 1, 1], padding='SAME')
                biases = tf.Variable(tf.constant(0.0, shape=[64], dtype=tf.float32),
                                     trainable=True, name='biases')
                out = tf.nn.bias_add(conv, biases)
                self.conv1_2 = tf.nn.relu(out, name=scope)
                self.parameters += [kernel, biases]
    
            # pool1
            self.pool1 = tf.nn.max_pool(self.conv1_2,
                                   ksize=[1, 2, 2, 1],
                                   strides=[1, 2, 2, 1],
                                   padding='SAME',
                                   name='pool1')
    
            # conv2_1
            with tf.name_scope('conv2_1') as scope:
                kernel = tf.Variable(tf.truncated_normal([3, 3, 64, 128], dtype=tf.float32,
                                                         stddev=1e-1), name='weights')
                conv = tf.nn.conv2d(self.pool1, kernel, [1, 1, 1, 1], padding='SAME')
                biases = tf.Variable(tf.constant(0.0, shape=[128], dtype=tf.float32),
                                     trainable=True, name='biases')
                out = tf.nn.bias_add(conv, biases)
                self.conv2_1 = tf.nn.relu(out, name=scope)
                self.parameters += [kernel, biases]
    
            # conv2_2
            with tf.name_scope('conv2_2') as scope:
                kernel = tf.Variable(tf.truncated_normal([3, 3, 128, 128], dtype=tf.float32,
                                                         stddev=1e-1), name='weights')
                conv = tf.nn.conv2d(self.conv2_1, kernel, [1, 1, 1, 1], padding='SAME')
                biases = tf.Variable(tf.constant(0.0, shape=[128], dtype=tf.float32),
                                     trainable=True, name='biases')
                out = tf.nn.bias_add(conv, biases)
                self.conv2_2 = tf.nn.relu(out, name=scope)
                self.parameters += [kernel, biases]
    
            # pool2
            self.pool2 = tf.nn.max_pool(self.conv2_2,
                                   ksize=[1, 2, 2, 1],
                                   strides=[1, 2, 2, 1],
                                   padding='SAME',
                                   name='pool2')
    
            # conv3_1
            with tf.name_scope('conv3_1') as scope:
                kernel = tf.Variable(tf.truncated_normal([3, 3, 128, 256], dtype=tf.float32,
                                                         stddev=1e-1), name='weights')
                conv = tf.nn.conv2d(self.pool2, kernel, [1, 1, 1, 1], padding='SAME')
                biases = tf.Variable(tf.constant(0.0, shape=[256], dtype=tf.float32),
                                     trainable=True, name='biases')
                out = tf.nn.bias_add(conv, biases)
                self.conv3_1 = tf.nn.relu(out, name=scope)
                self.parameters += [kernel, biases]
    
            # conv3_2
            with tf.name_scope('conv3_2') as scope:
                kernel = tf.Variable(tf.truncated_normal([3, 3, 256, 256], dtype=tf.float32,
                                                         stddev=1e-1), name='weights')
                conv = tf.nn.conv2d(self.conv3_1, kernel, [1, 1, 1, 1], padding='SAME')
                biases = tf.Variable(tf.constant(0.0, shape=[256], dtype=tf.float32),
                                     trainable=True, name='biases')
                out = tf.nn.bias_add(conv, biases)
                self.conv3_2 = tf.nn.relu(out, name=scope)
                self.parameters += [kernel, biases]
    
            # conv3_3
            with tf.name_scope('conv3_3') as scope:
                kernel = tf.Variable(tf.truncated_normal([3, 3, 256, 256], dtype=tf.float32,
                                                         stddev=1e-1), name='weights')
                conv = tf.nn.conv2d(self.conv3_2, kernel, [1, 1, 1, 1], padding='SAME')
                biases = tf.Variable(tf.constant(0.0, shape=[256], dtype=tf.float32),
                                     trainable=True, name='biases')
                out = tf.nn.bias_add(conv, biases)
                self.conv3_3 = tf.nn.relu(out, name=scope)
                self.parameters += [kernel, biases]
    
            # pool3
            self.pool3 = tf.nn.max_pool(self.conv3_3,
                                   ksize=[1, 2, 2, 1],
                                   strides=[1, 2, 2, 1],
                                   padding='SAME',
                                   name='pool3')
    
            # conv4_1
            with tf.name_scope('conv4_1') as scope:
                kernel = tf.Variable(tf.truncated_normal([3, 3, 256, 512], dtype=tf.float32,
                                                         stddev=1e-1), name='weights')
                conv = tf.nn.conv2d(self.pool3, kernel, [1, 1, 1, 1], padding='SAME')
                biases = tf.Variable(tf.constant(0.0, shape=[512], dtype=tf.float32),
                                     trainable=True, name='biases')
                out = tf.nn.bias_add(conv, biases)
                self.conv4_1 = tf.nn.relu(out, name=scope)
                self.parameters += [kernel, biases]
    
            # conv4_2
            with tf.name_scope('conv4_2') as scope:
                kernel = tf.Variable(tf.truncated_normal([3, 3, 512, 512], dtype=tf.float32,
                                                         stddev=1e-1), name='weights')
                conv = tf.nn.conv2d(self.conv4_1, kernel, [1, 1, 1, 1], padding='SAME')
                biases = tf.Variable(tf.constant(0.0, shape=[512], dtype=tf.float32),
                                     trainable=True, name='biases')
                out = tf.nn.bias_add(conv, biases)
                self.conv4_2 = tf.nn.relu(out, name=scope)
                self.parameters += [kernel, biases]
    
            # conv4_3
            with tf.name_scope('conv4_3') as scope:
                kernel = tf.Variable(tf.truncated_normal([3, 3, 512, 512], dtype=tf.float32,
                                                         stddev=1e-1), name='weights')
                conv = tf.nn.conv2d(self.conv4_2, kernel, [1, 1, 1, 1], padding='SAME')
                biases = tf.Variable(tf.constant(0.0, shape=[512], dtype=tf.float32),
                                     trainable=True, name='biases')
                out = tf.nn.bias_add(conv, biases)
                self.conv4_3 = tf.nn.relu(out, name=scope)
                self.parameters += [kernel, biases]
    
            # pool4
            self.pool4 = tf.nn.max_pool(self.conv4_3,
                                   ksize=[1, 2, 2, 1],
                                   strides=[1, 2, 2, 1],
                                   padding='SAME',
                                   name='pool4')
    
            # conv5_1
            with tf.name_scope('conv5_1') as scope:
                kernel = tf.Variable(tf.truncated_normal([3, 3, 512, 512], dtype=tf.float32,
                                                         stddev=1e-1), name='weights')
                conv = tf.nn.conv2d(self.pool4, kernel, [1, 1, 1, 1], padding='SAME')
                biases = tf.Variable(tf.constant(0.0, shape=[512], dtype=tf.float32),
                                     trainable=True, name='biases')
                out = tf.nn.bias_add(conv, biases)
                self.conv5_1 = tf.nn.relu(out, name=scope)
                self.parameters += [kernel, biases]
    
            # conv5_2
            with tf.name_scope('conv5_2') as scope:
                kernel = tf.Variable(tf.truncated_normal([3, 3, 512, 512], dtype=tf.float32,
                                                         stddev=1e-1), name='weights')
                conv = tf.nn.conv2d(self.conv5_1, kernel, [1, 1, 1, 1], padding='SAME')
                biases = tf.Variable(tf.constant(0.0, shape=[512], dtype=tf.float32),
                                     trainable=True, name='biases')
                out = tf.nn.bias_add(conv, biases)
                self.conv5_2 = tf.nn.relu(out, name=scope)
                self.parameters += [kernel, biases]
    
            # conv5_3
            with tf.name_scope('conv5_3') as scope:
                kernel = tf.Variable(tf.truncated_normal([3, 3, 512, 512], dtype=tf.float32,
                                                         stddev=1e-1), name='weights')
                conv = tf.nn.conv2d(self.conv5_2, kernel, [1, 1, 1, 1], padding='SAME')
                biases = tf.Variable(tf.constant(0.0, shape=[512], dtype=tf.float32),
                                     trainable=True, name='biases')
                out = tf.nn.bias_add(conv, biases)
                self.conv5_3 = tf.nn.relu(out, name=scope)
                self.parameters += [kernel, biases]
    
            # pool5
            self.pool5 = tf.nn.max_pool(self.conv5_3,
                                   ksize=[1, 2, 2, 1],
                                   strides=[1, 2, 2, 1],
                                   padding='SAME',
                                   name='pool4')
    
        def fc_layers(self):
            # fc1
            with tf.name_scope('fc1') as scope:
                shape = int(np.prod(self.pool5.get_shape()[1:]))
                fc1w = tf.Variable(tf.truncated_normal([shape, 4096],
                                                             dtype=tf.float32,
                                                             stddev=1e-1), name='weights')
                fc1b = tf.Variable(tf.constant(1.0, shape=[4096], dtype=tf.float32),
                                     trainable=True, name='biases')
                pool5_flat = tf.reshape(self.pool5, [-1, shape])
                fc1l = tf.nn.bias_add(tf.matmul(pool5_flat, fc1w), fc1b)
                self.fc1 = tf.nn.relu(fc1l)
                self.parameters += [fc1w, fc1b]
    
            # fc2
            with tf.name_scope('fc2') as scope:
                fc2w = tf.Variable(tf.truncated_normal([4096, 4096],
                                                             dtype=tf.float32,
                                                             stddev=1e-1), name='weights')
                fc2b = tf.Variable(tf.constant(1.0, shape=[4096], dtype=tf.float32),
                                     trainable=True, name='biases')
                fc2l = tf.nn.bias_add(tf.matmul(self.fc1, fc2w), fc2b)
                self.fc2 = tf.nn.relu(fc2l)
                self.parameters += [fc2w, fc2b]
    
            # fc3
            with tf.name_scope('fc3') as scope:
                fc3w = tf.Variable(tf.truncated_normal([4096, 1000],
                                                             dtype=tf.float32,
                                                             stddev=1e-1), name='weights')
                fc3b = tf.Variable(tf.constant(1.0, shape=[1000], dtype=tf.float32),
                                     trainable=True, name='biases')
                self.fc3l = tf.nn.bias_add(tf.matmul(self.fc2, fc3w), fc3b)
                self.parameters += [fc3w, fc3b]
    
        def load_weights(self, weight_file, sess):
            weights = np.load(weight_file)
            keys = sorted(weights.keys())
            for i, k in enumerate(keys):
                print( i, k, np.shape(weights[k]))
                sess.run(self.parameters[i].assign(weights[k]))
    
    if __name__ == '__main__':
        sess = tf.Session()
        imgs = tf.placeholder(tf.float32, [None, 224, 224, 3])
        vgg = vgg16(imgs, 'vgg16_weights.npz', sess)
    
        img1 = imread('laska.png', mode='RGB')
        img1 = imresize(img1, (224, 224))
    
        prob = sess.run(vgg.probs, feed_dict={vgg.imgs: [img1]})[0]
        preds = (np.argsort(prob)[::-1])[0:5]
        for p in preds:
            print( class_names[p], prob[p])
    

    对导入的np矩阵文件进行操作

    from model import Model
    import tensorflow as tf
    from imagenet_classes import class_names
    import numpy as np
    # from imagenet_classes import class_names
    from scipy.misc import imread, imresize
    from PIL import Image
    
    class Vgg16(Model):
        def __init__(self):
            self.inputs_placeholder = None
            self.labels_placeholder = None
            self.build()
    
        def load_weights(self, weights_file, sess):
            weights = np.load(weights_file)
            keys = sorted(weights.keys())
            variables = tf.global_variables()[:len(keys)]
    
            for i, k in enumerate(keys):
                print(i, k, np.shape(keys), variables[i].name)
                sess.run(variables[i].assign(weights[k]))
    
        def add_conv3(self, inputs, num_filters, activation_fn=tf.nn.relu, scope=None):
            '''
            CONV3
            kernel_size=3
            '''
            return tf.contrib.layers.conv2d(
                inputs=inputs,
                num_outputs=num_filters,
                kernel_size=3,
                padding='SAME',
                activation_fn=activation_fn,
                scope=scope
            )
        
        def add_max_pool(self, inputs):
            return tf.contrib.layers.max_pool2d(
                inputs=inputs,
                kernel_size=2,
                stride=2,
                padding='VALID',
            )
    
        def add_fc(self, inputs, num_outputs, activation_fn=tf.nn.relu, scope=None):
            return tf.contrib.layers.fully_connected(
                inputs=inputs,
                num_outputs=num_outputs,
                scope=scope,
                activation_fn=activation_fn
            )
    
        def add_prediction_op(self):
            X = self.inputs_placeholder # 224x224x3
    
            vgg_mean = tf.constant([123.68, 116.779, 103.939], dtype=tf.float32, shape=(1, 1, 1, 3), name='vgg_mean')
    
            X -= vgg_mean
    
            with tf.name_scope('conv1_1') as scope:
                a = self.add_conv3(X, 64, scope=scope)
            with tf.name_scope('conv1_2') as scope:
                a = self.add_conv3(a, 64, scope=scope)
            a = self.add_max_pool(a)
    
            with tf.name_scope('conv2_1') as scope:
                a = self.add_conv3(a, 128, scope=scope)
            with tf.name_scope('conv2_2') as scope:
                a = self.add_conv3(a, 128, scope=scope)
            a = self.add_max_pool(a)
    
            with tf.name_scope('conv3_1') as scope:
                a = self.add_conv3(a, 256, scope=scope)
            with tf.name_scope('conv3_2') as scope:
                a = self.add_conv3(a, 256, scope=scope)
            with tf.name_scope('conv3_3') as scope:
                a = self.add_conv3(a, 256, scope=scope)
            a = self.add_max_pool(a)
    
            with tf.name_scope('conv4_1') as scope:
                a = self.add_conv3(a, 512, scope=scope)
            with tf.name_scope('conv4_2') as scope:
                a = self.add_conv3(a, 512, scope=scope)
            with tf.name_scope('conv4_3') as scope:
                a = self.add_conv3(a, 512, scope=scope)
            a = self.add_max_pool(a)
    
            with tf.name_scope('conv5_1') as scope:
                a = self.add_conv3(a, 512, scope=scope)
            with tf.name_scope('conv5_2') as scope:
                a = self.add_conv3(a, 512, scope=scope)
            with tf.name_scope('conv5_3') as scope:
                a = self.add_conv3(a, 512, scope=scope)
            a = self.add_max_pool(a)
    
            a = tf.contrib.layers.flatten(a)
    
            with tf.name_scope('fc6') as scope:
                a = self.add_fc(a, 4096, scope=scope)
            with tf.name_scope('fc7') as scope:
                a = self.add_fc(a, 4096, scope=scope)
    
            with tf.name_scope('fc8') as scope:
                a = self.add_fc(a, 1000, None, scope)
    
            pred = a
    
            return pred
    
        def add_placeholders(self):
            self.inputs_placeholder = tf.placeholder(tf.float32, shape=(None, 224,224, 3))
    
        def create_feed_dict(self, inputs_batch, labels_batch=None):
            feed_dict = {
                self.inputs_placeholder : inputs_batch,
            }
            if labels_batch is not None:
                feed_dict[self.labels_placeholder] = labels_batch
            return feed_dict
    
        def predict(self, sess, inputs):
            '''
            The step to predict the image
            '''
            feed_dict = self.create_feed_dict(inputs)
            prob = sess.run(tf.nn.softmax(self.pred), feed_dict)
            
    #        preds = np.argmax(prob, axis=1)
            return prob
    
        def add_loss_op(self, pred):
            return None
    
        def add_training_op(self, loss):
            pass
            
            
    if __name__=='__main__':
        img = Image.open('cat.1.jpg').resize((224,224))
        print(img)
        
        model = Vgg16()
        # print([x.name for x in tf.global_variables()])
        # img = imread('laska.png', mode='RGB')
        # img = imresize(img, (224,224))
        
        X = np.array([np.asarray(img), np.asarray(img)])
        # X = (X - X.mean(axis=0)) / X.std(axis=0)
        print(X.shape)
        with tf.Session() as sess:
            model.load_weights('../vgg16_weights.npz', sess)
            prob = model.predict(sess, X)
        preds = (np.argsort(prob)[0][0][::-1])[0:5]
        print(preds)
        for p in preds:
            print( class_names[p], prob[p])
    

    下面是导入*model.ckpt文件时操作

    # -*- coding: utf-8 -*-
    """
    Created on Fri Sep  7 19:44:44 2018
    
    @author: yanghe
    """
    import tensorflow as tf
    import tensorflow.contrib.slim as slim
    import tensorflow.contrib.slim.nets as nets
    #from tensorflow.contrib.slim.nets.inception import inception_v3, inception_v3_arg_scope
    import numpy as np
    
    height = 224
    width = 224
    channels = 3
    num_classes=1000
    
    X = tf.placeholder(tf.float32, shape=[None, height, width, channels])
    y = tf.placeholder(tf.float32,shape=[None,182])
    with slim.arg_scope(nets.vgg.vgg_arg_scope()):
        logits, end_points = nets.vgg.vgg_16(X, num_classes=num_classes,is_training=False)
        exclude=[]
        variables_to_restore=slim.get_variables_to_restore()
        '''
        for v in variables_to_restore:
            if 'Mixed_7c' not in v.name:
                exclude.append(v)
        '''
    saver = tf.train.Saver()
    with tf.Session() as sess:
        saver.restore(sess,'./vgg_16.ckpt')
        writer = tf.summary.FileWriter('./logs', sess.graph)
        writer.close()
        shape=logits.get_shape().as_list()
        dim=1
        for d in shape[1:]:
            dim*=d
        fc_=tf.reshape(logits,[-1,dim])
    
    #修改最后面的fc8需要进行微调   fc0_weights=tf.get_variable(name="vgg_16/fc8/weights",shape=(1000,2),initializer=tf.contrib.layers.xavier_initializer())
        fc0_biases=tf.get_variable(name="vgg_16/fc8/biases",shape=(2),initializer=tf.contrib.layers.xavier_initializer())
        logits_=tf.nn.bias_add(tf.matmul(fc_,fc0_weights),fc0_biases)
        predictions=tf.nn.softmax(logits_)
        #cross_entropy = -tf.reduce_sum(y*tf.log(predictions))  
        cross_entropy=tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y,logits=logits_))
        #cross_entropy_mean=tf.reduce_mean(cross_entropy)
        train_step=tf.train.GradientDescentOptimizer(1e-6).minimize(cross_entropy)
    
        correct_pred=tf.equal(tf.argmax(y,1),tf.argmax(predictions,1))
        #acc=tf.reduce_sum(tf.cast(correct_pred,tf.float32))
        accuracy=tf.reduce_mean(tf.cast(correct_pred,tf.float32))
    
    with tf.Session() as sess:
    
        o_dir="E:/test"
        num_classes=182
        batch_size=3
        epoches=2
        batches=img_convert.data_lrn(img_convert.load_data(o_dir,num_classes,batch_size))
        sess.run(tf.global_variables_initializer())
        saver=tf.train.Saver(variables_to_restore)
        saver.restore(sess,os.path.join("E:\\","inception_v3.ckpt"))
        for epoch in range(epoches):
            for batch in batches:
                sess.run(train_step,feed_dict={X:batch[0],y:batch[1]})
        acc=sess.run(accuracy,feed_dict={X:batches[0][0],y:batches[1][1]})
        print(acc)
        print("Done")
    

    相关文章

      网友评论

          本文标题:tensorflow迁移学习(续集)对于完全陌生的model文件

          本文链接:https://www.haomeiwen.com/subject/qjehgftx.html