Matt
Matt

Reputation: 2329

Keras Flatten error (Tensorflow has no attribute pack)

I am trying to test Keras library on my system with tensorflow (GPU enabled) backend and I was running into the following problem. I have seen an issue raised here but I didn't see a resolution. I am running WinPython 3.5.2 on a Windows 10 machine. Here is the example code I am using from 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))

And here is the error I get:

---------------------------------------------------------------------------
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'

Upvotes: 2

Views: 3492

Answers (3)

Martin Thoma
Martin Thoma

Reputation: 136695

This should work in Keras 1.2.2

You can find your Keras version with

$ python -c "import keras;print(keras.__version__)"

You can upgrade your Keras with

$ pip install keras --upgrade

The reason for this issue is that the Tensorflow backend is used in version 1.0. From the older version, Tensorflow had some breaking API changes, including the renaming of pack to stack (source).

Upvotes: 1

Nassim Ben
Nassim Ben

Reputation: 11543

For the record - future readers, the solution was upgrading keras to the latest version.

Upvotes: 3

Matt
Matt

Reputation: 2329

This has been resolved with upgrading Keras to a newer version and restarting all the kernels.

Upvotes: 0

Related Questions