当前位置: 首页 > news >正文

自己做的网站能备案吗微信wordpress小程序

自己做的网站能备案吗,微信wordpress小程序,营销型网站需要注意,设计学类TensorFlow 2.0是对1.x版本做了一次大的瘦身#xff0c;Eager Execution默认开启#xff0c;并且使用Keras作为默认高级API#xff0c; 这些改进大大降低的TensorFlow使用难度。 本文主要记录了一次曲折的使用KerasTensorFlow2.0的BatchNormalization的踩坑经历#xff0c…TensorFlow 2.0是对1.x版本做了一次大的瘦身Eager Execution默认开启并且使用Keras作为默认高级API 这些改进大大降低的TensorFlow使用难度。 本文主要记录了一次曲折的使用KerasTensorFlow2.0的BatchNormalization的踩坑经历这个坑差点要把TF2.0的新特性都毁灭殆尽如果你在学习TF2.0的官方教程不妨一观。 问题的产生 从教程[1]https://www.tensorflow.org/alpha/tutorials/images/transfer_learning?hlzh-cn讲述如何Transfer Learning说起 IMG_SHAPE (IMG_SIZE, IMG_SIZE, 3) # Create the base model from the pre-trained model MobileNet V2 base_model tf.keras.applications.MobileNetV2(input_shapeIMG_SHAPE,include_topFalse,weightsimagenet) model tf.keras.Sequential([base_model,tf.keras.layers.GlobalAveragePooling2D(),tf.keras.layers.Dense(NUM_CLASSES) ]) 简单的代码我们就复用了MobileNetV2的结构创建了一个分类器模型接着我们就可以调用Keras的接口去训练模型 model.compile(optimizertf.keras.optimizers.RMSprop(lrbase_learning_rate),losssparse_categorical_crossentropy,metrics[sparse_categorical_accuracy])model.summary()history model.fit(train_batches.repeat(),epochs20,steps_per_epoch steps_per_epoch,validation_datavalidation_batches.repeat(),validation_stepsvalidation_steps) 输出的结果看一起都很完美 Model: sequential_________________________________________________________________Layer (type) Output Shape Param #mobilenetv2_1.00_160 (Model) (None, 5, 5, 1280) 2257984_________________________________________________________________global_average_pooling2d (Gl (None, 1280) 0_________________________________________________________________dense (Dense) (None, 2) 1281Total params: 2,259,265Trainable params: 1,281Non-trainable params: 2,257,984_________________________________________________________________Epoch 11/20581/581 [] - 134s 231ms/step - loss: 0.4208 - accuracy: 0.9484 - val_loss: 0.1907 - val_accuracy: 0.9812Epoch 12/20581/581 [] - 114s 197ms/step - loss: 0.3359 - accuracy: 0.9570 - val_loss: 0.1835 - val_accuracy: 0.9844Epoch 13/20581/581 [] - 116s 200ms/step - loss: 0.2930 - accuracy: 0.9650 - val_loss: 0.1505 - val_accuracy: 0.9844Epoch 14/20581/581 [] - 114s 196ms/step - loss: 0.2561 - accuracy: 0.9701 - val_loss: 0.1575 - val_accuracy: 0.9859Epoch 15/20581/581 [] - 119s 206ms/step - loss: 0.2302 - accuracy: 0.9715 - val_loss: 0.1600 - val_accuracy: 0.9812Epoch 16/20581/581 [] - 115s 197ms/step - loss: 0.2134 - accuracy: 0.9747 - val_loss: 0.1407 - val_accuracy: 0.9828Epoch 17/20581/581 [] - 115s 197ms/step - loss: 0.1546 - accuracy: 0.9813 - val_loss: 0.0944 - val_accuracy: 0.9828Epoch 18/20581/581 [] - 116s 200ms/step - loss: 0.1636 - accuracy: 0.9794 - val_loss: 0.0947 - val_accuracy: 0.9844Epoch 19/20581/581 [] - 115s 198ms/step - loss: 0.1356 - accuracy: 0.9823 - val_loss: 0.1169 - val_accuracy: 0.9828Epoch 20/20581/581 [] - 116s 199ms/step - loss: 0.1243 - accuracy: 0.9849 - val_loss: 0.1121 - val_accuracy: 0.9875 然而这种写法还是不方便Debug我们希望可以精细的控制迭代的过程并能够看到中间结果所以我们训练的过程改成了这样 optimizer tf.keras.optimizers.RMSprop(lrbase_learning_rate) train_accuracy tf.keras.metrics.SparseCategoricalAccuracy(nametrain_accuracy)tf.functiondef train_cls_step(image, label):with tf.GradientTape() as tape:predictions model(image)loss tf.keras.losses.SparseCategoricalCrossentropy()(label, predictions)gradients tape.gradient(loss, model.trainable_variables)optimizer.apply_gradients(zip(gradients, model.trainable_variables))train_accuracy(label, predictions)for images, labels in train_batches:train_cls_step(images,labels) 重新训练后结果依然很完美 但是这时候我们想对比一下Finetune和重头开始训练的差别所以把构建模型的代码改成了这样 base_model tf.keras.applications.MobileNetV2(input_shapeIMG_SHAPE,include_topFalse,weightsNone) 使得模型的权重随机生成这时候训练结果就开始抽风了Loss不下降Accuracy稳定在50%附近游荡 Step #10: loss0.6937199831008911 acc46.5625%Step #20: loss0.6932525634765625 acc47.8125%Step #30: loss0.699873685836792 acc49.16666793823242%Step #40: loss0.6910845041275024 acc49.6875%Step #50: loss0.6935917139053345 acc50.0625%Step #60: loss0.6965731382369995 acc49.6875%Step #70: loss0.6949992179870605 acc49.19642639160156%Step #80: loss0.6942993402481079 acc49.84375%Step #90: loss0.6933775544166565 acc49.65277862548828%Step #100: loss0.6928421258926392 acc49.5%Step #110: loss0.6883170008659363 acc49.54545593261719%Step #120: loss0.695658802986145 acc49.453125%Step #130: loss0.6875559091567993 acc49.61538314819336%Step #140: loss0.6851695775985718 acc49.86606979370117%Step #150: loss0.6978713274002075 acc49.875%Step #160: loss0.7165156602859497 acc50.0%Step #170: loss0.6945627331733704 acc49.797794342041016%Step #180: loss0.6936900615692139 acc49.9305534362793%Step #190: loss0.6938323974609375 acc49.83552551269531%Step #200: loss0.7030564546585083 acc49.828125%Step #210: loss0.6926192045211792 acc49.76190185546875%Step #220: loss0.6932414770126343 acc49.786930084228516%Step #230: loss0.6924526691436768 acc49.82337188720703%Step #240: loss0.6882281303405762 acc49.869789123535156%Step #250: loss0.6877702474594116 acc49.86249923706055%Step #260: loss0.6933954954147339 acc49.77163314819336%Step #270: loss0.6944763660430908 acc49.75694274902344%Step #280: loss0.6945018768310547 acc49.49776840209961% 我们将predictions的结果打印出来发现batch内每个输出都是一模一样的 0 tf.Tensor([0.51352817 0.48647183], shape(2,), dtypefloat32)1 tf.Tensor([0.51352817 0.48647183], shape(2,), dtypefloat32)2 tf.Tensor([0.51352817 0.48647183], shape(2,), dtypefloat32)3 tf.Tensor([0.51352817 0.48647183], shape(2,), dtypefloat32)4 tf.Tensor([0.51352817 0.48647183], shape(2,), dtypefloat32)5 tf.Tensor([0.51352817 0.48647183], shape(2,), dtypefloat32)6 tf.Tensor([0.51352817 0.48647183], shape(2,), dtypefloat32)7 tf.Tensor([0.51352817 0.48647183], shape(2,), dtypefloat32)8 tf.Tensor([0.51352817 0.48647183], shape(2,), dtypefloat32)9 tf.Tensor([0.51352817 0.48647183], shape(2,), dtypefloat32) 只是修改了初始权重为何会产生这样的结果 问题排查 实验1 是不是训练不够充分或者learning rate设置的不合适 经过几轮调整发现无论训练多久learning rate变大变小都无法改变这种结果 实验2 既然是权重的问题是不是权重随机初始化的有问题把初始权重拿出来统计了一下一切正常 实验3 这种问题根据之前的经验在导出Inference模型的时候BatchNormalization没有处理好会出现这种一个batch内所有结果都一样的问题。但是如何解释训练的时候为什么会出现这个问题而且为什么Finetue不会出现问题呢只是改了权重的初始值而已呀 按照这个方向去Google的一番发现了Keras的BatchNormalization确实有很多issue其中一个问题是在保存模型的是BatchNormalzation的moving mean和moving variance不会被保存[6]https://github.com/tensorflow/tensorflow/issues/16455而另外一个issue提到问题就和我们问题有关系的了 [2] https://github.com/tensorflow/tensorflow/issues/19643 [3] https://github.com/tensorflow/tensorflow/issues/23873 最后这位作者找到了原因并且总结在了这里 [4] https://pgaleone.eu/tensorflow/keras/2019/01/19/keras-not-yet-interface-to-tensorflow/ 根据这个提示我们做了如下尝试 实验3.1 改用model.fit的写法进行训练在最初的几个epoch里面我们发现好的一点的是training accuracy已经开始缓慢提升了但是validation accuracy存在原来的问题。而且通过model.predict_on_batch()拿到中间结果发现依然还是batch内输出都一样。 Epoch 1/20581/581 [] - 162s 279ms/step - loss: 0.6768 - sparse_categorical_accuracy: 0.6224 - val_loss: 0.6981 - val_sparse_categorical_accuracy: 0.4984Epoch 2/20581/581 [] - 133s 228ms/step - loss: 0.4847 - sparse_categorical_accuracy: 0.7684 - val_loss: 0.6931 - val_sparse_categorical_accuracy: 0.5016Epoch 3/20581/581 [] - 130s 223ms/step - loss: 0.3905 - sparse_categorical_accuracy: 0.8250 - val_loss: 0.6996 - val_sparse_categorical_accuracy: 0.4984Epoch 4/20581/581 [] - 131s 225ms/step - loss: 0.3113 - sparse_categorical_accuracy: 0.8660 - val_loss: 0.6935 - val_sparse_categorical_accuracy: 0.5016 但是随着训练的深入结果出现了逆转开始变得正常了tf.function的写法是无论怎么训练都不会变化幸好没有放弃治疗追加其实这里还是有问题的继续看后面当时就觉得怪怪的不应该收敛这么慢 Epoch 18/20581/581 [] - 131s 226ms/step - loss: 0.0731 - sparse_categorical_accuracy: 0.9725 - val_loss: 1.4896 - val_sparse_categorical_accuracy: 0.8703Epoch 19/20581/581 [] - 130s 225ms/step - loss: 0.0664 - sparse_categorical_accuracy: 0.9748 - val_loss: 0.6890 - val_sparse_categorical_accuracy: 0.9016Epoch 20/20581/581 [] - 126s 217ms/step - loss: 0.0631 - sparse_categorical_accuracy: 0.9768 - val_loss: 1.0290 - val_sparse_categorical_accuracy: 0.9031 通多model.predict_on_batch()拿到的结果也和这个Accuracy也是一致的 实验3.2 通过上一个实验我们验证了确实如果只通过Keras的API去训练是正常。更深层的原因是什么呢是不是BatchNomalization没有update moving mean和moving variance导致的呢答案是Yes 我们分别在两中训练方法前后打印 moving mean和moving variance的值 def get_bn_vars(collection):moving_mean, moving_variance None, None for var in collection:name var.name.lower()if variance in name:moving_variance varif mean in name:moving_mean varif moving_mean is not None and moving_variance is not None:return moving_mean, moving_varianceraise ValueError(Unable to find moving mean and variance)mean, variance get_bn_vars(model.variables)print(mean)print(variance) 我们发现确实如果使用model.fit()进行训练mean和variance是在update的(虽然更新的速率看着有些奇怪)但是对于tf.function那种写法这两个值就没有被update 那这里我们也可以解释为什么Finetune不会出现问题了因为imagenet训练的mean, variance已经是一个比较好的值了即使不更新也可以正常使用 实验3.3 是不是改成[4]里面说的方法构建动态的Input_Shape的模型就OK了呢 class MyModel(Model):def __init__(self):super(MyModel, self).__init__()self.conv1 Conv2D(32, 3, activationrelu)self.batch_norm1BatchNormalization()self.flatten Flatten()self.d1 Dense(128, activationrelu)self.d2 Dense(10, activationsoftmax)def call(self, x):x self.conv1(x)x self.batch_norm1(x)x self.flatten(x)x self.d1(x)return self.d2(x)model MyModel()#model.build((None,28,28,1))model.summary()tf.functiondef train_step(image, label):with tf.GradientTape() as tape:predictions model(image)loss loss_object(label, predictions)gradients tape.gradient(loss, model.trainable_variables)optimizer.apply_gradients(zip(gradients, model.trainable_variables))train_loss(loss)train_accuracy(label, predictions) 模型如下 Model: my_model_________________________________________________________________Layer (type) Output Shape Param # conv2d (Conv2D) multiple 320 _________________________________________________________________batch_normalization_v2 (Batc multiple 128 _________________________________________________________________flatten (Flatten) multiple 0 _________________________________________________________________dense (Dense) multiple 2769024 _________________________________________________________________dense_1 (Dense) multiple 1290 Total params: 2,770,762Trainable params: 2,770,698Non-trainable params: 64 从Output Shape看构建模型没问题 跑了一遍MINST结果也很不错 以防万一我们同样测试了一下mean和variance是否被更新然而结果出乎意料并没有也就是说[4]里面说的方案在我们这里并不可行 实验3.4 既然我们定位问题是在BatchNormalization这里所以就想到BatchNormalization的training和testing时候行为是不一致的在testing的时候moving mean和variance是不需要update的那么会不会是tf.function的这种写法并不会自动更改这个状态呢 查看源码发现BatchNormalization的call()存在一个training参数而且默认是False Call arguments:inputs: Input tensor (of any rank).training: Python boolean indicating whether the layer should behave intraining mode or in inference mode.- trainingTrue: The layer will normalize its inputs using themean and variance of the current batch of inputs.- trainingFalse: The layer will normalize its inputs using themean and variance of its moving statistics, learned during training. 所以做了如下改进 class MyModel(Model):def __init__(self):super(MyModel, self).__init__()self.conv1 Conv2D(32, 3, activationrelu)self.batch_norm1BatchNormalization()self.flatten Flatten()self.d1 Dense(128, activationrelu)self.d2 Dense(10, activationsoftmax)def call(self, x,trainingTrue):x self.conv1(x)x self.batch_norm1(x,trainingtraining)x self.flatten(x)x self.d1(x)return self.d2(x)model MyModel()#model.build((None,28,28,1))model.summary()tf.functiondef train_step(image, label):with tf.GradientTape() as tape:predictions model(image,trainingTrue)loss loss_object(label, predictions)gradients tape.gradient(loss, model.trainable_variables)optimizer.apply_gradients(zip(gradients, model.trainable_variables))train_loss(loss)train_accuracy(label, predictions)tf.functiondef test_step(image, label):predictions model(image,trainingFalse)t_loss loss_object(label, predictions)test_loss(t_loss)test_accuracy(label, predictions) 结果显示moving mean和variance开始更新啦测试Accuracy也是符合预期所以我们可以确定问题的根源在于需要指定BatchNormalization是在training还是在testing 实验3.5 3.4中方法虽然解决了我们的问题但是它是使用构建Model的subclass的方式而我们之前的MobileNetV2是基于更加灵活Keras Functional API构建的由于无法控制call()函数的定义没有办法灵活切换training和testing的状态另外用Sequential的方式构建时也是一样。 [5]https://blog.keras.io/keras-as-a-simplified-interface-to-tensorflow-tutorial.html[7]https://github.com/keras-team/keras/issues/7085 [8]https://github.com/keras-team/keras/issues/6752 从5[8]中我了解到两个情况 tf.keras.backend.set_learning_phase()可以改变training和testing的状态 model.updates和layer.updates 存着old_value和new_value的Assign Op 所以我首先尝试 tf.keras.backend.set_learning_phase(True) 结果MobileNetV2构建的模型也可以正常工作了。 而且收敛的速度似乎比model.fit()还快了很多结合之前model.fit()收敛慢的困惑这里又增加的一个实验在model.fit()的版本里面也加上这句话发现同样收敛速度也变快了1个epoch就能得到不错的结果了因此这里又产生了一个问题model.fit()到底有没有设learning_phase状态如果没有是怎么做moving mean和variance的update的 第二个方法由于教程中讲述的是如何在1.x的版本构建而在eager execution模式下似乎没有办法去run这些Assign Operation。仅做参考吧 update_ops []for assign_op in model.updates:update_ops.append(assign_op)) #但是不知道拿到这些update_ops在eager execution模式下怎么处理呢 结论 总结一下我们从[4]找到了解决问题的启发点但是最终证明[4]里面的问题和解决方法用到我们这里并不能真正解决问题问题的关键还是在于KerasTensorFlow2.0里面我们如何处理在training和testing状态下行为不一致的Layer以及对于model.fit()和tf.funtion这两种训练方法的区别最终来看model.fit()里面似乎包含很多诡异的行为。 最终的使用建议如下 在使用model.fit()或者model.train_on_batch()这种Keras的API训练模型时也推荐手动设置tf.keras.backend.set_learning_phase(True)可以加快收敛如果使用eager execution这种方法 1使用构建Model的subclass但是针对call()设置training的状态对于BatchNoramlizationDropout这样的Layer进行不同处理2使用Functional API或者Sequential的方式构建Model设置tf.keras.backend.set_learning_phase(True)但是注意在testing的时候改变一下状态 最后为什么TF 2.0的教程里面没有提及这些默认你已经精通Keras了吗[捂脸哭] 原文链接 本文为云栖社区原创内容未经允许不得转载。
http://www.yutouwan.com/news/431132/

