def testRaiseValueErrorWithInvalidDepthMultiplier(self):
        batch_size = 5
        height, width = 224, 224
        num_classes = 1000

        inputs = tf.random_uniform((batch_size, height, width, 3))
        with self.assertRaises(ValueError):
            _ = mobilenet_v1.mobilenet_v1(inputs,
                                          num_classes,
                                          depth_multiplier=-0.1)
        with self.assertRaises(ValueError):
            _ = mobilenet_v1.mobilenet_v1(inputs,
                                          num_classes,
                                          depth_multiplier=0.0)
Beispiel #2
0
def  predict(models_path,image_dir,labels_filename,labels_nums, data_format):
    [batch_size, resize_height, resize_width, depths] = data_format

    #labels = np.loadtxt(labels_filename, str, delimiter='\t')
    input_images = tf.placeholder(dtype=tf.float32, shape=[None, resize_height, resize_width, depths], name='input')

    #其他模型预测请修改这里
    with slim.arg_scope(mobilenet_v1.mobilenet_v1_arg_scope()):
        out, end_points = mobilenet_v1.mobilenet_v1(inputs=input_images, num_classes=labels_nums, dropout_keep_prob=1.0, is_training=False,global_pool=True)

    # 将输出结果进行softmax分布,再求最大概率所属类别
    score = tf.nn.softmax(out,name='pre')
    class_id = tf.argmax(score, 1)

    sess = tf.InteractiveSession()
    sess.run(tf.global_variables_initializer())
    saver = tf.train.Saver()
    saver.restore(sess, models_path)
    images_list=glob.glob(os.path.join(image_dir,'*.jpg'))
    for image_path in images_list:
        im=read_image(image_path,resize_height,resize_width,normalization=True)
        im=im[np.newaxis,:]
        #pred = sess.run(f_cls, feed_dict={x:im, keep_prob:1.0})
        pre_score,pre_label = sess.run([score,class_id], feed_dict={input_images:im})
        max_score=pre_score[0,pre_label]
        print("{} is: pre labels:{},name:{} score: {}".format(image_path,pre_label,list(labels_filename.keys())[list(labels_filename.values()).index(pre_label)], max_score))
    sess.close()
Beispiel #3
0
def build_model():
    """Build the mobilenet_v1 model for evaluation.

  Returns:
    g: graph with rewrites after insertion of quantization ops and batch norm
    folding.
    eval_ops: eval ops for inference.
    variables_to_restore: List of variables to restore from checkpoint.
  """
    g = tf.Graph()
    with g.as_default():
        inputs, labels = imagenet_input(is_training=False)

        scope = mobilenet_v1.mobilenet_v1_arg_scope(is_training=False,
                                                    weight_decay=0.0)
        with slim.arg_scope(scope):
            logits, _ = mobilenet_v1.mobilenet_v1(
                inputs,
                is_training=False,
                depth_multiplier=FLAGS.depth_multiplier,
                num_classes=FLAGS.num_classes)

        if FLAGS.quantize:
            tf.contrib.quantize.create_eval_graph()

        eval_ops = metrics(logits, labels)

    return g, eval_ops
