迁移学习移植IOS

    xcode9之后的打包方式

    XCode8.3之前的打包

    https://github.com/webfrogs/xcode_shell/blob/master/ipa-build
    阅读链接上的这个脚本, 可以理解构建三部曲为:

    1. Clean build cache
    2. 编译出.archive
    3. xcrun打包为.ipa文件

    第三步是和XCode9差异最大的地方, 先记住这里:

    XCode9之后的打包

    听说是8.3之后就不一样的了.
    细化上面的三个步骤为:

    Clean Build Cache:

    
    
    1
    
    
    
    xcodebuild clean -workspace $workspace -scheme $scheme -configuration $configuration
    

    与xcode8无任何差异.

    编译,生成.xcarchive

    xcodebuild archive -workspace $workspace -scheme $scheme -configuration 
        \ $configuration -archivePath $archivePath -destination generic/platform=ios 
        \ CODE_SIGN_IDENTITY="$code_sign_indentity"
    

    这里可以不需要这个参数, CODE_SIGN_IDENTITY="$code_sign_indentity".

    将.xcarchive生成.IPA

    xcodebuild -exportArchive -archivePath $archivePath 
        \ -exportPath $exportPath -destination generic/platform=ios 
        \ -exportOptionsPlist $exportOptionPlist -allowProvisioningUpdates
    

    这一步有特殊的地方, 就是-exportOptionsPlist $exportOptionPlist, 它的格式如下, 做了下扼要的说明, 官网能找到它的说明文档:

    Jun 5, 2018
    MachineLearning

    机器学习迁移模型到IOS

    https://paulswith.github.io/2018/02/24/%E8%BF%81%E7%A7%BB%E5%AD%A6%E4%B9%A0InceptionV3/ 上文记录了如何从一个别人训练好的模型, 切入我们自己的图片, 改为我们自己的模型.
    本来以为移植到手机很简单, 但是不简单的是我的模型本身就是迁移学习别人的模型,有很多莫名其面的坑, 在CoreML经历了N个坑后,1点14分我搞掂了.

    项目源码和转换源码已经上传到git.
    https://github.com/Paulswith/machineLearningIntro/tree/master/classification_101

    转化为mlmodel

    说说转换为mlmodel的工具有两个:

    接着往下看:

    是否是graph-pb?

    如果你跟我一样, 训练的模型, 从tensorflow的代码保存下来的, 调用的:

    saver.save(sess, MODEL_SAVEPATH, global_step=50)
    

    它并不会保存出一个pb文件, 其中的.meta也需要其他方式转换似乎也可以, 我没有尝试过.
    用这个方法, 你需要在上方代码的下面加两行,就可以继续:

    if i %SAVE_EPOCH == 0:
        tf.train.write_graph(sess.graph, MODEL_SAVE_DIR, 'model.pbtxt')
    

    pdtxt固化为pd

    操作参考链接 https://www.jianshu.com/p/091415b114e2
    我是直接使用的bezel, 编译tensorflow源码后, 直接使用, 其中参数跟着填, 需要注意的是output_node:

    导入化图

    导入图和查看图的节点信息:
    如果你的图不属于pb文件, 那么就会在导入图的时候报错的.

    with open(TF_MODEL_FILE, 'rb') as f:
        serialized = f.read()
    tf.reset_default_graph()
    original_gdef = tf.GraphDef()
    original_gdef.ParseFromString(serialized)
    ##2 可以在这里查看到全部的图信息(前提是你有转换成功)
    with tf.Graph().as_default() as g:
        tf.import_graph_def(original_gdef, name='')
        ops = g.get_operations()
        try:
            for i in range(10000):
                print('op id {} : op name: {}, op type: "{}"'.format(str(i),ops[i].name, ops[i].type))
        except:
            print("全部节点已打印完毕.")
            pass
    

    预处理节点

    其实这一步个人不是很清楚很知道它做了什么,但确是不得不做的. 最后的大小看着也不像是”减包”
    需要注意两点:

    Feb 25, 2018
    MachineLearning