亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么 Keras model.fit() 將整個數據集用作批處理并耗盡內存?

為什么 Keras model.fit() 將整個數據集用作批處理并耗盡內存?

皈依舞 2021-12-26 15:09:54
我正在使用 tensorflow 構建一個非常簡單的 Keras 模型。當我啟動它時,它因 OOM 異常而失敗,因為它試圖分配一個與整個數據集大小成比例的張量。這里會發生什么?相關形狀:數據集形狀:[60000, 28, 28, 1]Batch_size(自動):10,step_per_epoch:6000錯誤消息:分配形狀為 [60000,256,28,28] 和類型為 float 的張量時出現 OOM注意:我沒有使用順序模型,因為稍后我將需要非順序層。張量流:1.12.0;Keras:2.1.6-tf最小工作示例:from tensorflow.keras import layersimport tensorflow as tfimport tensorflow.keras as kerasimport numpy as npdef build_mnist_model(input_img):    conv1 = layers.Conv2D(256, (3,3), activation='relu', padding='same')(input_img)    conv2 = layers.Conv2D(1, (3, 3), activation='sigmoid', padding='same')(conv1)    return conv2(x_train, _), (x_test, _) = keras.datasets.mnist.load_data()x_train = np.expand_dims(x_train.astype('float32') / 255., -1)x_test  = np.expand_dims(x_test.astype('float32')  / 255., -1)print(x_train.shape)print(x_test.shape)input_img = keras.Input(shape = (28, 28, 1))autoencoder = keras.Model(input_img, build_mnist_model(input_img))autoencoder.compile(loss='mean_squared_error', optimizer = tf.train.AdamOptimizer(0.001))autoencoder.fit(x_train, x_train,                epochs=50,                steps_per_epoch=int(int(x_train.shape[0])/10),                shuffle=True,                verbose=1,                validation_data=(x_test, x_test)               )當我將模型定義為 keras.Sequential() 時,問題就消失了。
查看完整描述

3 回答

?
桃花長相依

TA貢獻1860條經驗 獲得超8個贊

要分批訓練,您應該使用 fit_generator 方法。為此,您需要先制作數據生成器。您需要通過 flow_from_directory 使用 ImageDataGenerator 跟隨(例如)。這樣 keras 將分批提供數據。您應該調整批量大小以確保 GPU 的內存足夠。通常批量大小約為 32-64。一般來說,批量越大越好。

Keras 文檔:https ://keras.io/preprocessing/image/

您可以在此處查看使用示例:https : //www.kaggle.com/vbookshelf/skin-lesion-analyzer-tensorflow-js-web-app


查看完整回答
反對 回復 2021-12-26
?
繁花如伊

TA貢獻2012條經驗 獲得超12個贊

對我來說同樣的問題。我只是檢查了一些例子,發現:


dummy_x = tf.zeros((1, 224, 224, 1))


model._set_inputs(dummy_x)

如果此代碼在 fit 之前,則不會發生 oom。


查看完整回答
反對 回復 2021-12-26
?
慕俠2389804

TA貢獻1719條經驗 獲得超6個贊

嗯,我想您忘記定義要在您的網絡中輸入的 batch_size 了!


嘗試類似的東西:


autoencoder.fit(x_train, x_train,

                epochs=50,

                batch_size = 32,

                steps_per_epoch=int(int(x_train.shape[0])/10),

                shuffle=True,

                verbose=1,

                validation_data=(x_test, x_test)

               )


查看完整回答
反對 回復 2021-12-26
  • 3 回答
  • 0 關注
  • 341 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號