Beispiel #4
0
def get_variables_mapping(inputs,model_variables):
    logits_slim, end_points_slim = mobilenet_v1.mobilenet_v1(inputs, scope='MobileNetV1')
    model_variables_slim = slim.get_model_variables(scope='MobileNetV1')
    model_variables_maping = {}
    for i, j in zip(model_variables, model_variables_slim):
        if 'Logits' not in j.name:
            model_variables_maping[j.name] = i
    return model_variables_maping
    def testTrainEvalWithReuse(self):
        train_batch_size = 5
        eval_batch_size = 2
        height, width = 150, 150
        num_classes = 1000

        train_inputs = tf.random_uniform((train_batch_size, height, width, 3))
        mobilenet_v1.mobilenet_v1(train_inputs, num_classes)
        eval_inputs = tf.random_uniform((eval_batch_size, height, width, 3))
        logits, _ = mobilenet_v1.mobilenet_v1(eval_inputs,
                                              num_classes,
                                              reuse=True)
        predictions = tf.argmax(logits, 1)

        with self.test_session() as sess:
            sess.run(tf.global_variables_initializer())
            output = sess.run(predictions)
            self.assertEquals(output.shape, (eval_batch_size, ))
    def testBuildPreLogitsNetwork(self):
        batch_size = 5
        height, width = 224, 224
        num_classes = None

        inputs = tf.random_uniform((batch_size, height, width, 3))
        net, end_points = mobilenet_v1.mobilenet_v1(inputs, num_classes)
        self.assertTrue(net.op.name.startswith('MobilenetV1/Logits/AvgPool'))
        self.assertListEqual(net.get_shape().as_list(),
                             [batch_size, 1, 1, 1024])
        self.assertFalse('Logits' in end_points)
        self.assertFalse('Predictions' in end_points)
    def testLogitsNotSqueezed(self):
        num_classes = 25
        images = tf.random_uniform([1, 224, 224, 3])
        logits, _ = mobilenet_v1.mobilenet_v1(images,
                                              num_classes=num_classes,
                                              spatial_squeeze=False)

        with self.test_session() as sess:
            tf.global_variables_initializer().run()
            logits_out = sess.run(logits)
            self.assertListEqual(list(logits_out.shape),
                                 [1, 1, 1, num_classes])
    def testHalfSizeImages(self):
        batch_size = 5
        height, width = 112, 112
        num_classes = 1000

        inputs = tf.random_uniform((batch_size, height, width, 3))
        logits, end_points = mobilenet_v1.mobilenet_v1(inputs, num_classes)
        self.assertTrue(logits.op.name.startswith('MobilenetV1/Logits'))
        self.assertListEqual(logits.get_shape().as_list(),
                             [batch_size, num_classes])
        pre_pool = end_points['Conv2d_13_pointwise']
        self.assertListEqual(pre_pool.get_shape().as_list(),
                             [batch_size, 4, 4, 1024])
    def testBuildEndPointsWithDepthMultiplierLessThanOne(self):
        batch_size = 5
        height, width = 224, 224
        num_classes = 1000

        inputs = tf.random_uniform((batch_size, height, width, 3))
        _, end_points = mobilenet_v1.mobilenet_v1(inputs, num_classes)

        endpoint_keys = [
            key for key in end_points.keys() if key.startswith('Conv')
        ]

        _, end_points_with_multiplier = mobilenet_v1.mobilenet_v1(
            inputs,
            num_classes,
            scope='depth_multiplied_net',
            depth_multiplier=0.5)

        for key in endpoint_keys:
            original_depth = end_points[key].get_shape().as_list()[3]
            new_depth = end_points_with_multiplier[key].get_shape().as_list(
            )[3]
            self.assertEqual(0.5 * original_depth, new_depth)
    def testBuildClassificationNetwork(self):
        batch_size = 5
        height, width = 224, 224
        num_classes = 1000

        inputs = tf.random_uniform((batch_size, height, width, 3))
        logits, end_points = mobilenet_v1.mobilenet_v1(inputs, num_classes)
        self.assertTrue(
            logits.op.name.startswith('MobilenetV1/Logits/SpatialSqueeze'))
        self.assertListEqual(logits.get_shape().as_list(),
                             [batch_size, num_classes])
        self.assertTrue('Predictions' in end_points)
        self.assertListEqual(end_points['Predictions'].get_shape().as_list(),
                             [batch_size, num_classes])
