拿到基礎程式後。基本可以試一下效果了。不過效果會很差。也就是結構準確一點點罷了。
n_classes = 10 # 5種手勢
img_w = 227 # resize影象,太大的話訓練時間久
img_h = 227
batch_size = 64 # 由於資料集較小,所以選值較大 一次訓練512張已經是該電腦的極限了
capacity = 320
max_step = 10000
learning_rate = 0.0001 # 一般小於0.0001
手勢的個數。目前我用的手勢個數是10個。
一共用了10種手勢。其他的不展示了。如果你使用開源的手勢資料集的話,只有750張。對於卷積神經網路來說,資料是遠遠不夠的。
我來給你乙個參考資料。對於像 alexnet 這種網路,6000萬的參數量的話。需要至少10萬張訓練資料。每個樣本至少1000張。當然了。你感覺資料好像有點太多了是吧。你可以某種程度上吧網路結構減少,用影象增強的方式來增加影象,你也可以增加影象的分類,用官方的公開的資料集來增加訓練影象的數量。哈哈。說的好輕巧。就影象這一項夠你幾周處理的了。當然,這也是目前深度學習神經網路的巨大弊端之一。當然目前已經有些方法了,比如預訓練模型等。
資料不夠,不能過擬合啊。改造一下模型。
# 第三層為全連線層local3
with tf.variable_scope('local3') as scope:
# flatten-把卷積過的多維tensor拉平成二維張量(矩陣)
reshape = tf.reshape(pooling, shape=[batch_size, -1]) # batch_size表明了有多少個樣本
dim = reshape.get_shape()[1].value # 知道-1(代表任意)這裡具體是多少個
weights = tf.get_variable('weights',
shape=[dim, 1024], # 連線1024個神經元
dtype=tf.float32,
initializer=tf.truncated_normal_initializer(stddev=0.005, dtype=tf.float32))
biases = tf.get_variable('biases',
shape=[1024],
dtype=tf.float32,
initializer=tf.constant_initializer(0.1))
local3 = tf.nn.relu(tf.matmul(reshape, weights) + biases, name=scope.name) # 矩陣相乘加上bias
local3 = tf.nn.dropout(local3, keep_prob) # 設定神經元被選中的概率
# 第四層為全連線層local4
with tf.variable_scope('local4') as scope:
weights = tf.get_variable('weights',
shape=[1024, 1024], # 再連線1024個神經元
dtype=tf.float32,
initializer=tf.truncated_normal_initializer(stddev=0.005, dtype=tf.float32))
biases = tf.get_variable('biases',
shape=[1024],
dtype=tf.float32,
initializer=tf.constant_initializer(0.1))
local4 = tf.nn.relu(tf.matmul(local3, weights) + biases, name='local4')
local4 = tf.nn.dropout(local4, keep_prob)
全連線層,占用了絕大多數的引數。沒辦法。減少引數就把模型改小。1024個神經元,改小成256個。
with tf.variable_scope('conv1') as scope:
# 建立weights和biases的共享變數
# conv1, shape = [kernel size, kernel size, channels, kernel numbers]
weights = tf.get_variable('weights',
shape=[11, 11, 3, 96],
dtype=tf.float32,
initializer=tf.truncated_normal_initializer(stddev=0.1,dtype=tf.float32)) # stddev標準差
biases = tf.get_variable('biases',
shape=[96],
dtype=tf.float32,
initializer=tf.constant_initializer(0.1))
# 卷積層 strides = [1, x_movement, y_movement, 1], padding填充周圍有valid和same可選擇
conv = tf.nn.conv2d(images, weights, strides=[1, 4, 4, 1], padding='same')
pre_activation = tf.nn.bias_add(conv, biases) # 加入偏差
conv1 = tf.nn.relu(pre_activation, name=scope.name) # 加上啟用函式非線性化處理,且是在conv1的命名空間
# 第一層的池化層pool1和規範化norm1(特徵縮放)
with tf.variable_scope('pooling1_lrn') as scope:
pool1 = tf.nn.max_pool(conv1, ksize=[1, 3, 3, 1], strides=[1, 2, 2, 1],
padding='valid', name='pooling1')
norm1 = tf.nn.lrn(pool1, depth_radius=4, bias=1.0, alpha=0.001/9.0,
beta=0.75,name='norm1')
# ksize是池化視窗的大小=[1,height,width,1],一般height=width=池化視窗的步長
# 池化視窗的步長一般是比卷積核多移動一位
# tf.nn.lrn是local response normalization,(區域性響應歸一化)
# 第二層的卷積層cov2,這裡的命名空間和第一層不一樣,所以可以和第一層取同名
with tf.variable_scope('conv2') as scope:
weights = tf.get_variable('weights',
shape=[5, 5, 96, 256], # 這裡只有第三位數字96需要等於上一層的tensor維度
dtype=tf.float32,
initializer=tf.truncated_normal_initializer(stddev=0.1,dtype=tf.float32))
biases = tf.get_variable('biases',
shape=[256],
dtype=tf.float32,
initializer=tf.constant_initializer(0.1))
conv = tf.nn.conv2d(norm1, weights, strides=[1, 1, 1, 1],padding='same')
pre_activation = tf.nn.bias_add(conv, biases)
conv2 = tf.nn.relu(pre_activation, name='conv2')
這裡占用絕大多數的計算量。可以考慮把的大小修改了。因為比賽的影象標準大小就是227x227. resize一下把模型改小到180x180.也可以。
要不然,該小shape的數量。
神經網路的除錯方法嘛?知乎上: 。你也可以直接在知乎上搜尋, 神經網路調參技巧。 基本涵蓋了所有的方法。能達到什麼程度,看自己的修為了。
好了,說到這裡。努力調參,訓練吧。點到為止。
有興趣相關技術的人可以看個人介紹和我毛華望聯絡。 目前人在深圳寶安區。
深度學習 TensorFlow 入門之基本使用
使用 tensorflow,你必須明白 tensorflow 賦值或者從其中獲取資料.乙個 tensorflow 圖描述了計算的過程.為了進行計算,圖必須在 會話 裡被啟動.會話 將圖的 op 分發到諸如 cpu 或 gpu 之類的 裝置 上,同時提供執行 op 的方法.這些方法執行後,將產生的 t...
人人都會深度學習之Tensorflow基礎快速入門
tensorflow基礎快速入門 課程的目的是幫助廣大的深度學習愛好者,逐層深入,步步精通當下最流行的深度學習框架tensorflow。該課程包含tensorflow執行原理,tensor上面常見的操作,常見api的使用,公式推導,tensorboard,張量形狀變換,張量上的資料操作,算術操作,矩...
TensorFlow 深度學習筆記
google 深度學習筆記 經常總結是個好習慣,筆記目錄奉上。歡迎star,有問題可以到issue區討論 官方教程位址 最近tensorflow團隊出了乙個model專案,和這個課程無關,但是可以參考 框架 tensorflow 谷歌出品的基於python的深度學習工具集 工具 ipython,py...