当前位置: 首页 > 面试题库 >

为“ Conv2D”从1中减去3导致的负尺寸大小

冉俊德
2023-03-14
问题内容

我使用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版本问题的答案,所以我升级Tensorflow0.12.0,但仍然存在,是网络问题还是我遗漏了一些东西,应该是什么input_shape样子?

更新 这里是./keras/keras.json

{
    "image_dim_ordering": "tf", 
    "epsilon": 1e-07, 
    "floatx": "float32", 
    "backend": "tensorflow"
}

问题答案:

你的问题来自于image_ordering_dimkeras.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将设置为"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)


 类似资料:
  • 当在Keras中声明输入层时,我得到了这个错误消息。 代码:

  • 我最初使用的是setSize,但由于java边框和标题空间的原因,这导致屏幕上的内容比屏幕稍大。所以我使用了setpreferredSize,现在屏幕尺寸有点太大了。在我的内容的右侧和底部留出空间。 在我的框架中: 在我的董事会(JPanel)

  • 我试图在Windows10机器上用Python 3.5.2 | Anaconda4.2.0(64位)实现图像序列预测。我有keras和tensorflow的最新版本。 每个图像都是160x128。我的培训集是1008个图像,大小为1008x160x128x1。我想做一个简单的网络,有一个卷积层和一个LSTM层,现在,每个图像被卷积以提取特征,然后输入LSTM以了解时间依赖性。输出应为k(在k=1以

  • 问题内容: 我对(N,)维数组和(N,1)维数组之间的转换有疑问。例如,y是(2,)维。 但是下面将显示y2为(2,1)维。 在不复制的情况下将y2转换回y的最有效方法是什么? 谢谢汤姆 问题答案: 为此工作 还请注意,除非需要复制新形状(在这里不需要这样做),否则它不会复制数据:

  • 问题内容: 我试图用本地图像替换训练和验证数据。但是在运行训练代码时,出现了以下错误: ValueError:无法挤压dim [1],预期尺寸为1,输入形状为[100,3]的’sparse_softmax_cross_entropy_loss / remove_squeezable_dimensions / Squeeze’(op:’Squeeze’)得到3。 我不知道该如何解决。模型定义代码中没

  • 有人知道JavaFX中画布的最大尺寸吗?从一些测试中,它接缝为8192(与IE相同),在我看来,这很奇怪。也许,可以修改吗?