Beispiel #11
0
def build_model():
    """Builds graph for model to train with rewrites for quantization.

  Returns:
    g: Graph with fake quantization ops and batch norm folding suitable for
    training quantized weights.
    train_tensor: Train op for execution during training.
  """
    g = tf.Graph()
    with g.as_default(), tf.device(
            tf.train.replica_device_setter(FLAGS.ps_tasks)):
        inputs, labels = imagenet_input(is_training=True)
        with slim.arg_scope(
                mobilenet_v1.mobilenet_v1_arg_scope(is_training=True)):
            logits, _ = mobilenet_v1.mobilenet_v1(
                inputs,
                is_training=True,
                depth_multiplier=FLAGS.depth_multiplier,
                num_classes=FLAGS.num_classes)

        tf.losses.softmax_cross_entropy(labels, logits)

        # Call rewriter to produce graph with fake quant ops and folded batch norms
        # quant_delay delays start of quantization till quant_delay steps, allowing
        # for better model accuracy.
        if FLAGS.quantize:
            tf.contrib.quantize.create_training_graph(
                quant_delay=get_quant_delay())

        total_loss = tf.losses.get_total_loss(name='total_loss')
        # Configure the learning rate using an exponential decay.
        num_epochs_per_decay = 2.5
        imagenet_size = 1271167
        decay_steps = int(imagenet_size / FLAGS.batch_size *
                          num_epochs_per_decay)

        learning_rate = tf.train.exponential_decay(
            get_learning_rate(),
            tf.train.get_or_create_global_step(),
            decay_steps,
            _LEARNING_RATE_DECAY_FACTOR,
            staircase=True)
        opt = tf.train.GradientDescentOptimizer(learning_rate)

        train_tensor = slim.learning.create_train_op(total_loss, optimizer=opt)

    slim.summaries.add_scalar_summary(total_loss, 'total_loss', 'losses')
    slim.summaries.add_scalar_summary(learning_rate, 'learning_rate',
                                      'training')
    return g, train_tensor
    def testEvaluation(self):
        batch_size = 2
        height, width = 224, 224
        num_classes = 1000

        eval_inputs = tf.random_uniform((batch_size, height, width, 3))
        logits, _ = mobilenet_v1.mobilenet_v1(eval_inputs,
                                              num_classes,
                                              is_training=False)
        predictions = tf.argmax(logits, 1)

        with self.test_session() as sess:
            sess.run(tf.global_variables_initializer())
            output = sess.run(predictions)
            self.assertEquals(output.shape, (batch_size, ))
    def testUnknowBatchSize(self):
        batch_size = 1
        height, width = 224, 224
        num_classes = 1000

        inputs = tf.placeholder(tf.float32, (None, height, width, 3))
        logits, _ = mobilenet_v1.mobilenet_v1(inputs, num_classes)
        self.assertTrue(logits.op.name.startswith('MobilenetV1/Logits'))
        self.assertListEqual(logits.get_shape().as_list(), [None, num_classes])
        images = tf.random_uniform((batch_size, height, width, 3))

        with self.test_session() as sess:
            sess.run(tf.global_variables_initializer())
            output = sess.run(logits, {inputs: images.eval()})
            self.assertEquals(output.shape, (batch_size, num_classes))
 def testUnknownImageShape(self):
     tf.reset_default_graph()
     batch_size = 2
     height, width = 224, 224
     num_classes = 1000
     input_np = np.random.uniform(0, 1, (batch_size, height, width, 3))
     with self.test_session() as sess:
         inputs = tf.placeholder(tf.float32,
                                 shape=(batch_size, None, None, 3))
         logits, end_points = mobilenet_v1.mobilenet_v1(inputs, num_classes)
         self.assertTrue(logits.op.name.startswith('MobilenetV1/Logits'))
         self.assertListEqual(logits.get_shape().as_list(),
                              [batch_size, num_classes])
         pre_pool = end_points['Conv2d_13_pointwise']
         feed_dict = {inputs: input_np}
         tf.global_variables_initializer().run()
         pre_pool_out = sess.run(pre_pool, feed_dict=feed_dict)
         self.assertListEqual(list(pre_pool_out.shape),
                              [batch_size, 7, 7, 1024])
