【问题标题】:from_tensor_slices() with big numpy array while using tf.keras使用 tf.keras 时带有大 numpy 数组的 from_tensor_slices()
【发布时间】:2019-03-12 13:41:07
【问题描述】:

我在一个 numpy 数组中有一些训练数据 - 它适合内存,但大于 2GB。我正在使用 tf.keras 和数据集 API。给你一个简化的、独立的例子:

import numpy as np
import tensorflow as tf
from tensorflow.keras import layers

model = tf.keras.Sequential([
    layers.Dense(64, activation='relu', input_shape=(32,)),
    layers.Dense(64, activation='relu'),
    layers.Dense(1)
])

model.compile(optimizer=tf.train.AdamOptimizer(0.001),
          loss='mse',
          metrics=['mae'])

# generate some big input datasets, bigger than 2GB
data = np.random.random((1024*1024*8, 32))
labels = np.random.random((1024*1024*8, 1))
val_data = np.random.random((100, 32))
val_labels = np.random.random((100, 1))

train_dataset = tf.data.Dataset.from_tensor_slices((data, labels))
train_dataset = train_dataset.batch(32).repeat()

val_dataset = tf.data.Dataset.from_tensor_slices((val_data, val_labels))
val_dataset = val_dataset.batch(32).repeat()

model.fit(train_dataset, epochs=10, steps_per_epoch=30,
      validation_data=val_dataset, validation_steps=3)

因此,执行此操作会导致错误“无法创建内容大于 2GB 的张量原型”。文档列出了此问题的解决方案:https://www.tensorflow.org/guide/datasets#consuming_numpy_arrays - 只需在会话运行中使用 tf.placeholders 和 feed_dict。

现在的主要问题是:如何使用 tf.keras 做到这一点?当我调用 model.fit() 时,我无法为占位符提供任何东西,事实上,当我介绍占位符时,我收到错误消息“你必须为占位符张量提供一个值”。

【问题讨论】:

    标签: tensorflow keras tensorflow-datasets tf.keras


    【解决方案1】:

    与 Estimator API 一样,您可以使用 from_generator

    data_chunks = list(np.split(data, 1024))
    labels_chunks = list(np.split(labels, 1024))
    
    def genenerator():
        for i, j in zip(data_chunks, labels_chunks):
            yield i, j
    
    train_dataset = tf.data.Dataset.from_generator(genenerator, (tf.float32, tf.float32))
    train_dataset = train_dataset.shuffle().batch().repeat()
    

    也看看https://github.com/tensorflow/tensorflow/issues/24520

    【讨论】:

      猜你喜欢
      • 2019-08-23
      • 2019-02-18
      • 1970-01-01
      • 2013-10-01
      • 2012-03-18
      • 2020-01-12
      • 1970-01-01
      • 1970-01-01
      • 2017-07-23
      相关资源
      最近更新 更多