網站首頁 編程語言 正文
最近深度學習用到的數據集比較大,如果一次性將數據集讀入內存,那服務器是頂不住的,所以需要分批進行讀取,這里就用到了tf.data.Dataset構建數據集:
概括一下,tf.data.Dataset主要有幾個部分最重要:
- 構建生成器函數
- 使用tf.data.Dataset的from_generator函數,通過指定數據類型,數據的shape等參數,構建一個Dataset
- 指定batch_size
- 使用make_one_shot_iterator()函數,構建一個iterator
- 使用上面構建的迭代器開始get_next() 。(必須要有這個get_next(),迭代器才會工作)
一.構建生成器
生成器的要點是要在while True中加入yield,yield的功能有點類似return,有yield才能起到迭代的作用。
我的數據是一個[6047, 6000, 1]的文本數據,我每次迭代返回的shape為[1,6000,1],要注意的是返回的shape要和構建Dataset時的shape一致,下面會說到。
代碼如下:
def gen():?? ??? ??? ??? ? ?? ??? ?train=pd.read_csv('/home/chenqiren/PycharmProjects/code/test/formal/small_sample/train2.csv', header=None) ? ? ? ? train.fillna(0, inplace = True) ? ? ? ? label_encoder = LabelEncoder().fit(train[6000]) ? ? ? ? label = label_encoder.transform(train[6000]) ? ? ? ? ? train = train.drop([6000], axis=1)? ? ? ? ? scaler = StandardScaler().fit(train.values) ? #train.values中的值是csv文件中的那些值, ? ? 這步標準化可以保留 ? ? ? ? scaled_train = scaler.transform(train.values) ? ? ? ? #print(scaled_train) ? ? ? ? #拆分訓練集和測試集-------------- ? ? ? ? sss=StratifiedShuffleSplit(test_size=0.1, random_state=23) ? ? ? ? for train_index, valid_index in sss.split(scaled_train, label): ? #需要的是數組,train.values得到的是數組 ? ? ? ? ? ? X_train, X_valid=scaled_train[train_index], scaled_train[valid_index] ?#https://www.cnblogs.com/Allen-rg/p/9453949.html ? ? ? ? ? ? y_train, y_valid=label[train_index], label[valid_index] ? ? ? ? X_train_r=np.zeros((len(X_train), 6000, 1)) ? #先構建一個框架出來,下面再賦值 ? ? ? ? X_train_r[:,: ,0]=X_train[:,0:6000] ? ?? ? ?? ? ? ? ? X_valid_r=np.zeros((len(X_valid), 6000, 1)) ? ? ? ? X_valid_r[:,: ,0]=X_valid[:,0:6000] ? ?? ? ? ? ? y_train=np_utils.to_categorical(y_train, 3) ? ? ? ? y_valid=np_utils.to_categorical(y_valid, 3) ? ? ? ?? ? ? ? ? leng=len(X_train_r) ? ? ? ? index=0 ? ? ? ? while True: ? ? ? ? ? ? x_train_batch=X_train_r[index, :, 0:1] ? ? ? ? ? ? y_train_batch=y_train[index, :] ? ? ? ? ? ? yield (x_train_batch, y_train_batch) ? ? ? ? ? ? index=index+1 ? ? ? ? ? ? if index>leng: ? ? ? ? ? ? ? ? break
代碼中while True上面的部分是標準化數據的代碼,可以不用看,只需要看 while True中的代碼即可。
x_train_batch, y_train_batch都只是一行的數據,這里是一行一行數據迭代。
二.使用tf.data.Dataset包裝生成器
data=tf.data.Dataset.from_generator(gen_1, (tf.float32, tf.float32), (tf.TensorShape([6000,1]), tf.TensorShape([3]))) data=data.batch(128) iterator=data.make_one_shot_iterator()
這里的tf.TensorShape([6000,1]) 和 tf.TensorShape([3])中的shape要和上面生成器yield返回的數據的shape一致。
-
data=data.batch(128)
是設置batchsize,這里設為128,在運行時,因為我們yield的是一行的數據[1, 6000, 1],所以將會循環yield夠128次,得到[128, 6000, 1],即一個batch,才會開始訓練。 -
iterator=data.make_one_shot_iterator()
是構建迭代器,one_shot迭代器人如其名,意思就是數據輸出一次后就丟棄了。
三.獲取生成器返回的數據
x, y=iterator.get_next() x_batch, y_batch=sess.run([x,y])
注意要有get_next(),迭代器才能開始工作。
第二行是run第一行代碼。獲取訓練數據和訓練標簽。
這里做個關于yield的小筆記:
上一次迭代,yield返回了值,然后get_next()開啟了下一次迭代,此時,程序是從yield處開始運行的,也就是說,如果yield后面還有程序,那就會運行yield后面的程序。一直運行的是while True中的程序,沒有運行while True外面的程序。
下面是我寫的總的代碼。可以不用看。
import os import keras import numpy as np import pandas as pd from sklearn.preprocessing import LabelEncoder from sklearn.preprocessing import StandardScaler from sklearn.model_selection import StratifiedShuffleSplit from sklearn.model_selection import train_test_split from keras.models import Sequential, Model from keras.layers import Dense, Activation, Flatten, Conv1D, Dropout, MaxPooling1D, GlobalAveragePooling1D from keras.layers import GlobalAveragePooling2D,BatchNormalization, UpSampling1D, RepeatVector,Reshape from keras.layers.core import Lambda from keras.optimizers import SGD, Adam, Adadelta from keras.utils import np_utils from keras.applications.inception_resnet_v2 import InceptionResNetV2 from keras.backend import conv3d,reshape, shape, categorical_crossentropy, mean, square from keras.applications.vgg16 import VGG16 from keras.layers import Input,LSTM from keras import regularizers from keras.utils import multi_gpu_model import tensorflow as tf import keras.backend.tensorflow_backend as KTF os.environ["CUDA_VISIBLE_DEVICES"]="2" config = tf.ConfigProto() config.gpu_options.allow_growth = True session = tf.Session(config=config) keep_prob = tf.placeholder("float") # 設置session KTF.set_session(session ) #-----生成訓練數據----------------------------------------------- def gen_1(): train=pd.read_csv('/home/chenqiren/PycharmProjects/code/test/formal/small_sample/train2.csv', header=None) train.fillna(0, inplace = True) label_encoder = LabelEncoder().fit(train[6000]) label = label_encoder.transform(train[6000]) train = train.drop([6000], axis=1) scaler = StandardScaler().fit(train.values) #train.values中的值是csv文件中的那些值, 這步標準化可以保留 scaled_train = scaler.transform(train.values) #print(scaled_train) #拆分訓練集和測試集-------------- sss=StratifiedShuffleSplit(test_size=0.1, random_state=23) for train_index, valid_index in sss.split(scaled_train, label): #需要的是數組,train.values得到的是數組 X_train, X_valid=scaled_train[train_index], scaled_train[valid_index] #https://www.cnblogs.com/Allen-rg/p/9453949.html y_train, y_valid=label[train_index], label[valid_index] X_train_r=np.zeros((len(X_train), 6000, 1)) #先構建一個框架出來,下面再賦值 #開始賦值 #https://stackoverflow.com/questions/43290202/python-typeerror-unhashable-type-slice-for-encoding-categorical-data X_train_r[:,: ,0]=X_train[:,0:6000] X_valid_r=np.zeros((len(X_valid), 6000, 1)) X_valid_r[:,: ,0]=X_valid[:,0:6000] y_train=np_utils.to_categorical(y_train, 3) y_valid=np_utils.to_categorical(y_valid, 3) leng=len(X_train_r) index=0 while True: x_train_batch=X_train_r[index, :, 0:1] y_train_batch=y_train[index, :] yield (x_train_batch, y_train_batch) index=index+1 if index>leng: break #----生成測試數據-------------------------------------- def gen_2(): train=pd.read_csv('/home/chenqiren/PycharmProjects/code/test/formal/small_sample/train2.csv', header=None) train.fillna(0, inplace = True) label_encoder = LabelEncoder().fit(train[6000]) label = label_encoder.transform(train[6000]) train = train.drop([6000], axis=1) scaler = StandardScaler().fit(train.values) #train.values中的值是csv文件中的那些值, 這步標準化可以保留 scaled_train = scaler.transform(train.values) #print(scaled_train) #拆分訓練集和測試集-------------- sss=StratifiedShuffleSplit(test_size=0.1, random_state=23) for train_index, valid_index in sss.split(scaled_train, label): #需要的是數組,train.values得到的是數組 X_train, X_valid=scaled_train[train_index], scaled_train[valid_index] #https://www.cnblogs.com/Allen-rg/p/9453949.html y_train, y_valid=label[train_index], label[valid_index] X_train_r=np.zeros((len(X_train), 6000, 1)) #先構建一個框架出來,下面再賦值 #開始賦值 #https://stackoverflow.com/questions/43290202/python-typeerror-unhashable-type-slice-for-encoding-categorical-data X_train_r[:,: ,0]=X_train[:,0:6000] X_valid_r=np.zeros((len(X_valid), 6000, 1)) X_valid_r[:,: ,0]=X_valid[:,0:6000] y_train=np_utils.to_categorical(y_train, 3) y_valid=np_utils.to_categorical(y_valid, 3) leng=len(X_valid_r) index=0 while True: x_test_batch=X_valid_r[index, :, 0:1] y_test_batch=y_valid[index, :] yield (x_test_batch, y_test_batch) index=index+1 if index>leng: break #--------------------------------------------------------------------- def custom_mean_squared_error(y_true, y_pred): return mean(square(y_pred - y_true)) def custom_categorical_crossentropy(y_true, y_pred): return categorical_crossentropy(y_true, y_pred) def loss_func(y_loss, x_loss): return categorical_crossentropy + 0.05 * mean_squared_error #建立模型 with tf.device('/cpu:0'): inputs1=tf.placeholder(tf.float32, shape=(None,6000,1)) x1=LSTM(128, return_sequences=True)(inputs1) encoded=LSTM(64 ,return_sequences=True)(x1) print('encoded shape:',shape(encoded)) #decode x1=LSTM(128, return_sequences=True)(encoded) decoded=LSTM(1, return_sequences=True,name='decode')(x1) #classify labels=tf.placeholder(tf.float32, shape=(None,3)) x2=Conv1D(20,kernel_size=50, strides=2, activation='relu' )(encoded) #步數論文中未提及,第一層 x2=MaxPooling1D(pool_size=2, strides=1)(x2) x2=Conv1D(20,kernel_size=50, strides=2, activation='relu')(x2) #第二層 x2=MaxPooling1D(pool_size=2, strides=1)(x2) x2=Dropout(0.25)(x2) x2=Conv1D(24,kernel_size=30, strides=2, activation='relu')(x2) #第三層 x2=MaxPooling1D(pool_size=2, strides=1)(x2) x2=Dropout(0.25)(x2) x2=Conv1D(24,kernel_size=30, strides=2, activation='relu')(x2) #第四層 x2=MaxPooling1D(pool_size=2, strides=1)(x2) x2=Dropout(0.25)(x2) x2=Conv1D(24,kernel_size=10, strides=2, activation='relu')(x2) #第五層 x2=MaxPooling1D(pool_size=2, strides=1)(x2) x2=Dropout(0.25)(x2) x2=Dense(192)(x2) #第一個全連接層 x2=Dense(192)(x2) #第二個全連接層 x2=Flatten()(x2) x2=Dense(3,activation='softmax', name='classify')(x2) def get_accuracy(x2, labels): current = tf.cast(tf.equal(tf.argmax(x2, 1), tf.argmax(labels, 1)), 'float') accuracy = tf.reduce_mean(current) return accuracy #實例化獲取準確率函數 getAccuracy = get_accuracy(x2, labels) #定義損失函數 all_loss=tf.reduce_mean(categorical_crossentropy(x2 , labels) + tf.convert_to_tensor(0.5)*square(decoded-inputs1)) train_option=tf.train.AdamOptimizer(0.01).minimize(all_loss) #----------------------------------------- #生成訓練數據 data=tf.data.Dataset.from_generator(gen_1, (tf.float32, tf.float32), (tf.TensorShape([6000,1]), tf.TensorShape([3]))) data=data.batch(128) iterator=data.make_one_shot_iterator() #生成測試數據 data2=tf.data.Dataset.from_generator(gen_2, (tf.float32, tf.float32), (tf.TensorShape([6000,1]), tf.TensorShape([3]))) data2=data2.batch(128) iterator2=data2.make_one_shot_iterator() #----------------------------------------- with tf.Session() as sess: init=tf.global_variables_initializer() sess.run(init) i=-1 for k in range(20): #----------------------------------------- x, y=iterator.get_next() x_batch, y_batch=sess.run([x,y]) print('batch shape:',x_batch.shape, y_batch.shape) #----------------------------------------- if k%2==0: print('第',k,'輪') x3=sess.run(x2, feed_dict={inputs1:x_batch, labels:y_batch }) dc=sess.run(decoded, feed_dict={inputs1:x_batch}) accuracy=sess.run(getAccuracy, feed_dict={x2:x3, labels:y_batch, keep_prob: 1.0}) loss=sess.run(all_loss, feed_dict={x2:x3, labels:y_batch, inputs1:x_batch, decoded:dc}) print("step(s): %d ----- accuracy: %g -----loss: %g" % (i, accuracy, loss)) sess.run(train_option, feed_dict={inputs1:x_batch, labels:y_batch, keep_prob: 0.5}) x, y=iterator2.get_next() x_test_batch, y_test_batch=sess.run([x,y]) print('batch shape:',x_test_batch.shape, y_test_batch.shape) x_test=sess.run(x2, feed_dict={inputs1:x_test_batch, labels:y_test_batch }) print ("test accuracy %f"%getAccuracy.eval(feed_dict={x2:x_test, labels:y_test_batch, keep_prob: 1.0}))
總結
原文鏈接:https://blog.csdn.net/weixin_43790560/article/details/95065987
相關推薦
- 2022-06-13 docker鏡像的拉取登陸上傳及保存等相關使用命令_docker
- 2022-02-05 Numpy中不同維度數組之間的計算
- 2022-08-13 C++頭文件定義全局函數或類成員函數
- 2023-01-04 利用Python對哥德巴赫猜想進行檢驗和推理_python
- 2022-07-16 new FileOutputStream(“data\\test2.txt“,true),true是
- 2022-12-28 C++關鍵字const使用方法詳解_C 語言
- 2022-05-11 log4j2.xml 的標簽 loggers 中 root 的屬性 level 指的是什么
- 2022-06-20 正則表達式之字符串模式匹配實例詳解_正則表達式
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支