Beispiel #15
0
def main(_):
  batch_shape = [FLAGS.batch_size, FLAGS.image_height, FLAGS.image_width, 3]
  num_classes = 1001

  print ("tsdeepak testing")
  print (FLAGS.input_dir)
  print (FLAGS.output_file)
  print (FLAGS.checkpoint_path)
  import os
  print ("directory")
  print (os.path.dirname(os.path.realpath(__file__)))
  print (os.getcwd())

  tf.logging.set_verbosity(tf.logging.INFO)

  with tf.Graph().as_default():
    # Prepare graph
    x_input = tf.placeholder(tf.float32, shape=batch_shape)

    with slim.arg_scope(mobilenet.mobilenet_v1_arg_scope()):
      _, end_points = mobilenet.mobilenet_v1(
          x_input, num_classes=num_classes, is_training=False, spatial_squeeze=False)

    predicted_labels = tf.argmax(end_points['Predictions'], 1)

    # Run computation
    saver = tf.train.Saver(slim.get_model_variables())
    session_creator = tf.train.ChiefSessionCreator(
        scaffold=tf.train.Scaffold(saver=saver),
        checkpoint_filename_with_path=FLAGS.checkpoint_path,
        master=FLAGS.master)

    with tf.train.MonitoredSession(session_creator=session_creator) as sess:
      with tf.gfile.Open(FLAGS.output_file, 'w') as out_file:
        for filenames, images in load_images(FLAGS.input_dir, batch_shape):
          labels = sess.run(predicted_labels, feed_dict={x_input: images})
          for filename, label in zip(filenames, labels):
            out_file.write('{0},{1}\n'.format(filename, label))
Beispiel #16
0
def eavluate(path,resultfile,recordfile):
    '''
    with tf.device('/cpu:0'):
        test_set = os.path.join(CN.folder_of_dataset,'ignorepositiontest.tfrecords')
        capacity = 1000+3*CN.BATCH_SIZE
        test_data,test_label = CN.read_tfrecords(test_set)
        xtest,y_test = tf.train.shuffle_batch([test_data,test_label],batch_size = 20000,capacity = capacity,min_after_dequeue = 30)
    '''
        #train_set = os.path.join(CNN_train2.folder_of_dataset,'140*400train.tfrecords')
        #capacity = 1000+3*CNN_train2.BATCH_SIZE
        #train_data,train_label = CNN_train2.read_tfrecords(train_set)
        #xtrain,y_train = tf.train.shuffle_batch([train_data,train_label],batch_size = CNN_train2.BATCH_SIZE,capacity = capacity,min_after_dequeue = 30)

    '''
    with tf.Graph() as_default() as g:
        x = tf.placeholder(tf.float32,[None,INPUT_NODE],name = 'x-input')
        y_ = tf.placeholder(tf.float32,[None,OUTPUT_NODE],name = 'y-input')
    validate_feed = {x:testdata,y_:testlabel}
    '''
    inputdata,arraylength = GetDate(path,recordfile)
    inputdata = tf.convert_to_tensor(inputdata)
    inputdata = tf.reshape(inputdata,(arraylength,140,400,1))
    inputdata = tf.cast(inputdata,dtype=tf.float32)
    train = False
    labels_nums = 2
    keep_prob=1
    with slim.arg_scope(mobilenet_v1.mobilenet_v1_arg_scope()):
        out,end_points=mobilenet_v1.mobilenet_v1(inputs=inputdata,num_classes=labels_nums,dropout_keep_prob=keep_prob,is_training=train,global_pool=True)
    #ytest = CNN_inference.inference(inputdata,train,None)
    outputprobability = tf.nn.softmax(out)
    #ytrain = CNN_inference.inference(xtrain,train,None)
    #correct_prediction_test = tf.equal(tf.argmax(ytest,1),tf.argmax(y_test,1))
    #correct_prediction_train = tf.equal(tf.argmax(ytrain,1),tf.argmax(y_train,1))
    #accuracy_test = tf.reduce_mean(tf.cast(correct_prediction_test,tf.float32))
    #accuracy_train = tf.reduce_mean(tf.cast(correct_prediction_train,tf.float32))
    #variable_averages = tf.train.ExponentialMovingAverage(0.99)
    #variables_to_restore = variable_averages.variables_to_restore()
    saver = tf.train.Saver()
    #resultfile = './result.txt'
    #while True:
    with tf.Session() as sess:
        tf.get_variable_scope().reuse_variables()
        #coord = tf.train.Coordinator()
        #threads = tf.train.start_queue_runners(sess = sess,coord = coord)
        ckpt = tf.train.get_checkpoint_state(MODEL_SAVE_PATH)
        if ckpt and ckpt.model_checkpoint_path:
            saver.restore(sess,ckpt.model_checkpoint_path)
            #global_step = ckpt.model_checkpoint_path.split('/')[-1].split('-')[-1]
            #print ('**************************')
            #print (global_step)
            #global_step = tf.cast(global_step,dtype=tf.int32)
            #global_step
            #print (type(global_step))
            probabilitylist = sess.run(outputprobability)
            probabilityresult = probabilitylist
            print (type(probabilitylist))
            print (probabilityresult)
            np.savetxt(resultfile,probabilityresult)
            #print (accuracy_score_test)
            #print (type(accuracy_score_test))
            #print ('After %s training step(s),validation''test_accury = %g'%(global_step,accuracy_score_test))
            #print ('After %smtraining step(s),validation''train_accury = %g'%(global_step,accuracy_score_train))
        else:
            print('No checkpoint file found')
