您好,登錄后才能下訂單哦!
這篇文章將為大家詳細(xì)講解有關(guān)如何實現(xiàn)TensorFlow微信跳一跳的AI,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
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ò)作為訓(xùn)練模型,截屏圖片作為輸入,按壓毫秒數(shù)直接作為為輸出。
3.訓(xùn)練過程
最開始想的用強化學(xué)習(xí),然后發(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訓(xùn)練時為0.6 keep_prob = tf.placeholder(tf.float32) h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob) # 學(xué)習(xí)率 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會導(dǎo)致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]
以上代碼過程大概是這樣:
最后,開始訓(xùn)練:
while True: ………… # 每訓(xùn)練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})
訓(xùn)練所用數(shù)據(jù)是直接從采集好的文件中讀取的,由于樣本有限(目前采集了800張圖和對應(yīng)800個按壓時間,在github上train_data文件夾里),并且學(xué)習(xí)率太大又會震蕩,只能用較小學(xué)習(xí)率反復(fù)學(xué)習(xí)這些圖片。
關(guān)于“如何實現(xiàn)TensorFlow微信跳一跳的AI”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。