Keras Flatten错误(Tensorflow没有属性包)

时间:2017-03-12 17:45:49

标签: python windows tensorflow keras

我正在尝试使用tensorflow(支持GPU)后端在我的系统上测试Keras库,我遇到了以下问题。我看到了一个问题here,但我没有看到解决方案。我在Windows 10机器上运行WinPython 3.5.2。以下是我在Keras Github中使用的示例代码:

'''Train a simple deep CNN on the CIFAR10 small images dataset.
GPU run command with Theano backend (with TensorFlow, the GPU is automatically used):
    THEANO_FLAGS=mode=FAST_RUN,device=gpu,floatX=float32 python cifar10_cnn.py

It gets down to 0.65 test logloss in 25 epochs, and down to 0.55 after 50 epochs.
(it's still underfitting at that point, though).
'''

from __future__ import print_function
from keras.datasets import cifar10
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, Flatten
from keras.layers import Convolution2D, MaxPooling2D
from keras.utils import np_utils

batch_size = 32
nb_classes = 10
nb_epoch = 200
data_augmentation = True

# input image dimensions
img_rows, img_cols = 32, 32
# The CIFAR10 images are RGB.
img_channels = 3

# The data, shuffled and split between train and test sets:
(X_train, y_train), (X_test, y_test) = cifar10.load_data()
print('X_train shape:', X_train.shape)
print(X_train.shape[0], 'train samples')
print(X_test.shape[0], 'test samples')

# Convert class vectors to binary class matrices.
Y_train = np_utils.to_categorical(y_train, nb_classes)
Y_test = np_utils.to_categorical(y_test, nb_classes)

model = Sequential()

model.add(Convolution2D(32, 3, 3, border_mode='same',
                        input_shape=X_train.shape[1:]))
model.add(Activation('relu'))
model.add(Convolution2D(32, 3, 3))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Convolution2D(64, 3, 3, border_mode='same'))
model.add(Activation('relu'))
model.add(Convolution2D(64, 3, 3))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Flatten())
model.add(Dense(512))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(nb_classes))
model.add(Activation('softmax'))

# Let's train the model using RMSprop
model.compile(loss='categorical_crossentropy',
              optimizer='rmsprop',
              metrics=['accuracy'])

X_train = X_train.astype('float32')
X_test = X_test.astype('float32')
X_train /= 255
X_test /= 255

if not data_augmentation:
    print('Not using data augmentation.')
    model.fit(X_train, Y_train,
              batch_size=batch_size,
              nb_epoch=nb_epoch,
              validation_data=(X_test, Y_test),
              shuffle=True)
else:
    print('Using real-time data augmentation.')
    # This will do preprocessing and realtime data augmentation:
    datagen = ImageDataGenerator(
        featurewise_center=False,  # set input mean to 0 over the dataset
        samplewise_center=False,  # set each sample mean to 0
        featurewise_std_normalization=False,  # divide inputs by std of the dataset
        samplewise_std_normalization=False,  # divide each input by its std
        zca_whitening=False,  # apply ZCA whitening
        rotation_range=0,  # randomly rotate images in the range (degrees, 0 to 180)
        width_shift_range=0.1,  # randomly shift images horizontally (fraction of total width)
        height_shift_range=0.1,  # randomly shift images vertically (fraction of total height)
        horizontal_flip=True,  # randomly flip images
        vertical_flip=False)  # randomly flip images

    # Compute quantities required for featurewise normalization
    # (std, mean, and principal components if ZCA whitening is applied).
    datagen.fit(X_train)

    # Fit the model on the batches generated by datagen.flow().
    model.fit_generator(datagen.flow(X_train, Y_train,
                                     batch_size=batch_size),
                        samples_per_epoch=X_train.shape[0],
                        nb_epoch=nb_epoch,
                        validation_data=(X_test, Y_test))

这是我得到的错误:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-4-ed3133a09db9> in <module>()
     53 model.add(Dropout(0.25))
     54 
---> 55 model.add(Flatten())
     56 model.add(Dense(512))
     57 model.add(Activation('relu'))

C:\WinPython3.5\python-3.5.2.amd64\lib\site-packages\keras\models.py in add(self, layer)
    310                 raise ValueError('All layers in a Sequential model '
    311                                  'should have a single output tensor. '
--> 312                                  'For multi-output layers, '
    313                                  'use the functional API.')
    314 

C:\WinPython3.5\python-3.5.2.amd64\lib\site-packages\keras\engine\topology.py in __call__(self, x, mask)
    512             - We call self.add_inbound_node().
    513             - If necessary, we `build` the layer to match
--> 514                 the _keras_shape of the input(s).
    515             - We update the _keras_shape of every input tensor with
    516                 its new shape (obtained via self.get_output_shape_for).

C:\WinPython3.5\python-3.5.2.amd64\lib\site-packages\keras\engine\topology.py in add_inbound_node(self, inbound_layers, node_indices, tensor_indices)
    570         if inbound_layers:
    571             # This will call layer.build() if necessary.
--> 572             self.add_inbound_node(inbound_layers, node_indices, tensor_indices)
    573             # Outputs were already computed when calling self.add_inbound_node.
    574             outputs = self.inbound_nodes[-1].output_tensors

C:\WinPython3.5\python-3.5.2.amd64\lib\site-packages\keras\engine\topology.py in create_node(cls, outbound_layer, inbound_layers, node_indices, tensor_indices)
    147             node_indices = [0 for _ in range(len(inbound_layers))]
    148         else:
--> 149             assert len(node_indices) == len(inbound_layers)
    150         if not tensor_indices:
    151             tensor_indices = [0 for _ in range(len(inbound_layers))]

C:\WinPython3.5\python-3.5.2.amd64\lib\site-packages\keras\layers\core.py in call(self, x, mask)
    407     ```python
    408         model = Sequential()
--> 409         model.add(Permute((2, 1), input_shape=(10, 64)))
    410         # now: model.output_shape == (None, 64, 10)
    411         # note: `None` is the batch dimension

C:\WinPython3.5\python-3.5.2.amd64\lib\site-packages\keras\backend\tensorflow_backend.py in batch_flatten(x)
    823                           x_shape[:-1] + y_shape[:-2] + y_shape[-1:])
    824     if is_sparse(x):
--> 825         out = tf.sparse_tensor_dense_matmul(x, y)
    826     else:
    827         out = tf.matmul(x, y)

AttributeError: module 'tensorflow' has no attribute 'pack'

3 个答案:

答案 0 :(得分:2)

对于记录 - 未来的读者,解决方案是将keras升级到最新版本。

答案 1 :(得分:1)

这应该适用于Keras 1.2.2

您可以使用

找到您的Keras版本
$ python -c "import keras;print(keras.__version__)"

您可以使用

升级您的Keras
$ pip install keras --upgrade

此问题的原因是Tensorflow后端用于1.0版。从旧版本开始,Tensorflow有一些重大的API更改,包括将pack重命名为stacksource)。

答案 2 :(得分:0)

通过将Keras升级到更新版本并重新启动所有内核,已解决此问题。