def train(train_record_file, train_log_step, train_param, val_record_file,
          val_log_step, labels_nums, data_shape, snapshot, snapshot_prefix):
    '''
    :param train_record_file: 训练的tfrecord文件
    :param train_log_step: 显示训练过程log信息间隔
    :param train_param: train参数
    :param val_record_file: 验证的tfrecord文件
    :param val_log_step: 显示验证过程log信息间隔
    :param val_param: val参数
    :param labels_nums: labels数
    :param data_shape: 输入数据shape
    :param snapshot: 保存模型间隔
    :param snapshot_prefix: 保存模型文件的前缀名
    :return:
    '''
    [base_lr, max_steps] = train_param
    [batch_size, resize_height, resize_width, depths] = data_shape

    # 获得训练和测试的样本数
    train_nums = get_example_nums(train_record_file)
    val_nums = get_example_nums(val_record_file)
    print('train nums:%d,val nums:%d' % (train_nums, val_nums))

    # 从record中读取图片和labels数据
    # train数据,训练数据一般要求打乱顺序shuffle=True
    train_images, train_labels = read_records(train_record_file,
                                              resize_height,
                                              resize_width,
                                              type='normalization')
    train_images_batch, train_labels_batch = get_batch_images(
        train_images,
        train_labels,
        batch_size=batch_size,
        labels_nums=labels_nums,
        one_hot=True,
        shuffle=True)
    # val数据,验证数据可以不需要打乱数据
    val_images, val_labels = read_records(val_record_file,
                                          resize_height,
                                          resize_width,
                                          type='normalization')
    val_images_batch, val_labels_batch = get_batch_images(
        val_images,
        val_labels,
        batch_size=batch_size,
        labels_nums=labels_nums,
        one_hot=True,
        shuffle=False)

    # Define the model:
    with slim.arg_scope(mobilenet_v1.mobilenet_v1_arg_scope()):
        # with slim.arg_scope([slim.conv2d, slim.separable_conv2d],normalizer_fn=slim.batch_norm):
        out, end_points = mobilenet_v1.mobilenet_v1(
            inputs=input_images,
            num_classes=labels_nums,
            dropout_keep_prob=keep_prob,
            is_training=is_training)

        # Specify the loss function: tf.losses定义的loss函数都会自动添加到loss函数,不需要add_loss()了
    tf.losses.softmax_cross_entropy(onehot_labels=input_labels,
                                    logits=out)  # 添加交叉熵损失loss=1.6
    # slim.losses.add_loss(my_loss)
    loss = tf.losses.get_total_loss(
        add_regularization_losses=True)  # 添加正则化损失loss=2.2
    accuracy = tf.reduce_mean(
        tf.cast(tf.equal(tf.argmax(out, 1), tf.argmax(input_labels, 1)),
                tf.float32))

    # Specify the optimization scheme:
    # optimizer = tf.train.GradientDescentOptimizer(learning_rate=base_lr)

    # global_step = tf.Variable(0, trainable=False)
    # learning_rate = tf.train.exponential_decay(0.05, global_step, 150, 0.9)
    #
    optimizer = tf.train.MomentumOptimizer(learning_rate=base_lr, momentum=0.9)
    # # train_tensor = optimizer.minimize(loss, global_step)
    # train_op = slim.learning.create_train_op(loss, optimizer,global_step=global_step)

    # 在定义训练的时候, 注意到我们使用了`batch_norm`层时,需要更新每一层的`average`和`variance`参数,
    # 更新的过程不包含在正常的训练过程中, 需要我们去手动像下面这样更新
    # 通过`tf.get_collection`获得所有需要更新的`op`
    update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
    # 使用`tensorflow`的控制流, 先执行更新算子, 再执行训练
    with tf.control_dependencies(update_ops):
        # create_train_op that ensures that when we evaluate it to get the loss,
        # the update_ops are done and the gradient updates are computed.
        # train_op = slim.learning.create_train_op(total_loss=loss,optimizer=optimizer)
        train_op = slim.learning.create_train_op(total_loss=loss,
                                                 optimizer=optimizer)

    # train_op=optimizer.minimize(loss)
    # 循环迭代过程
    step_train(train_op=train_op,
               loss=loss,
               accuracy=accuracy,
               train_images_batch=train_images_batch,
               train_labels_batch=train_labels_batch,
               train_nums=train_nums,
               train_log_step=train_log_step,
               val_images_batch=val_images_batch,
               val_labels_batch=val_labels_batch,
               val_nums=val_nums,
               val_log_step=val_log_step,
               snapshot_prefix=snapshot_prefix,
               snapshot=snapshot)
