最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

輕松實現(xiàn)TensorFlow微信跳一跳的AI

 更新時間:2018年01月05日 09:39:47   作者:zhanys_7  
這篇文章主要教大家如何輕松實現(xiàn)TensorFlow微信跳一跳的AI,具有一定的參考價值,感興趣的小伙伴們可以參考一下

作為python和機器學習的初學者,目睹了AI玩游戲的各種風騷操作,心里也是躍躍欲試。

然后發(fā)現(xiàn)微信跳一跳很符合需求,因為它不需要處理連續(xù)畫面(截屏太慢了)和復雜的操作,很適合拿來練手。于是…這個東西誕生了,目前它一般都可以跳到100多分,發(fā)揮好了能上200。

1.需要設(shè)備:

Android手機,數(shù)據(jù)線
ADB環(huán)境
Python環(huán)境(本例使用3.6.1)
TensorFlow(本例使用1.0.0)

2.大致原理

使用adb模擬點擊和截屏,使用兩層卷積神經(jīng)網(wǎng)絡(luò)作為訓練模型,截屏圖片作為輸入,按壓毫秒數(shù)直接作為為輸出。

3.訓練過程

最開始想的用強化學習,然后發(fā)現(xiàn)讓它自己去玩成功率太!低!了!,加上每次截屏需要大量時間,就放棄了這個方法,于是考慮用自己玩的數(shù)據(jù)作為樣本喂給它,這樣就需要知道每次按壓的時間。

我是這樣做的,找一個手機寫個app監(jiān)聽按壓屏幕時間,另一個手機玩游戲,然后兩個手指同時按兩個手機o(╯□╰)o

4.上代碼

首先,搭建模型:

第一層卷積:5*5的卷積核,12個featuremap,此時形狀為96*96*12
池化層:4*4 max pooling,此時形狀為24*24*12
第二層卷積:5*5的卷積核,24個featuremap,此時形狀為20*20*24
池化層:4*4 max pooling,此時形狀為5*5*24
全連接層:5*5*24連接到32個節(jié)點,使用relu激活函數(shù)和0.4的dropout率
輸出:32個節(jié)點連接到1個節(jié)點,此節(jié)點就代表按壓的時間(單位s)

# 輸入:100*100的灰度圖片,前面的None是batch size,這里都為1 
x = tf.placeholder(tf.float32, shape=[None, 100, 100, 1]) 
# 輸出:一個浮點數(shù),就是按壓時間,單位s 
y_ = tf.placeholder(tf.float32, shape=[None, 1]) 
 
# 第一層卷積 12個feature map 
W_conv1 = weight_variable([5, 5, 1, 12], 0.1) 
b_conv1 = bias_variable([12], 0.1) 
# 卷積后為96*96*12 
 
h_conv1 = tf.nn.relu(conv2d(x, W_conv1) + b_conv1) 
h_pool1 = max_pool_4x4(h_conv1) 
# 池化后為24*24*12 
 
# 第二層卷積 24個feature map 
W_conv2 = weight_variable([5, 5, 12, 24], 0.1) 
b_conv2 = bias_variable([24], 0.1) 
# 卷積后為20*20*24 
 
h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2) 
h_pool2 = max_pool_4x4(h_conv2) 
# 池化后為5*5*24 
 
# 全連接層5*5*24 --> 32 
W_fc1 = weight_variable([5 * 5 * 24, 32], 0.1) 
b_fc1 = bias_variable([32], 0.1) 
h_pool2_flat = tf.reshape(h_pool2, [-1, 5 * 5 * 24]) 
h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1) 
 
# drapout,play時為1訓練時為0.6 
keep_prob = tf.placeholder(tf.float32) 
h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob) 
# 學習率 
learn_rate = tf.placeholder(tf.float32) 
 
# 32 --> 1 
W_fc2 = weight_variable([32, 1], 0.1) 
b_fc2 = bias_variable([1], 0.1) 
y_fc2 = tf.matmul(h_fc1_drop, W_fc2) + b_fc2 
 
# 因輸出直接是時間值,而不是分類概率,所以用平方損失 
cross_entropy = tf.reduce_mean(tf.square(y_fc2 - y_)) 
train_step = tf.train.AdamOptimizer(learn_rate).minimize(cross_entropy) 

其次,獲取屏幕截圖并轉(zhuǎn)換為模型輸入:

# 獲取屏幕截圖并轉(zhuǎn)換為模型的輸入 
def get_screen_shot(): 
  # 使用adb命令截圖并獲取圖片,這里如果把后綴改成jpg會導致TensorFlow讀不出來 
  os.system('adb shell screencap -p /sdcard/jump_temp.png') 
  os.system('adb pull /sdcard/jump_temp.png .') 
  # 使用PIL處理圖片,并轉(zhuǎn)為jpg 
  im = Image.open(r"./jump_temp.png") 
  w, h = im.size 
  # 將圖片壓縮,并截取中間部分,截取后為100*100 
  im = im.resize((108, 192), Image.ANTIALIAS) 
  region = (4, 50, 104, 150) 
  im = im.crop(region) 
  # 轉(zhuǎn)換為jpg 
  bg = Image.new("RGB", im.size, (255, 255, 255)) 
  bg.paste(im, im) 
  bg.save(r"./jump_temp.jpg") 
 
  img_data = tf.image.decode_jpeg(tf.gfile.FastGFile('./jump_temp.jpg', 'rb').read()) 
  # 使用TensorFlow轉(zhuǎn)為只有1通道的灰度圖 
  img_data_gray = tf.image.rgb_to_grayscale(img_data) 
  x_in = np.asarray(img_data_gray.eval(), dtype='float32') 
 
  # [0,255]轉(zhuǎn)為[0,1]浮點 
  for i in range(len(x_in)): 
    for j in range(len(x_in[i])): 
      x_in[i][j][0] /= 255 
 
  # 因為輸入shape有batch維度,所以還要套一層 
  return [x_in] 

