【问题标题】:Tensorflow keras with tf dataset input带有 tf 数据集输入的 TensorFlow keras
【发布时间】:2018-10-10 09:05:49
【问题描述】:

我是 tensorflow keras 和数据集的新手。谁能帮我理解为什么下面的代码不起作用?

import tensorflow as tf
import tensorflow.keras as keras
import numpy as np
from tensorflow.python.data.ops import dataset_ops
from tensorflow.python.data.ops import iterator_ops
from tensorflow.python.keras.utils import multi_gpu_model
from tensorflow.python.keras import backend as K


data = np.random.random((1000,32))
labels = np.random.random((1000,10))
dataset = tf.data.Dataset.from_tensor_slices((data,labels))
print( dataset)
print( dataset.output_types)
print( dataset.output_shapes)
dataset.batch(10)
dataset.repeat(100)

inputs = keras.Input(shape=(32,))  # Returns a placeholder tensor

# A layer instance is callable on a tensor, and returns a tensor.
x = keras.layers.Dense(64, activation='relu')(inputs)
x = keras.layers.Dense(64, activation='relu')(x)
predictions = keras.layers.Dense(10, activation='softmax')(x)

# Instantiate the model given inputs and outputs.
model = keras.Model(inputs=inputs, outputs=predictions)

# The compile step specifies the training configuration.
model.compile(optimizer=tf.train.RMSPropOptimizer(0.001),
          loss='categorical_crossentropy',
          metrics=['accuracy'])

# Trains for 5 epochs
model.fit(dataset, epochs=5, steps_per_epoch=100)

失败并出现以下错误:

model.fit(x=dataset, y=None, epochs=5, steps_per_epoch=100)
File "/home/wuxinyu/pyEnv/lib/python3.5/site-packages/tensorflow/python/keras/engine/training.py", line 1510, in fit
validation_split=validation_split)
File "/home/wuxinyu/pyEnv/lib/python3.5/site-packages/tensorflow/python/keras/engine/training.py", line 994, in _standardize_user_data
class_weight, batch_size)
File "/home/wuxinyu/pyEnv/lib/python3.5/site-packages/tensorflow/python/keras/engine/training.py", line 1113, in _standardize_weights
exception_prefix='input')
File "/home/wuxinyu/pyEnv/lib/python3.5/site-packages/tensorflow/python/keras/engine/training_utils.py", line 325, in standardize_input_data
'with shape ' + str(data_shape))
ValueError: Error when checking input: expected input_1 to have 2 dimensions, but got array with shape (32,)

根据 tf.keras 指南,我应该可以直接将数据集传递给 model.fit,如下例所示:

输入 tf.data 数据集

使用 Datasets API 扩展到大型数据集或多设备训练。将 tf.data.Dataset 实例传递给 fit 方法:

# Instantiates a toy dataset instance:
dataset = tf.data.Dataset.from_tensor_slices((data, labels))
dataset = dataset.batch(32)
dataset = dataset.repeat()

在数据集上调用 fit 时不要忘记指定 steps_per_epoch

model.fit(数据集,epochs=10,steps_per_epoch=30) 在这里,fit 方法使用 steps_per_epoch 参数——这是模型在移动到下一个 epoch 之前运行的训练步数。由于 Dataset 产生批量数据,因此这个 sn-p 不需要 batch_size。

数据集也可用于验证:

dataset = tf.data.Dataset.from_tensor_slices((data, labels))
dataset = 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(dataset, epochs=10, steps_per_epoch=30,
      validation_data=val_dataset,
      validation_steps=3)

我的代码有什么问题,正确的做法是什么?

【问题讨论】:

  • 为什么这些答案都没有被接受?

标签: python tensorflow keras tensorflow-datasets


【解决方案1】:

关于你为什么会收到错误的原始问题:

Error when checking input: expected input_1 to have 2 dimensions, but got array with shape (32,)

您的代码中断的原因是您没有将.batch() 应用回dataset 变量,如下所示:

dataset = dataset.batch(10)

你只是打电话给dataset.batch()

这会中断,因为没有batch(),输出张量不会被批处理,即你得到形状(32,)而不是(1,32)

【讨论】:

    【解决方案2】:

    您缺少定义迭代器,这就是出现错误的原因。

    data = np.random.random((1000,32))
    labels = np.random.random((1000,10))
    dataset = tf.data.Dataset.from_tensor_slices((data,labels))
    dataset = dataset.batch(10).repeat()
    inputs = Input(shape=(32,))  # Returns a placeholder tensor
    
    # A layer instance is callable on a tensor, and returns a tensor.
    x = Dense(64, activation='relu')(inputs)
    x = Dense(64, activation='relu')(x)
    predictions = Dense(10, activation='softmax')(x)
    
    # Instantiate the model given inputs and outputs.
    model = keras.Model(inputs=inputs, outputs=predictions)
    
    # The compile step specifies the training configuration.
    model.compile(optimizer=tf.train.RMSPropOptimizer(0.001),
              loss='categorical_crossentropy',
              metrics=['accuracy'])
    
    # Trains for 5 epochs
    model.fit(dataset.make_one_shot_iterator(), epochs=5, steps_per_epoch=100)
    

    纪元 1/5 100/100 [==============================] - 1s 8ms/step - 损失:11.5787 - acc: 0.1010

    纪元 2/5 100/100 [==============================] - 0s 4ms/步 - 损失:11.4846 - acc: 0.0990

    纪元 3/5 100/100 [===============================] - 0s 4ms/步 - 损失:11.4690 - acc: 0.1270

    4/5 纪元 100/100 [==============================] - 0s 4ms/步 - 损失:11.4611 - acc: 0.1300

    5/5 纪元 100/100 [==============================] - 0s 4ms/步 - 损失:11.4546 - acc: 0.1360

    这是我系统上的结果。

    【讨论】:

    • 实际上不需要迭代器,tf.Datasetmodel.fit() 中应该可以正常工作。
    • 我想知道当 make_one_shot_iterator() 只支持通过数据集迭代一次时,Keras 是如何做到 5 个 epoch 的?
    • 似乎完全错过了这个!我猜 tf 的版本然后需要迭代器,现在支持没有了。 OP 似乎已经有了带有值的批处理功能。 Keras 能够执行 5 个 epoch,因为我们将 repeat 函数添加到我们的操作中。
    猜你喜欢
    • 2019-06-03
    • 1970-01-01
    • 2018-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-07
    • 1970-01-01
    • 2017-11-19
    相关资源
    最近更新 更多