国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

如何對機器學(xué)習(xí)做單元測試

人工智能 機器學(xué)習(xí)
養(yǎng)成良好的單元測試的習(xí)慣,真的是受益終身的,特別是機器學(xué)習(xí)代碼,有些bug真不是看看就能看出來的。

在過去的一年里,我把大部分的工作時間都花在了深度學(xué)習(xí)研究和實習(xí)上。那一年,我犯了很多大錯誤,這些錯誤不僅幫助我了解了ML,還幫助我了解了如何正確而穩(wěn)健地設(shè)計這些系統(tǒng)。我在谷歌Brain學(xué)到的一個主要原則是,單元測試可以決定算法的成敗,可以為你節(jié)省數(shù)周的調(diào)試和訓(xùn)練時間。

[[285889]]

然而,在如何為神經(jīng)網(wǎng)絡(luò)代碼編寫單元測試方面,似乎沒有一個可靠的在線教程。即使是像OpenAI這樣的地方,也只是通過盯著他們代碼的每一行,并試著思考為什么它會導(dǎo)致bug來發(fā)現(xiàn)bug的。顯然,我們大多數(shù)人都沒有這樣的時間,所以希望本教程能夠幫助你開始理智地測試你的系統(tǒng)!

讓我們從一個簡單的例子開始。試著找出這段代碼中的錯誤。

  1. def make_convnet(input_image): 
  2.     net = slim.conv2d(input_image, 32, [11, 11], scope="conv1_11x11"
  3.     net = slim.conv2d(input_image, 64, [5, 5], scope="conv2_5x5"
  4.     net = slim.max_pool2d(net, [4, 4], stride=4scope='pool1'
  5.     net = slim.conv2d(input_image, 64, [5, 5], scope="conv3_5x5"
  6.     net = slim.conv2d(input_image, 128, [3, 3], scope="conv4_3x3"
  7.     net = slim.max_pool2d(net, [2, 2], scope='pool2'
  8.     net = slim.conv2d(input_image, 128, [3, 3], scope="conv5_3x3"
  9.     net = slim.max_pool2d(net, [2, 2], scope='pool3'
  10.     net = slim.conv2d(input_image, 32, [1, 1], scope="conv6_1x1"
  11.     return net 

你看到了嗎?網(wǎng)絡(luò)實際上并沒有堆積起來。在編寫這段代碼時,我復(fù)制并粘貼了slim.conv2d(…)行,并且只修改了內(nèi)核大小,而沒有修改實際的輸入。

我很不好意思地說,這件事在一周前就發(fā)生在我身上了……但這是很重要的一課!由于一些原因,這些bug很難捕獲。

  • 這段代碼不會崩潰,不會產(chǎn)生錯誤,甚至不會變慢。
  • 這個網(wǎng)絡(luò)仍在運行,損失仍將下降。
  • 幾個小時后,這些值就會收斂,但結(jié)果卻非常糟糕,讓你摸不著頭腦,不知道需要修復(fù)什么。

當(dāng)你唯一的反饋是最終的驗證錯誤時,你惟一需要搜索的地方就是你的整個網(wǎng)絡(luò)體系結(jié)構(gòu)。不用說,你需要一個更好的系統(tǒng)。

那么,在我們進行完整的多日訓(xùn)練之前,我們?nèi)绾握嬲プ∵@個機會呢?關(guān)于這個最容易注意到的是層的值實際上不會到達函數(shù)外的任何其他張量。假設(shè)我們有某種類型的損失和一個優(yōu)化器,這些張量永遠不會得到優(yōu)化,所以它們總是有它們的默認值。

我們可以通過簡單的訓(xùn)練步驟和前后對比來檢測它。

  1. def test_convnet(): 
  2.   image = tf.placeholder(tf.float32, (None, 100, 100, 3) 
  3.   model = Model(image) 
  4.   sess = tf.Session() 
  5.   sess.run(tf.global_variables_initializer()) 
  6.   before = sess.run(tf.trainable_variables()) 
  7.   _ = sess.run(model.train, feed_dict={ 
  8.                image: np.ones((1, 100, 100, 3)), 
  9.                }) 
  10.   after = sess.run(tf.trainable_variables()) 
  11.   for b, a, n in zip(before, after): 
  12.       # Make sure something changed. 
  13.       assert (b != a).any() 

在不到15行代碼中,我們現(xiàn)在驗證了至少我們創(chuàng)建的所有變量都得到了訓(xùn)練。

這個測試超級簡單,超級有用。假設(shè)我們修復(fù)了前面的問題,現(xiàn)在我們要開始添加一些批歸一化。看看你能否發(fā)現(xiàn)這個bug。

  1. def make_convnet(image_input): 
  2.         # Try to normalize the input before convoluting 
  3.         net = slim.batch_norm(image_input) 
  4.         net = slim.conv2d(net, 32, [11, 11], scope="conv1_11x11"
  5.         net = slim.conv2d(net, 64, [5, 5], scope="conv2_5x5"
  6.         net = slim.max_pool2d(net, [4, 4], stride=4scope='pool1'
  7.         net = slim.conv2d(net, 64, [5, 5], scope="conv3_5x5"
  8.         net = slim.conv2d(net, 128, [3, 3], scope="conv4_3x3"
  9.         net = slim.max_pool2d(net, [2, 2], scope='pool2'
  10.         net = slim.conv2d(net, 128, [3, 3], scope="conv5_3x3"
  11.         net = slim.max_pool2d(net, [2, 2], scope='pool3'
  12.         net = slim.conv2d(net, 32, [1, 1], scope="conv6_1x1"
  13.         return net 

你看到了嗎?這個非常微妙。您可以看到,在tensorflow batch_norm中,is_training的默認值是False,所以添加這行代碼并不能使你在訓(xùn)練期間的輸入正常化!值得慶幸的是,我們編寫的最后一個單元測試將立即發(fā)現(xiàn)這個問題!(我知道,因為這是三天前發(fā)生在我身上的事。)

再看一個例子。這實際上來自我一天看到的一篇文章

(https://www.reddit.com/r/MachineLearning/comments/6qyvvg/p_tensorflow_response_is_making_no_sense/)。我不會講太多細節(jié),但是基本上這個人想要創(chuàng)建一個輸出范圍為(0,1)的分類器。

  1. class Model: 
  2.   def __init__(self, input, labels): 
  3.     """Classifier model 
  4.     Args: 
  5.       input: Input tensor of size (None, input_dims) 
  6.       label: Label tensor of size (None, 1).  
  7.         Should be of type tf.int32. 
  8.     """ 
  9.     prediction = self.make_network(input) 
  10.     # Prediction size is (None, 1). 
  11.     self.loss = tf.nn.softmax_cross_entropy_with_logits( 
  12.         logits=predictionlabelslabels=labels) 
  13.     self.train_op = tf.train.AdamOptimizer().minimize(self.loss) 

注意到這個錯誤嗎?這是真的很難提前發(fā)現(xiàn),并可能導(dǎo)致超級混亂的結(jié)果。基本上,這里發(fā)生的是預(yù)測只有一個輸出,當(dāng)你將softmax交叉熵應(yīng)用到它上時,它的損失總是0。

一個簡單的測試方法是確保損失不為0。

  1. def test_loss(): 
  2.   in_tensor = tf.placeholder(tf.float32, (None, 3)) 
  3.   labels = tf.placeholder(tf.int32, None, 1)) 
  4.   model = Model(in_tensor, labels) 
  5.   sess = tf.Session() 
  6.   loss = sess.run(model.loss, feed_dict={ 
  7.     in_tensor:np.ones(1, 3), 
  8.     labels:[[1]] 
  9.   }) 
  10.   assert loss != 0 

另一個很好的測試與我們的第一個測試類似,但是是反向的。你可以確保只有你想訓(xùn)練的變量得到了訓(xùn)練。以GAN為例。出現(xiàn)的一個常見錯誤是在進行優(yōu)化時不小心忘記設(shè)置要訓(xùn)練的變量。這樣的代碼經(jīng)常發(fā)生。

  1. class GAN: 
  2.   def __init__(self, z_vector, true_images): 
  3.     # Pretend these are implemented. 
  4.     with tf.variable_scope("gen"): 
  5.       self.make_geneator(z_vector) 
  6.     with tf.variable_scope("des"): 
  7.       self.make_descriminator(true_images) 
  8.     opt = tf.AdamOptimizer() 
  9.     train_descrim = opt.minimize(self.descrim_loss) 
  10.     train_gen = opt.minimize(self.gen_loss) 

這里最大的問題是優(yōu)化器有一個默認設(shè)置來優(yōu)化所有變量。在像GANs這樣的高級架構(gòu)中,這是對你所有訓(xùn)練時間的死刑判決。但是,你可以通過編寫這樣的測試來輕松地發(fā)現(xiàn)這些錯誤:

  1. def test_gen_training(): 
  2.   model = Model 
  3.   sess = tf.Session() 
  4.   gen_vars = tf.get_collection(tf.GraphKeys.VARIABLES, scope='gen'
  5.   des_vars = tf.get_collection(tf.GraphKeys.VARIABLES, scope='des'
  6.   before_gen = sess.run(gen_vars) 
  7.   before_des = sess.run(des_vars) 
  8.   # Train the generator. 
  9.   sess.run(model.train_gen) 
  10.   after_gen = sess.run(gen_vars) 
  11.   after_des = sess.run(des_vars) 
  12.   # Make sure the generator variables changed. 
  13.   for b,a in zip(before_gen, after_gen): 
  14.     assert (a != b).any() 
  15.   # Make sure descriminator did NOT change. 
  16.   for b,a in zip(before_des, after_des): 
  17.     assert (a == b).all() 

可以為鑒別器編寫一個非常類似的測試。同樣的測試也可以用于許多強化學(xué)習(xí)算法。許多行為-批評模型有單獨的網(wǎng)絡(luò),需要根據(jù)不同的損失進行優(yōu)化。

下面是一些我推薦你進行測試的模式。

  • 讓測試具有確定性。如果一個測試以一種奇怪的方式失敗,卻永遠無法重現(xiàn)這個錯誤,那就太糟糕了。如果你真的想要隨機輸入,確保使用種子隨機數(shù),這樣你就可以輕松地重新運行測試。
  • 保持測試簡短。不要使用單元測試來訓(xùn)練收斂性并檢查驗證集。這樣做是在浪費自己的時間。
  • 確保你在每個測試之間重置了計算圖。

總之,這些黑箱算法仍然有很多方法需要測試!花一個小時寫一個測試可以節(jié)省你幾天的重新運行訓(xùn)練模型,并可以大大提高你的研究效率。因為我們的實現(xiàn)有缺陷而不得不放棄完美的想法,這不是很糟糕嗎?

這個列表顯然不全面,但它是一個堅實的開始!

責(zé)任編輯:趙寧寧 來源: 今日頭條
相關(guān)推薦

2017-12-12 13:17:36

機器學(xué)習(xí)代碼單元測試

2021-09-18 15:40:03

Vue單元測試命令

2012-05-17 09:09:05

Titanium單元測試

2017-01-14 23:42:49

單元測試框架軟件測試

2009-09-29 16:21:31

Hibernate單元

2011-04-18 13:20:40

單元測試軟件測試

2020-09-30 08:08:15

單元測試應(yīng)用

2009-06-26 17:48:38

JSF項目單元測試JSFUnit

2012-11-01 11:32:23

IBMdw

2012-11-01 11:37:05

JavaScript單元測試測試工具

2021-03-28 23:03:50

Python程序員編碼

2022-03-15 11:55:24

前端單元測試

2013-12-18 09:56:20

AngularJS測試

2017-01-16 12:12:29

單元測試JUnit

2017-01-14 23:26:17

單元測試JUnit測試

2020-08-18 08:10:02

單元測試Java

2022-05-09 08:55:52

ORMMockGo

2021-05-05 11:38:40

TestNGPowerMock單元測試

2017-03-23 16:02:10

Mock技術(shù)單元測試

2023-07-26 08:58:45

Golang單元測試
點贊
收藏

51CTO技術(shù)棧公眾號

日韩欧美在线一区| 欧美午夜精品一区二区三区| 一区二区三区在线观看免费| 亚洲女色av| 成人免费观看www在线| 极品尤物一区二区三区| 精品国产一区av| 一本色道**综合亚洲精品蜜桃冫| 国产电影一区在线| 91超碰国产精品| 青青国产精品| 男人天堂手机在线| 成人影院在线观看视频| 欧美一卡2卡3卡4卡无卡免费观看水多多| 欧美成人性生活| 日韩一区和二区| 亚洲黄色录像片| 国产高清不卡一区| 很黄很黄激情成人| 成人盗摄视频| 午夜久久中文| 国产高清在线观看| 久热精品在线观看视频| 在线丝袜欧美日韩制服| 成人免费午夜电影| 欧美成人免费小视频| 欧美大片一区二区| 欧美日韩免费区域视频在线观看| 91美女视频网站| 久久超碰97中文字幕| 欧美激情一区| 欧美18xxxx| 成人精品一区二区三区电影| 国产在线激情| 又黄又爽在线免费观看| www.激情小说.com| 国产freexxxx性播放麻豆| 欧美日韩喷水| 亚洲www在线观看| 欧美诱惑福利视频| 久久国产精品网站| 亚洲午夜未删减在线观看| 欧美肥胖老妇做爰| 亚洲va在线va天堂| 中文字幕一区二区三区在线不卡 | 精品伦理精品一区| 精品久久久久久中文字幕一区奶水 | 国产亚洲精品久久久| 欧美精品亚洲二区| 精品国产91久久久久久| 中文字幕巨乱亚洲| www.亚洲在线| 国产精品综合在线视频| 三级精品在线观看| 亚洲成人资源| 你懂的网址国产 欧美| 日韩在线不卡| 自拍偷拍欧美一区| 国产精品巨作av| 亚洲免费资源| 日韩电影大全网站| 乡村艳史在线观看| 蜜臀久久精品| 福利视频在线| 免费看美女视频在线网站| 国产www.大片在线| 久热av在线| 国产中文在线视频| 国产一二在线观看| 成年人在线观看| 国产福利第一视频在线播放| 精品一二三区视频| 成人一区二区不卡免费| 国产视频三级在线观看播放| 国产永久av在线| 99精品老司机免费视频| 免费在线观看一级毛片| 日韩二区三区| 国产黄色在线| 在线日本视频| 91在线视频| 麻豆传媒在线免费| 羞羞视频在线观看不卡| 色婷婷视频在线观看| 国产三级伦理在线| 手机在线观看av网站| 亚洲天堂资源| yiren22亚洲综合| 国产精品欧美一区二区三区不卡| 日韩视频在线直播| 任你弄精品视频免费观看| 九九久久成人| 亚洲精品一二三区区别| 红桃视频国产一区| 久久三级视频| 国产真实乱子伦精品视频| 成人综合在线观看| 国产农村妇女毛片精品久久麻豆 | 日韩av一级大片| 亚洲欧洲精品一区二区三区波多野1战4| 天天久久人人| 女女同性女同一区二区三区按摩| 菠萝蜜视频在线观看入口| 久草资源站在线观看| av电影资源| 一级毛片在线| 黄色在线免费看| mm视频在线视频| 日本a人精品| 国产99re| 亚洲国产精品电影| 亚洲国产精品电影| 亚洲视频电影图片偷拍一区| 亚洲精品一区中文| 久久韩剧网电视剧| 97在线视频精品| 国产精品一久久香蕉国产线看观看| 国产精品成人v| 国产精品毛片一区视频| 色噜噜一区二区| 妞干网在线播放| 亚洲欧美日韩一级| 一起操在线观看| 成人video亚洲精品| 日韩性xxx| 2020国产精品极品色在线观看| 狠狠操综合网| 一区二区日韩免费看| 免费在线观看一区二区三区| av亚洲精华国产精华精华| 亚洲男人电影天堂| 欧美三级乱人伦电影| 日韩激情视频在线| 久久人人97超碰精品888| 91在线观看免费高清| 亚洲一卡二卡三卡四卡无卡网站在线看 | 成人免费高清| 成人交换视频| 日韩精品一卡| 久久爱另类一区二区小说| 久久精品人人做人人爽人人| 色av综合在线| 国产一区二区欧美日韩| 人妖精品videosex性欧美| 欧美高清性xxxxhd| 熟女人妇 成熟妇女系列视频| 青青操视频在线| 日韩激情电影免费看| 日韩欧美影院| 日韩精品电影在线| 国产午夜精品美女毛片视频| 欧美午夜精品久久久久久超碰 | 91精品91久久久中77777| 亚洲丝袜av一区| 91精品久久久久久综合乱菊| 伊人久久大香线蕉av一区| 一本色道久久亚洲综合精品蜜桃| 国产h在线观看| 国产精品一区免费在线| 在线欧美一区| 国产农村妇女毛片精品久久麻豆| 欧美色综合影院| 不卡av日日日| 欧美福利精品| 黄色国产网站| 国产成人免费9x9x人网站视频| 99国产精品一区二区| 成人av网站在线| 欧美日韩一区二区在线视频| 欧美激情影音先锋| 日韩一本精品| 九色在线网站| 黄色日韩网站| 亚洲精选成人| 亚洲精品日韩一| 在线播放国产精品| 好吊妞www.84com只有这里才有精品| 日韩毛片在线免费看| 97caopor国产在线视频| 日韩欧美影院| 国产91丝袜在线播放| 欧美乱熟臀69xxxxxx| 性色av香蕉一区二区| 一本一道久久a久久综合精品| 亚洲第一se情网站| 99精品中文字幕在线不卡 | 国产大片一区| 国产清纯在线一区二区www| 精品国产免费人成电影在线观看四季| 欧美在线视频免费观看| 日韩国产小视频| 视频三区在线| 日韩专区精品| 久久综合九色综合97婷婷| 亚洲成人中文字幕| 成人av资源网| 在线天堂日本| 精品综合久久88少妇激情| 不卡大黄网站免费看| 亚洲白拍色综合图区|