以上代碼過程大概是這樣:

最后,開始訓練:

while True: 
 
  ………… 
 
  # 每訓練100個保存一次 
  if train_count % 100 == 0: 
    saver_init.save(sess, "./save/mode.mod") 
 
  …………   
  
  sess.run(train_step, feed_dict={x: x_in, y_: y_out, keep_prob: 0.6, learn_rate: 0.00005}) 

訓練所用數(shù)據(jù)是直接從采集好的文件中讀取的,由于樣本有限(目前采集了800張圖和對應(yīng)800個按壓時間,在github上train_data文件夾里),并且學習率太大又會震蕩,只能用較小學習率反復學習這些圖片。

5.總結(jié)

1.樣本的按壓時間大都分布在300ms到900ms之間,剛開始訓練的時候發(fā)現(xiàn)不論什么輸入,輸出都一直很謹慎的停留在600左右,還以為這種方法不可行。不過半個小時后再看發(fā)現(xiàn)已經(jīng)有效果了,對于不同的輸入,輸出值差距開始變大了。所以…相信卷積網(wǎng)絡(luò)的威力,多給它點耐心。

2.由于我自己最多玩到100多分,后面的數(shù)據(jù)沒法采集到,所以當后面物體變得越來越小時,這個AI也會變得容易掛掉。理論上說讓它自己探索不會有這個瓶頸,只是截屏時間實在難以忍受。

3.目前還是初級的版本,有很多可以優(yōu)化的地方,比如說識別左上角的分數(shù),如果某次跳躍得分較高,那么可以把這次的學習率增大;檢測特殊物體,比如超市音樂盒,就停留幾秒再進行下一次跳躍,等等。

下面是github地址,源碼加注釋總共不到300行:
https://github.com/zhanyongsheng/LetsJump

更多內(nèi)容大家可以參考專題《微信跳一跳》進行學習。

相關(guān)文章

  • 用python做一個搜索引擎(Pylucene)的實例代碼

    用python做一個搜索引擎(Pylucene)的實例代碼

    下面小編就為大家?guī)硪黄胮ython做一個搜索引擎(Pylucene)的實例代碼。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • Python中subplots_adjust函數(shù)的用法

    Python中subplots_adjust函數(shù)的用法

    這篇文章主要介紹了Python中subplots_adjust函數(shù)的用法及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • python如何打印楊輝三角及輸出第m行第k個數(shù)

    python如何打印楊輝三角及輸出第m行第k個數(shù)

    這篇文章主要介紹了python如何打印楊輝三角及輸出第m行第k個數(shù)問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • Python實現(xiàn)批量設(shè)置圖片背景為透明

    Python實現(xiàn)批量設(shè)置圖片背景為透明

    我們?nèi)粘I钪兄谱鱌PT等教學資源時,需要批量去除圖片背景,就可以使用 Python 的 rembg 庫,下面我們就來看看如何操作rembg實現(xiàn)批量設(shè)置圖片背景為透明吧
    2024-11-11
  • Python實現(xiàn)格式化輸出的實例詳解

    Python實現(xiàn)格式化輸出的實例詳解

    這篇文章主要為大家介紹了Python語法中實現(xiàn)格式化輸出的方法,本文通過幾個實例為大家進行了詳細的講解,感興趣的小伙伴可以了解一下
    2022-08-08
  • 淺談關(guān)于Python3中venv虛擬環(huán)境

    淺談關(guān)于Python3中venv虛擬環(huán)境

    這篇文章主要介紹了淺談關(guān)于Python3中venv虛擬環(huán)境,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-08-08
  • jupyter notebook如何導出pdf并支持中文

    jupyter notebook如何導出pdf并支持中文

    這篇文章主要介紹了jupyter notebook如何導出pdf并支持中文問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • python實現(xiàn)excel讀寫數(shù)據(jù)

    python實現(xiàn)excel讀寫數(shù)據(jù)

    這篇文章主要為大家詳細介紹了python操作EXCEL讀數(shù)據(jù)、寫數(shù)據(jù)的實例源碼,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-04-04
  • python 模擬登陸163郵箱

    python 模擬登陸163郵箱

    這篇文章主要介紹了python 模擬登陸163郵箱的示例,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2020-12-12
  • Python 數(shù)據(jù)可視化之Bokeh詳解

    Python 數(shù)據(jù)可視化之Bokeh詳解

    這篇文章主要介紹了Python數(shù)據(jù)可視化庫Bokeh的使用總結(jié),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-11-11

最新評論

云霄县| 肥东县| 泰安市| 兴文县| 德令哈市| 南皮县| 克什克腾旗| 晋州市| 高台县| 手机| 锦屏县| 枝江市| 西吉县| 济南市| 屯门区| 南昌市| 云浮市| 沙洋县| 西峡县| 茌平县| 防城港市| 西吉县| 桓仁| 滦平县| 如皋市| 抚远县| 阳原县| 和田市| 保山市| 邵阳市| 舒兰市| 通河县| 崇左市| 开原市| 浦北县| 烟台市| 图木舒克市| 陆川县| 承德县| 如东县| 凌云县|