Beispiel #18
0
def train(data_csv_path_train, train_log_step, train_param, data_csv_path_val,
          val_log_step, labels_nums, data_shape, snapshot, snapshot_prefix):
    '''
    :param data_csv_path_train: 训练的csv文件
    :param train_log_step: 显示训练过程log信息间隔
    :param train_param: train参数
    :param data_csv_path_val: 验证的val文件
    :param val_log_step: 显示验证过程log信息间隔
    :param val_param: val参数
    :param labels_nums: labels数
    :param data_shape: 输入数据shape
    :param snapshot: 保存模型间隔
    :param snapshot_prefix: 保存模型文件的前缀名
    :return:
    '''
    [base_lr, max_steps] = train_param
    [batch_size, resize_height, resize_width, depths] = data_shape

    # 获得训练和测试的样本数
    with open(dataset_csv_path_train, 'r') as f:
        train_nums = len(f.readlines())
    with open(dataset_csv_path_val, 'r') as v:
        val_nums = len(v.readlines())
    print('train nums:%d,val nums:%d' % (train_nums, val_nums))

    train_batch = data_loader.load_data(data_csv_path_train,
                                        image_type=args.image_type,
                                        image_size_before_crop=resize_height,
                                        labels_nums=labels_nums)
    train_images_batch = train_batch['image']
    train_labels_batch = train_batch['label']
    #     print('......................................................')
    #     print(train_images_batch)
    #     print(train_labels_batch)

    # val数据,验证数据可以不需要打乱数据
    val_batch = data_loader.load_data(data_csv_path_val,
                                      image_type=args.image_type,
                                      image_size_before_crop=resize_height,
                                      labels_nums=labels_nums,
                                      do_shuffle=False)
    val_images_batch = val_batch['image']
    val_labels_batch = val_batch['label']

    # Define the model:
    with slim.arg_scope(mobilenet_v1.mobilenet_v1_arg_scope()):
        out, end_points = mobilenet_v1.mobilenet_v1(
            inputs=input_images,
            num_classes=labels_nums,
            dropout_keep_prob=keep_prob,
            is_training=is_training,
            global_pool=True)

    # Specify the loss function: tf.losses定义的loss函数都会自动添加到loss函数,不需要add_loss()了
    tf.losses.softmax_cross_entropy(onehot_labels=input_labels,
                                    logits=out)  #添加交叉熵损失loss=1.6
    # slim.losses.add_loss(my_loss)
    loss = tf.losses.get_total_loss(
        add_regularization_losses=False)  #添加正则化损失loss=2.2
    accuracy = tf.reduce_mean(
        tf.cast(tf.equal(tf.argmax(out, 1), tf.argmax(input_labels, 1)),
                tf.float32))

    # Specify the optimization scheme:
    # optimizer = tf.train.GradientDescentOptimizer(learning_rate=base_lr)

    # global_step = tf.Variable(0, trainable=False)
    # learning_rate = tf.train.exponential_decay(0.05, global_step, 150, 0.9)
    # optimizer = tf.train.MomentumOptimizer(learning_rate=base_lr,momentum= 0.9)
    # optimizer = tf.train.GradientDescentOptimizer(learning_rate=base_lr)
    # # train_tensor = optimizer.minimize(loss, global_step)
    # train_op = slim.learning.create_train_op(loss, optimizer,global_step=global_step)

    # 在定义训练的时候, 注意到我们使用了`batch_norm`层时,需要更新每一层的`average`和`variance`参数,
    # 更新的过程不包含在正常的训练过程中, 需要我们去手动像下面这样更新
    # 通过`tf.get_collection`获得所有需要更新的`op`
    update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
    # 使用`tensorflow`的控制流, 先执行更新算子, 再执行训练
    with tf.control_dependencies(update_ops):
        # create_train_op that ensures that when we evaluate it to get the loss,
        # the update_ops are done and the gradient updates are computed.
        # train_op = slim.learning.create_train_op(total_loss=loss,optimizer=optimizer)
        # train_op = slim.learning.create_train_op(total_loss=loss, optimizer=optimizer)
        train_op = tf.train.AdadeltaOptimizer(
            learning_rate=base_lr).minimize(loss)

    # 循环迭代过程
    step_train(train_op, loss, accuracy, train_images_batch,
               train_labels_batch, train_nums, train_log_step,
               val_images_batch, val_labels_batch, val_nums, val_log_step,
               snapshot_prefix, snapshot)
