我正在尝试使用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'
答案 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
重命名为stack
(source)。
答案 2 :(得分:0)
通过将Keras升级到更新版本并重新启动所有内核,已解决此问题。