相关文章:

  • 共享经济网站建设策划书沈阳工程建设招标网
  • 北京网站建设产品介绍个人网站 网站教程
  • 北京网站建设正邦南通网站建设制作
  • php网站建设论文外贸seo站
  • 高新手机网站建设价格iis 网站建设中
  • 网站做外链好嘛差差软件下载免费
  • 沈阳企业网站制作公司怎么制作网站表白
  • 免费开网店的平台有哪些福建百度seo排名点击软件
  • 福建省网站建设公司做网站那个程序好
  • 网站建设实习生怎么样如何做好网站的推广工作
  • 慧聚创新网站建设专门做水果的网站
  • 网上营销网站番禺网站建设制作
  • 顺德做网站shundeit网上自己怎么申请商标注册
  • dz论坛网站建设手机网站菜单
  • 做商品网站数据库有哪些内容报价单模板
  • 个人网站免费注册网络有限公司
  • 北京梵客家装官网seo网站营销
  • 做高仿网站防止服务器上的网站被进攻
  • 怎么在云主机上做网站简述网站规划的主要内容
  • 实验教学中心网站建设建站模板怎么选
  • 一个静态网站多少钱少儿图书销售网站开发背景
  • 程序员做彩票网站违法吗网站平台建立
  • 青岛做网站公wordpress全站腾讯云cdn
  • 企业网站颜色wordpress apply_filters
  • 男人直接做的视频网站免费推广平台排行
  • 重庆建网站诚选快忻科技悉心湖北黄石域名注册网站建设
  • 做电子签章登录哪个网站wordpress主题汉化实战
  • 英文网站怎么做wordpress rss 采集
  • 大连网站建设介绍德宏企业网站建设公司
  • 平台网站如何做推广做国外进口衣服的网站好