我使用 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
应该是什么样子?
更新这里是./keras/keras.json
:
{
"image_dim_ordering": "tf",
"epsilon": 1e-07,
"floatx": "float32",
"backend": "tensorflow"
}
input_shape=(1, img_rows, img_cols)
更改为 input_shape=(img_rows, img_cols, 1)
,它是否有效?
Exception: Error when checking model input: expected convolution2d_input_1 to have shape (None, 28, 28, 1) but got array with shape (60000, 1, 28, 28)
.keras/keras.json
文件中的内容是什么,尤其是“image_dim_ordering”的值
您的问题来自 keras.json
中的 image_ordering_dim
。
dim_ordering: {"th", "tf"} 之一。 “tf”模式意味着图像应该具有形状(样本、高度、宽度、通道),“th”模式意味着图像应该具有形状(样本、通道、高度、宽度)。它默认为在 ~/.keras/keras.json 的 Keras 配置文件中找到的 image_dim_ordering 值。如果您从未设置它,那么它将是“tf”。
Keras 将卷积操作映射到选择的后端(theano 或 tensorflow)。但是,两个后端对维度的排序做出了不同的选择。如果您的图像批次是 N 个具有 C 通道的 HxW 大小的图像,则 theano 使用 NCHW 排序,而 tensorflow 使用 NHWC 排序。
Keras 允许您选择您喜欢的排序,并将进行转换以映射到后面的后端。但是,如果您选择 image_ordering_dim="th"
,它需要 Theano 样式的排序(NCHW,您的代码中的那个),如果选择 image_ordering_dim="tf"
,它需要 tensorflow 样式的排序 (NHWC)。
由于您的 image_ordering_dim
设置为 "tf"
,如果您将数据重塑为 tensorflow 样式,它应该可以工作:
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)
FWIW,我反复收到此错误,其中一些值为 strides 或 kernel_size 但不是全部,后端和 image_ordering 已设置为 tensorflow,当我添加 padding="same"
时它们都消失了
padding="same"
padding="same"
并不能解决问题,它只是隐藏它。 same
填充之所以有效,是因为它添加了零填充,以便卷积或池内核在输入张量上实现整数步长。这与 valid
填充不同,并产生不同的结果。我也还没弄清楚如何让 valid
始终如一地工作。
只需添加以下内容:
from keras import backend as K
K.set_image_dim_ordering('th')
我也有同样的问题。但是,我正在使用的每个 Conv3D 层都在减小输入的大小。因此,在声明 Conv2D/3D 层期间包含一个参数 padding='same' 解决了该问题。这是演示代码
model.add(Conv3D(32,kernel_size=(3,3,3),activation='relu',padding='same'))
减小过滤器的尺寸也可以解决问题。
实际上,Conv3D 或 Conv2D 层减少了输入数据。但是,当您的下一层没有收到任何不适合该层的输入或大小的输入时,就会发生此错误。通过填充,我们使 Conv3Dor2D 的输出保持与输入相同的大小,以便下一层将获得所需的输入
我遇到了同样的问题,但通过更改 conv2d 函数解决了:
if K.image_data_format=='channels_first':
x_train = x_train.reshape(x_train.shape[0], 1,img_cols,img_rows)
x_test = x_test.reshape(x_test.shape[0], 1,img_cols,img_rows)
input_shape = (1,img_cols,img_rows)
else:
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)
model.add(Convolution2D(32,(3, 3), input_shape = input_shape, activation="relu"))
使用括号提供过滤器的大小,例如:
model.add(Convolution2D(nb_filters,( nb_conv, nb_conv) ,border_mode='valid',
input_shape=(1, img_rows, img_cols)))
它将在我的情况下工作,并且还将 X_train , X_test 更改为:
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)
另一个可以提供帮助的解决方案是改变:
from keras.layers import Convolution2D, MaxPooling2D
至
from keras.layers import Conv2D, MaxPooling2D
之后,为了运行预处理输入数据,我改变了:
X_train = X_train.reshape(X_train.shape[0], 1, 28, 28)
X_test = X_test.reshape(X_test.shape[0], 1, 28, 28)
至
X_train = X_train.reshape(X_train.shape[0], 28, 28, 1)
X_test.reshape(X_test.shape[0], 28, 28, 1)
最后,我改变:
model.add(Convolution2D(32, 3, 3, activation='relu',input_shape=(1,28,28)))
model.add(Convolution2D(32, 3, 3,activation='relu'))
至
model.add(Conv2D(32, (3, 3), activation='relu',input_shape=(28,28,1)))
model.add(Conv2D(32, (3, 3), activation='relu'))
刚遇到这个问题。下面是使用新 API 的解决方案。
K.set_image_dim_ordering('tf') --> K.set_image_data_format('channels_last')
K.set_image_dim_ordering('th') --> K.set_image_data_format('channels_first')
K.image_dim_ordering() == 'tf' --> K.image_data_format() == 'channels_last'
K.image_dim_ordering() == 'th' --> K.image_data_format() == 'channels_first'
查看更多here
%store -r le
%store -r x_train
%store -r x_test
%store -r y_train
%store -r y_test
%store -r yy
import numpy as np
import keras
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, Flatten
from keras.layers import Conv2D, MaxPooling2D, GlobalAveragePooling2D
from keras.optimizers import Adam
from keras.utils import np_utils
from sklearn import metrics
num_rows = 40
num_columns = 174
num_channels = 1
x_train = x_train.reshape(x_train.shape[0],num_rows , num_columns, num_channels)
x_test = x_test.reshape(x_test.shape[0], num_rows, num_columns,num_channels )
num_labels = yy.shape[1]
filter_size = 2
# Construct model
model = Sequential()
model.add(Conv2D(filters=16, kernel_size=2, activation='relu',input_shape=(
40,174,1)))
model.add(MaxPooling2D(pool_size=2))
model.add(Dropout(0.2))
model.add(Conv2D(filters=32, kernel_size=2, activation='relu'))
model.add(MaxPooling2D(pool_size=2))
model.add(Dropout(0.2))
model.add(Conv2D(filters=64, kernel_size=2, activation='relu'))
model.add(MaxPooling2D(pool_size=2))
model.add(Dropout(0.2))
model.add(Conv2D(filters=128, kernel_size=2, activation='relu'))
model.add(MaxPooling2D(pool_size=2))
model.add(Dropout(0.2))
model.add(GlobalAveragePooling2D())
model.add(Dense(num_labels, activation='softmax'))
不定期副业成功案例分享
if K.image_data_format() == 'channels_first':
(与from keras import backend as K
)在运行时检查使用哪种格式(NHWC 与 NCHW)。if K.image_data_format() == 'channels_first': input_shape = (3, img_width, img_height) else: input_shape = (img_width, img_height, 3)
并且仍然得到错误。到目前为止,添加padding="same"
有助于我的脚本运行,但它似乎只是掩盖而不是解决问题......我不清楚实际问题是什么......