这是将Keras与tensorflow数据集结合使用时的错误吗?

时间:2018-12-13 15:54:33

标签: python-3.x tensorflow keras

或者该教程的某个地方可能有错字。也许只是我的版本中存在一个错误(请参阅注释;无法通过pip在线升级)。也许我做错了什么。 我想知道该怎么做。

This tensorflow keras tutorial with datasets是以片段形式呈现的,但是我已将其尽可能最佳地组装起来,如下所示(请注意,我必须进行一些更改,例如“ import keras layers”语句和在第一层添加一个input_shape,因为没有它的代码就会炸毁):

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

print(tf.VERSION)
print(tf.keras.__version__)

data = np.random.random((1000, 32))
labels = np.random.random((1000, 10))

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

model = tf.keras.Sequential([
        # Adds a densely-connected layer with 64 units to the model:
        layers.Dense(64, activation='relu', input_shape=(32,)),

        # Add another:
        layers.Dense(64, activation='relu'),

        # Add a softmax layer with 10 output units:
        layers.Dense(10, activation='softmax')])

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

# Don't forget to specify `steps_per_epoch` when calling `fit` on a dataset.
model.fit(dataset, epochs=10, steps_per_epoch=30)

完整输出:

1.6.0
2.1.3-tf
Traceback (most recent call last):

  File "<ipython-input-9-47ae8a0a1bac>", line 1, in <module>
    runfile('C:/Users/1134400/Documents/Python/python3/test.py', wdir='C:/Users/1134400/Documents/Python/python3')

  File "C:\Users\1134400\AppData\Local\Continuum\anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py", line 705, in runfile
    execfile(filename, namespace)

  File "C:\Users\1134400\AppData\Local\Continuum\anaconda3\lib\site-packages\spyder\utils\site\sitecustomize.py", line 102, in execfile
    exec(compile(f.read(), filename, 'exec'), namespace)

  File "C:/Users/1134400/Documents/Python/python3/test.py", line 31, in <module>
    model.fit(dataset, epochs=10, steps_per_epoch=30)

  File "C:\Users\1134400\AppData\Local\Continuum\anaconda3\lib\site-packages\tensorflow\python\keras\_impl\keras\models.py", line 920, in fit
    validation_steps=validation_steps)

  File "C:\Users\1134400\AppData\Local\Continuum\anaconda3\lib\site-packages\tensorflow\python\keras\_impl\keras\engine\training.py", line 1681, in fit
    batch_size=batch_size)

  File "C:\Users\1134400\AppData\Local\Continuum\anaconda3\lib\site-packages\tensorflow\python\keras\_impl\keras\engine\training.py", line 1508, in _standardize_user_data
    exception_prefix='input')

  File "C:\Users\1134400\AppData\Local\Continuum\anaconda3\lib\site-packages\tensorflow\python\keras\_impl\keras\engine\training.py", line 105, in _standardize_input_data
    np.expand_dims(x, 1) if x is not None and x.ndim == 1 else x for x in data

  File "C:\Users\1134400\AppData\Local\Continuum\anaconda3\lib\site-packages\tensorflow\python\keras\_impl\keras\engine\training.py", line 105, in <listcomp>
    np.expand_dims(x, 1) if x is not None and x.ndim == 1 else x for x in data

AttributeError: 'RepeatDataset' object has no attribute 'ndim'

为什么这行不通?我的tensorflow / keras版本中是否存在错误?我的大部分为复制粘贴的代码中是否存在错误?

注释:

  1. 版本:

    • 教程:页面上显示tf.VERSION是1.12.0,而tf.keras.__version__是2.1.6-tf。
    • 矿井:输出显示tf.VERSION为1.6.0,而tf.keras.__version__为2.1.3-tf。
    • 我的版本落后了。
  2. These notes for Keras 2.2.0这样说:

      

    对于Keras 2.2.0和TensorFlow 1.8或更高版本,您可以使用符号TensorFlow张量进行拟合,评估和预测

    该教程的版本早于此版本,因此显然支持tensorflow数据集。

  3. These notes for Keras 2.07这样说:

      

    更好地支持TensorFlow中数据张量的训练模型(例如数据集,TFRecords)。

    该教程的版本比我的要新,因此应该已经存在数据集支持。

  4. 在Windows上为CPU使用Tensorflow。不是GPU。

  5. 我连接到互联网的网络上有一个限制性防火墙,该防火墙(1)我不受控制,(2)不允许pip通过,因此简单地“使用{{1 }}升级”的方法不在桌面上。获取用于脱机安装的新版本需要花费一些精力,如果我犯了错误,我也不会受制于此

  6. 删除此行:pip。异常更改为dataset = dataset.repeat()。就像它无法使用数据集。

  7. 我不知道AttributeError: 'BatchDataset' object has no attribute 'ndim'在做什么。在我的版本中,model.fit(dataset, ...)的前两个位置参数是model.fit(...)x。数据集是用元组构造的,因此是否要将数据集作为单个位置参数传递,应该从中隐式解压缩要素和标签?

1 个答案:

答案 0 :(得分:2)

我遇到了同样的问题,我将tensorflow更新为2.1.0,并没有直接导入keras,而是直接导入了import tensorflow.keras。现在可以使用Dataset来执行相同的破坏代码