Reputation: 2329
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
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
Reputation: 11543
For the record - future readers, the solution was upgrading keras to the latest version.
Upvotes: 3
Reputation: 2329
This has been resolved with upgrading Keras to a newer version and restarting all the kernels.
Upvotes: 0