python - instalar tensorflow en anaconda
Keras Maxpooling2d capa da ValueError (6)
Estoy tratando de replicar el modelo VGG16 en keras, el siguiente es mi código:
model = Sequential()
model.add(ZeroPadding2D((1,1),input_shape=(3,224,224)))
model.add(Convolution2D(64, 3, 3, activation=''relu''))
model.add(ZeroPadding2D((1,1)))
model.add(Convolution2D(64, 3, 3, activation=''relu''))
model.add(MaxPooling2D((2,2), strides=(2,2)))
model.add(ZeroPadding2D((1,1)))
model.add(Convolution2D(128, 3, 3, activation=''relu''))
model.add(ZeroPadding2D((1,1)))
model.add(Convolution2D(128, 3, 3, activation=''relu''))
model.add(MaxPooling2D((2,2), strides=(2,2))) ###This line gives error
model.add(ZeroPadding2D((1,1)))
model.add(Convolution2D(256, 3, 3, activation=''relu''))
model.add(ZeroPadding2D((1,1)))
model.add(Convolution2D(256, 3, 3, activation=''relu''))
model.add(ZeroPadding2D((1,1)))
model.add(Convolution2D(256, 3, 3, activation=''relu''))
model.add(MaxPooling2D((2,2), strides=(2,2)))
model.add(ZeroPadding2D((1,1)))
model.add(Convolution2D(512, 3, 3, activation=''relu''))
model.add(ZeroPadding2D((1,1)))
model.add(Convolution2D(512, 3, 3, activation=''relu''))
model.add(ZeroPadding2D((1,1)))
model.add(Convolution2D(512, 3, 3, activation=''relu''))
model.add(MaxPooling2D((2,2), strides=(2,2)))
model.add(ZeroPadding2D((1,1)))
model.add(Convolution2D(512, 3, 3, activation=''relu''))
model.add(ZeroPadding2D((1,1)))
model.add(Convolution2D(512, 3, 3, activation=''relu''))
model.add(ZeroPadding2D((1,1)))
model.add(Convolution2D(512, 3, 3, activation=''relu''))
model.add(MaxPooling2D((2,2), strides=(2,2)))
model.add(Flatten())
model.add(Dense(4096, activation=''relu''))
model.add(Dropout(0.5))
model.add(Dense(4096, activation=''relu''))
model.add(Dropout(0.5))
model.add(Dense(1000, activation=''softmax''))
La capa maxpooling2d da un error en la línea que se comenta
El error dice:
ValueError: Negative dimension size caused by subtracting 2 from 1 for ''MaxPool_7'' (op: ''MaxPool'') with input shapes: [?,1,112,128].
¿Cuál podría ser la razón detrás de esto? ¿Cómo resolver esto?
Edición: Un registro de errores más detallado:
ValueError Traceback (última llamada más reciente) en () 12 model.add (Convolution2D (128, 3, 3, activación = ''relu'')) 13 ---> 14 model.add (MaxPooling2D ((2,2), zancadas = (2,2))) 15 16 model.add (ZeroPadding2D ((1,1)))
/usr/local/lib/python2.7/dist-packages/keras/models.pyc en add (self, layer) 306 output_shapes = [self.outputs [0] ._ keras_shape]) 307 else: -> 308 output_tensor = layer (self.outputs [0]) 309 si el tipo (output_tensor) está en la lista: 310 raise Exception (''Todas las capas en un modelo secuencial''
/usr/local/lib/python2.7/dist-packages/keras/engine/topology.pyc in call (self, x, mask) 512 si inbound_layers: 513 # esto llamará layer.build () si es necesario -> 514 self.add_inbound_node (inbound_layers, node_indices, tensor_indices) 515 input_added = True 516
/usr/local/lib/python2.7/dist-packages/keras/engine/topology.pyc en add_inbound_node (self, inbound_layers, node_indices, tensor_indices) 570 # creando el nodo automáticamente se actualiza self.inbound_nodes 571 # así como outbound_nodes en capas entrantes. -> 572 Node.create_node (self, inbound_layers, node_indices, tensor_indices) 573 574 def get_output_shape_for (self, input_shape):
/usr/local/lib/python2.7/dist-packages/keras/engine/topology.pyc en create_node (cls, outbound_layer, inbound_layers, node_indices, tensor_indices) 147 148 if len (input_tensors) == 1: -> 149 output_tensors = to_list (outbound_layer.call (input_tensors [0], mask = input_masks [0])) 150 output_masks = to_list (outbound_layer.compute_mask (input_tensors [0], input_masks [0])) 151 # TODO: intentar auto-inferir dar forma si la excepción es generada por get_output_shape_for
/usr/local/lib/python2.7/dist-packages/keras/layers/pooling.pyc in call (self, x, mask) 160 strides = self.strides, 161 border_mode = self.border_mode, -> 162 dim_ordering = self.dim_ordering) 163 retorno de salida 164
/usr/local/lib/python2.7/dist-packages/keras/layers/pooling.pyc en _pooling_function (auto, input, pool_size, strides, border_mode, dim_ordering) 210 border_mode, dim_ordering): 211 output = K.pool2d ( entradas, pool_size, strides, -> 212 border_mode, dim_ordering, pool_mode = ''max'') 213 devuelve salida 214
/usr/local/lib/python2.7/dist-packages/keras/backend/tensorflow_backend.pyc en pool2d (x, pool_size, strides, border_mode, dim_ordering, pool_mode) 1699 1700 if pool_mode == ''max'': -> 1701 x = tf.nn.max_pool (x, pool_size, strides, padding = padding) 1702 elif pool_mode == ''avg'': 1703
x = tf.nn.avg_pool (x, pool_size, strides, padding = padding)/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/nn_ops.pyc en max_pool (valor, ksize, strides, padding, data_format, name) 1391 padding = padding, 1392
data_format = data_format, -> 1393 name = name) 1394 1395/usr/local/lib/python2.7/dist-packages/tensorflow/python/ops/gen_nn_ops.pyc en _max_pool (entrada, ksize, strides, padding, data_format, name)
1593 result = _op_def_lib.apply_op ("MaxPool", input = input, ksize = ksize = 15s strides = strides, padding = padding, -> 1595 data_format = data_format, name = name) 1596 resultado de retorno 1597/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/op_def_library.pyc in apply_op (self, op_type_name, name, ** keywords) 747 op = g.create_op (op_type_name, entradas, output_types, name = scope, 748 input_types = input_types, attrs = attr_protos, -> 749 op_def = op_def) 750 resultados = op.outputs 751 return _Restructure (ops.convert_n_to_tensor (resultados),
/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.pyc en create_op (self, op_type, input, dtypes, input_types, name, attrs, op_def, compute_shapes, compute_device) 2388
original_op = self._default_original_op, op_def = op_def) 2389 si compute_shapes: -> 2390 set_shapes_for_outputs (ret) 2391 self._add_op (ret) 2392
self._record_op_seen_by_control_dependencies (ret)/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/ops.pyc en set_shapes_for_outputs (op) 1783 raise RuntimeError ("No hay función de forma registrada para la operación estándar:% s" 1784
% op.type) -> 1785 formas = shape_func (op) 1786 si las formas son Ninguna: 1787 aumenta RuntimeError (/usr/local/lib/python2.7/dist-packages/tensorflow/python/framework/common_shapes.pyc en call_cpp_shape_fn (op, input_tensors_trol.planto de las personas). (mensaje de error) 597 598 # Convertir los valores de TensorShapeProto en output_shapes.
ValueError: Tamaño de dimensión negativo causado al restar 2 de 1 para ''MaxPool_7'' (op: ''MaxPool'') con formas de entrada: [?, 1,112,128].
Añadiendo el error solucionado dim_ordering
para mí:
model.add(MaxPooling2D(pool_size=(2, 2), dim_ordering="th"))
Al citar una respuesta mencionada en github , debe especificar el orden de dimensión:
Keras es un contenedor sobre las bibliotecas Theano o Tensorflow. Keras usa la variable de configuración image_dim_ordering
para decidir si la capa de entrada es Theano o Tensorflow. Esta configuración se puede especificar de 2 maneras:
- especifique
''tf''
o''th''
en~/.keras/keras.json
como así -image_dim_ordering: ''th''
. Nota: este es un archivo json . - o especifique
image_dim_ordering
en su modelo así:model.add(MaxPooling2D(pool_size=(2, 2), dim_ordering="th"))
Apéndice: image_dim_ordering
en modo ''th''
la dimensión de los canales (la profundidad) está en el índice 1 (por ejemplo, 3, 256, 256). En ''tf''
modo ''tf''
está en el índice 3 (por ejemplo, 256, 256, 3). Citando a @naoko de los comentarios.
Está utilizando la forma de entrada ya que (3, x, y) debería cambiarla a input_shape = x, y, 3
La respuesta aceptada funciona. Pero también puedes hacer lo siguiente:
model.add(MaxPooling2D((2, 2), name=''block1_pool'', data_format=''channels_last'')
Keras asume que la entrada es (width, height, channels)
para el backend TensorFlow y (channel, width, height)
para el backendo Theano. Desde su input_shape=(3,224,224)
, especificar data_format=''channels_last''
debería hacer el truco.
Para keras con TensorFlow intente lo siguiente:
model.add(ZeroPadding2D((1, 1), input_shape=(img_rows, img_cols, channel)))
También encontré el mismo problema al cargar un modelo VGG entrenado. Así que acabo de tomar la transposición de las imágenes de prueba. el comando real se da a continuación:
kerasImage = kerasImage.transpose(1,2,0)