您好,登錄后才能下訂單哦!
這篇文章主要介紹了如何使用Tensorflow將自己的數據分割成batch訓練,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
一、tf.slice_input_producer()
首先需要講解兩個函數,第一個函數是 :tf.slice_input_producer(),這個函數的作用是從輸入的tensor_list按要求抽取一個tensor放入文件名隊列,下面解釋下各個參數:
tf.slice_input_producer(tensor_list, num_epochs=None, shuffle=True, seed=None, capacity=32, shared_name=None, name=None)
tensor_list 這個就是輸入,格式為tensor的列表;一般為[data, label],即由特征和標簽組成的數據集
num_epochs 這個是你抽取batch的次數,如果沒有給定值,那么將會抽取無數次batch(這會導致你訓練過程停不下來),如果給定值,那么在到達次數之后就會報OutOfRange的錯誤
shuffle 是否隨機打亂,如果為False,batch是按順序抽取;如果為True,batch是隨機抽取
seed 隨機種子
capcity 隊列容量的大小,為整數
name 名稱
舉個例子:我的data的shape為(4000,10),label的shape為(4000,2),運行下面這行代碼
input_queue = tf.train.slice_input_producer([data, label], num_epochs=1, shuffle=True, capacity=32 )
結果如圖,可以看出返回值為一個包含兩組數據的list,每個list的shape與輸入的data和label的shape對應
二、tf.train.batch()& tf.train.shuffle_batch()
第二個函數為:tf.train.batch(),tf.train.shuffle_batch(),這個函數的作用為生成大小為batch_size的tensor,下面解釋下各個參數:
tf.train.batch([data, label], batch_size=batch_size, capacity=capacity,num_threads=num_thread,allow_smaller_final_batch= True) tf.train.shuffle_batch([example, label], batch_size=batch_size, capacity=capacity,num_threads=num_thread,allow_smaller_final_batch=True)
[data,label] 輸入的樣本和標簽
batch_size batch的大小
capcity 隊列的容量
num_threads 線程數,使用多少個線程來控制整個隊列
allow_smaller_final_batch 這個是當最后的幾個樣本不夠組成一個batch的時候用的參數,如果為True則會重新組成一個batch
下面給出生成batch的函數,由上面兩個函數組成:
def get_Batch(data, label, batch_size): print(data.shape, label.shape) input_queue = tf.train.slice_input_producer([data, label], num_epochs=1, shuffle=True, capacity=32 ) x_batch, y_batch = tf.train.batch(input_queue, batch_size=batch_size, num_threads=1, capacity=32, allow_smaller_final_batch=False) return x_batch, y_batch
還是同樣的輸入,batch_size設為2000,看下運行后的返回值的shape:
可以發現,返回是樣本數目為2000的tensor,也就是達到了將自己的數據打包成batch的功能
三、batch的使用方法
生成batch只完成了一半,后面的使用方法也比較復雜,直接上一個完整的程序來講解會方便理解一些:下面代碼構建了一個單層感知機,對數據進行分類,主要看一下訓練過程中如何使用生成好了的batch,具體細節都寫在注釋里面了。
import tensorflow as tf import scipy.io as sio import numpy as np def get_Batch(data, label, batch_size): print(data.shape, label.shape) input_queue = tf.train.slice_input_producer([data, label], num_epochs=1, shuffle=True, capacity=32 ) x_batch, y_batch = tf.train.batch(input_queue, batch_size=batch_size, num_threads=1, capacity=32, allow_smaller_final_batch=False) return x_batch, y_batch data = sio.loadmat('data.mat') train_x = data['train_x'] train_y = data['train_y'] test_x = data['test_x'] test_y = data['test_y'] x = tf.placeholder(tf.float32, [None, 10]) y = tf.placeholder(tf.float32, [None, 2]) w = tf.Variable(tf.truncated_normal([10, 2], stddev=0.1)) b = tf.Variable(tf.truncated_normal([2], stddev=0.1)) pred = tf.nn.softmax(tf.matmul(x, w) + b) loss = tf.reduce_mean(-tf.reduce_sum(y * tf.log(pred), reduction_indices=[1])) optimizer = tf.train.AdamOptimizer(2e-5).minimize(loss) correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(pred, 1)) accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32), name='evaluation') x_batch, y_batch = get_Batch(train_x, train_y, 1000) # 訓練 with tf.Session() as sess: #初始化參數 sess.run(tf.global_variables_initializer()) sess.run(tf.local_variables_initializer()) # 開啟協調器 coord = tf.train.Coordinator() # 使用start_queue_runners 啟動隊列填充 threads = tf.train.start_queue_runners(sess, coord) epoch = 0 try: while not coord.should_stop(): # 獲取訓練用的每一個batch中batch_size個樣本和標簽 data, label = sess.run([x_batch, y_batch]) sess.run(optimizer, feed_dict={x: data, y: label}) train_accuracy = accuracy.eval({x: data, y: label}) test_accuracy = accuracy.eval({x: test_x, y: test_y}) print("Epoch %d, Training accuracy %g, Testing accuracy %g" % (epoch, train_accuracy, test_accuracy)) epoch = epoch + 1 except tf.errors.OutOfRangeError: # num_epochs 次數用完會拋出此異常 print("---Train end---") finally: # 協調器coord發出所有線程終止信號 coord.request_stop() print('---Programm end---') coord.join(threads) # 把開啟的線程加入主線程,等待threads結束
總共訓練的次數為(樣本數目/batch_size)*num_epochs
四、 簡單生成Batch的方法
最近發現了一種簡單生生成batch的方法,實現簡單,操作方便,就是時間復雜度可能高了一點,直接上代碼。通過np.random.choice方法每次在范圍[0, len(all_data))內抽取大小為size的索引。然后通過這部分索引構建batch。
epoch = 150 for i in tqdm(range(epoch)): # 在total_train_xs, total_train_ys數據集中隨機抽取batch_size個樣本出來 # 作為本輪迭代的訓練數據batch_xs, batch_ys batch_size = 1000 sample_idxs = np.random.choice(range(len(all_data)), size=batch_size) batch_xs = [] batch_ys = [] val_sample_idxs = np.random.choice(range(len(all_data)), size=batch_size) val_batch_xs = [] val_batch_ys = [] for j in range(batch_size): train_id = sample_idxs[j] batch_xs.append(all_data[train_id]) batch_ys.append(all_label[train_id]) val_id = val_sample_idxs[j] val_batch_xs.append(all_data[val_id]) val_batch_ys.append(all_label[val_id]) batch_xs = np.array(batch_xs) batch_ys = np.array(batch_ys) val_batch_xs = np.array(val_batch_xs) val_batch_ys = np.array(val_batch_ys) # 喂訓練數據進去訓練 sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys}) if i % 50 == 0: y_train_pred = np.array(sess.run(y, feed_dict={x: batch_xs})).reshape(len(batch_xs)) y_pred = np.array(sess.run(y, feed_dict={x: val_batch_xs})).reshape(len(val_batch_xs)) # draw(y_test, y_pred) print("Iteration %d, train RMSE %f, val RMSE %f" % (i, calcaulateRMSE(batch_ys, y_train_pred), calcaulateRMSE(val_batch_ys, y_pred)))
感謝你能夠認真閱讀完這篇文章,希望小編分享的“如何使用Tensorflow將自己的數據分割成batch訓練”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。