首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >与tf.dataset一起使用的Keras tf.dataset()在使用tf.train时失败

与tf.dataset一起使用的Keras tf.dataset()在使用tf.train时失败
EN

Stack Overflow用户
提问于 2019-01-05 19:55:30
回答 1查看 1.4K关注 0票数 2

摘要:根据文档,Keras model.fit()应该接受tf.dataset作为输入(我使用TF版本1.12.0)。我可以训练我的模型,如果我手动做培训步骤,但使用model.fit()在同一模型,我得到一个错误,我无法解决。

下面是我所做的事情的草图:我的数据集太大,无法容纳在内存中,它由许多文件组成,每个文件都有不同数量的行(100个特性,标签)。我想使用tf.data构建我的数据管道:

代码语言:javascript
复制
def data_loader(filename):
    '''load a single data file with many rows'''
    features, labels = load_hdf5(filename)
    ...
    return features, labels

def make_dataset(filenames, batch_size):
    '''read files one by one, pick individual rows, batch them and repeat'''
    dataset = tf.data.Dataset.from_tensor_slices(filenames)
    dataset = dataset.map(      # Problem here! See edit for solution
        lambda filename: tuple(tf.py_func(data_loader, [filename], [float32, tf.float32])))
    dataset = dataset.flat_map(
        lambda features, labels: tf.data.Dataset.from_tensor_slices((features, labels)))
    dataset = dataset.batch(batch_size)
    dataset = dataset.repeat()
    dataset = dataset.prefetch(1000)
    return dataset

_BATCH_SIZE = 128
training_set = make_dataset(training_files, batch_size=_BATCH_SIZE)

我想尝试一个非常基本的logistic回归模型:

代码语言:javascript
复制
inputs = tf.keras.layers.Input(shape=(100,))
outputs = tf.keras.layers.Dense(1, activation='softmax')(inputs)
model = tf.keras.Model(inputs, outputs)

如果我手动训练,一切都很好,例如:

代码语言:javascript
复制
labels = tf.placeholder(tf.float32)
loss = tf.reduce_mean(tf.keras.backend.categorical_crossentropy(labels, outputs))
train_step = tf.train.GradientDescentOptimizer(.05).minimize(loss)

iterator = training_set.make_one_shot_iterator()
next_element = iterator.get_next()
init_op = tf.global_variables_initializer()

with tf.Session() as sess:
    sess.run(init_op)
    for i in range(training_size // _BATCH_SIZE):
        x, y = sess.run(next_element)
        train_step.run(feed_dict={inputs: x, labels: y})

但是,如果我尝试像这样使用model.fit

代码语言:javascript
复制
model.compile('adam', 'categorical_crossentropy', metrics=['acc'])
model.fit(training_set.make_one_shot_iterator(),
          steps_per_epoch=training_size // _BATCH_SIZE,
          epochs=1,
          verbose=1)

我在keras‘’es ValueError: Cannot take the length of Shape with unknown rank.函数中得到一个错误消息_standardize_user_data

我尝试了不少事情,但未能解决这个问题。有什么想法吗?

编辑:基于@kvish的答案的,解决方案是将映射从lambda更改为指定正确的张量维度的函数,例如:

代码语言:javascript
复制
def data_loader(filename):
    def loader_impl(filename):
        features, labels, _ = load_hdf5(filename)
        ...
        return features, labels

    features, labels = tf.py_func(loader_impl, [filename], [tf.float32, tf.float32])
    features.set_shape((None, 100))
    labels.set_shape((None, 1))
    return features, labels

现在,需要做的就是从map调用这个函数

代码语言:javascript
复制
dataset = dataset.map(data_loader)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-06 14:50:26

可能tf.py_func产生的形状未知,Keras无法推断。我们可以使用set_shape(your_shape)方法来设置它返回的张量的形状,这将有助于Keras推断结果的形状。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54055707

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档