Beispiel #19
0
def train(train_record_file,
          train_log_step,
          train_param,
          val_record_file,
          val_log_step,
          labels_nums,
          data_shape,
          snapshot,
          snapshot_prefix):
    '''
    该函数是主函数
    获得训练集测试集的数据
    定义网络的输出
    定义损失
    定义正则化,这里定义了正则化,在网络里面con2d定义的正则化要去掉
    定义训练OP
    定义精确度函数
    调用 Sesstion 函数

    :param train_record_file: 训练的tfrecord文件
    :param train_log_step: 显示训练过程log信息间隔
    :param train_param: train参数
    :param val_record_file: 验证的tfrecord文件
    :param val_log_step: 显示验证过程log信息间隔
    :param val_param: val参数
    :param labels_nums: labels数
    :param data_shape: 输入数据shape
    :param snapshot: 保存模型间隔
    :param snapshot_prefix: 保存模型文件的前缀名
    :return:

    '''
    [base_lr, max_steps] = train_param#   base_lr = 0.001  # 学习率 max_steps = 100000  # 迭代次数

    [batch_size, resize_height, resize_width, depths] = data_shape

    # 获得训练和测试的样本数
    train_nums = get_example_nums(train_record_file)
    val_nums = get_example_nums(val_record_file)
    print('train nums:%d,val nums:%d' % (train_nums, val_nums))

    # 从record中读取图片和labels数据
    # train数据,训练数据一般要求打乱顺序shuffle=True
    train_images, train_labels = read_records(train_record_file, resize_height, resize_width, type='normalization')
    train_images_batch, train_labels_batch = get_batch_images(train_images, train_labels,
                                                              batch_size=batch_size, labels_nums=labels_nums,
                                                              one_hot=True, shuffle=True)
    # val数据,验证数据可以不需要打乱数据
    val_images, val_labels = read_records(val_record_file, resize_height, resize_width, type='normalization')
    val_images_batch, val_labels_batch = get_batch_images(val_images, val_labels,
                                                          batch_size=batch_size, labels_nums=labels_nums,
                                                          one_hot=True, shuffle=False)

    # Define the model:
    with slim.arg_scope(mobilenet_v1.mobilenet_v1_arg_scope()):
        out, end_points = mobilenet_v1.mobilenet_v1(inputs=input_images, num_classes=labels_nums,
                                                    dropout_keep_prob=keep_prob, is_training=is_training,
                                                    global_pool=True)

        # Specify the loss function: tf.losses定义的loss函数都会自动添加到loss函数,不需要add_loss()了
    tf.losses.softmax_cross_entropy(onehot_labels=input_labels, logits=out)  # 添加交叉熵损失loss=1.6
    # slim.losses.add_loss(my_loss)
    loss = tf.losses.get_total_loss(add_regularization_losses=True)  # 添加正则化损失loss=2.2

    # Specify the optimization scheme:

    # 在定义训练的时候, 注意到我们使用了`batch_norm`层时,需要更新每一层的`average`和`variance`参数,
    # 更新的过程不包含在正常的训练过程中, 需要我们去手动像下面这样更新
    # 通过`tf.get_collection`获得所有需要更新的`op`
    update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
    # 使用`tensorflow`的控制流, 先执行更新算子, 再执行训练
    #with tf.control_dependencies 就是说必须先执行update_ops,在能执行with里面的op
    with tf.control_dependencies(update_ops):
        print("update_ops:{}".format(update_ops))
        # create_train_op that ensures that when we evaluate it to get the loss,
        # the update_ops are done and the gradient updates are computed.
        # train_op = tf.train.MomentumOptimizer(learning_rate=base_lr, momentum=0.9).minimize(loss)
        train_op = tf.train.AdadeltaOptimizer(learning_rate=base_lr).minimize(loss)

    accuracy = tf.reduce_mean(tf.cast(tf.equal(tf.argmax(out, 1), tf.argmax(input_labels, 1)), tf.float32))
    # 循环迭代过程
    step_train(train_op=train_op, loss=loss, accuracy=accuracy,
               train_images_batch=train_images_batch,
               train_labels_batch=train_labels_batch,
               train_nums=train_nums,
               train_log_step=train_log_step,
               val_images_batch=val_images_batch,
               val_labels_batch=val_labels_batch,
               val_nums=val_nums,
               val_log_step=val_log_step,
               snapshot_prefix=snapshot_prefix,
               snapshot=snapshot)
Beispiel #20
0
        logits = slim.fully_connected(net, num_classes, activation_fn=None, scope='fc_16')
        predictions = slim.softmax(logits, scope='Softmax')

        end_points['Logits'] = logits
        end_points['Predictions'] = predictions

    return logits, end_points




if __name__ =='__main__':
    inputs = tf.random_uniform((8, 224, 224, 3))
    logits,end_points=mobile_net_inference(inputs,2)
    model_variables = slim.get_model_variables(scope='MobileNet')
    logits_slim, end_points_slim = mobilenet_v1.mobilenet_v1(inputs,scope='MobileNetV1')
    model_variables_slim = slim.get_model_variables(scope='MobileNetV1')
    model_variables_maping={}
    for i,j in zip(model_variables,model_variables_slim):
        if 'Logits' not in j.name:
            model_variables_maping[j.name] = i
    print(len(model_variables_maping))