我使用Keras与Tensorflow作为后端,这里是我的代码:
import numpy as np np.random.seed(1373) import tensorflow as tf tf.python.control_flow_ops = tf import os from keras.datasets import mnist from keras.models import Sequential from keras.layers.core import Dense, Dropout, Activation, Flatten from keras.layers.convolutional import Convolution2D, MaxPooling2D from keras.utils import np_utils batch_size = 128 nb_classes = 10 nb_epoch = 12 img_rows, img_cols = 28, 28 nb_filters = 32 nb_pool = 2 nb_conv = 3 (X_train, y_train), (X_test, y_test) = mnist.load_data() print(X_train.shape[0]) X_train = X_train.reshape(X_train.shape[0], 1, img_rows, img_cols) X_test = X_test.reshape(X_test.shape[0], 1, img_rows, img_cols) X_train = X_train.astype('float32') X_test = X_test.astype('float32') X_train /= 255 X_test /= 255 print('X_train shape:', X_train.shape) print(X_train.shape[0], 'train samples') print(X_test.shape[0], 'test samples') 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(nb_filters, nb_conv, nb_conv, border_mode='valid', input_shape=(1, img_rows, img_cols))) model.add(Activation('relu')) model.add(Convolution2D(nb_filters, nb_conv, nb_conv)) model.add(Activation('relu')) model.add(MaxPooling2D(pool_size=(nb_pool, nb_pool))) model.add(Dropout(0.25)) model.add(Flatten()) model.add(Dense(128)) model.add(Activation('relu')) model.add(Dropout(0.5)) model.add(Dense(nb_classes)) model.add(Activation('softmax')) model.compile(loss='categorical_crossentropy', optimizer='adadelta', metrics=["accuracy"]) model.fit(X_train, Y_train, batch_size=batch_size, nb_epoch=nb_epoch, verbose=1, validation_data=(X_test, Y_test)) score = model.evaluate(X_test, Y_test, verbose=0) print('Test score:', score[0]) print('Test accuracy:', score[1])
和引用错误:
Using TensorFlow backend. 60000 ('X_train shape:', (60000, 1, 28, 28)) (60000, 'train samples') (10000, 'test samples') Traceback (most recent call last): File "mnist.py", line 154, in <module> input_shape=(1, img_rows, img_cols))) File "/usr/local/lib/python2.7/dist-packages/keras/models.py", line 276, in add layer.create_input_layer(batch_input_shape, input_dtype) File "/usr/local/lib/python2.7/dist-packages/keras/engine/topology.py", line 370, in create_input_layer self(x) File "/usr/local/lib/python2.7/dist-packages/keras/engine/topology.py", line 514, in __call__ self.add_inbound_node(inbound_layers, node_indices, tensor_indices) File "/usr/local/lib/python2.7/dist-packages/keras/engine/topology.py", line 572, in add_inbound_node Node.create_node(self, inbound_layers, node_indices, tensor_indices) File "/usr/local/lib/python2.7/dist-packages/keras/engine/topology.py", line 149, in create_node output_tensors = to_list(outbound_layer.call(input_tensors[0], mask=input_masks[0])) File "/usr/local/lib/python2.7/dist-packages/keras/layers/convolutional.py", line 466, in call filter_shape=self.W_shape) File "/usr/local/lib/python2.7/dist-packages/keras/backend/tensorflow_backend.py", line 1579, in conv2d x = tf.nn.conv2d(x, kernel, strides, padding=padding) File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/gen_nn_ops.py", line 396, in conv2d data_format=data_format, name=name) File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/op_def_library.py", line 759, in apply_op op_def=op_def) File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 2242, in create_op set_shapes_for_outputs(ret) File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 1617, in set_shapes_for_outputs shapes = shape_func(op) File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.py", line 1568, in call_with_requiring return call_cpp_shape_fn(op, require_shape_fn=True) File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/common_shapes.py", line 610, in call_cpp_shape_fn debug_python_shape_fn, require_shape_fn) File "/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/common_shapes.py", line 675, in _call_cpp_shape_fn_impl raise ValueError(err.message) ValueError: Negative dimension size caused by subtracting 3 from 1 for 'Conv2D' (op: 'Conv2D') with input shapes: [?,1,28,28], [3,3,28,32].
首先,我看到一些有关Tensorflow版本问题的答案,所以我升级Tensorflow到0.12.0,但仍然存在,是网络问题还是我遗漏了一些东西,应该是什么input_shape样子?
Tensorflow
0.12.0
input_shape
更新 这里是./keras/keras.json:
./keras/keras.json
{ "image_dim_ordering": "tf", "epsilon": 1e-07, "floatx": "float32", "backend": "tensorflow" }
你的问题来自于image_ordering_dim在keras.json。
image_ordering_dim
keras.json
来自Keras Image Processing doc:
dim_ordering:{“ th”,“ tf”}中的一个。“ tf”模式表示图像应具有形状(样本,高度,宽度,通道),“ th”模式表示图像应具有形状(样本,通道,高度,宽度)。它默认为在〜/ .keras / keras.json中的Keras配置文件中找到的image_dim_ordering值。如果您从未设置,则它将为“ tf”。
Keras将卷积操作映射到选定的后端(theano或tensorflow)。但是,两个后端对于尺寸的排序都做出了不同的选择。如果您的图像批次是具有C通道的HxW大小的N张图像,则theano使用NCHW排序,而张量流使用NHWC排序。
Keras允许您选择自己喜欢的顺序,并将进行转换以映射到后面的后端。但是,如果您选择image_ordering_dim="th"它,则期望使用Theano样式排序(NCHW,您的代码中包含的那一种),如果image_ordering_dim="tf"它期望张量流样式排序(NHWC)。
image_ordering_dim="th"
image_ordering_dim="tf"
由于您image_ordering_dim将设置为"tf",如果将数据重塑为张量流样式,则它应该可以工作:
"tf"
X_train = X_train.reshape(X_train.shape[0], img_cols, img_rows, 1) X_test = X_test.reshape(X_test.shape[0], img_cols, img_rows, 1)
和
input_shape=(img_cols, img_rows, 1)