[英]Trying to fix the construction of a neural network (error message: negative dimension?)
这是一个 model,基于论文https://arxiv.org/pdf/1609.04836.Z437175BA4191210EE004ZE1D93的第 12 页 B.3 节的描述
from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation, Flatten
from keras.layers.convolutional import Convolution2D, MaxPooling2D, AveragePooling2D
from keras.layers.normalization import BatchNormalization
img_size = (3, 32, 32)
...
def shallownet(nb_classes):
global img_size
model = Sequential()
model.add(Conv2D(64, (5, 5), input_shape=img_size, data_format='channels_first'))
model.add(BatchNormalization(axis=1))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(3,3), strides=(2,2), padding='same'))
model.add(Conv2D(64, (5, 5), padding='same', data_format='channels_first'))
model.add(BatchNormalization(axis=1))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(3,3), strides=(2,2), padding='same'))
model.add(Flatten())
model.add(Dense(384))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(192))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(nb_classes, activation='softmax'))
return model
由于 Keras 2.0,我尝试对其进行转换。 这是原始代码: https://github.com/keskarnitish/large-batch-training/blob/master/network_zoo.py
我尝试运行以下代码:
parser = argparse.ArgumentParser(description=
'''This code first trains the user-specific network (C[1-4])
using small-batch ADAM and large-batch ADAM, and then plots
the parametric plot connecting the two minimizers
illustrating the sharpness difference.''')
parser.add_argument('-n', '--network', help='''Selects which network
to plot the parametric plots for.
Choices are C1, C2, C3 and C4.''', required=True)
network_choice = vars(parser.parse_args())['network']
nb_epoch = 20
# the data, shuffled and split between train and test sets
if network_choice in ['C1', 'C2']:
(X_train, y_train), (X_test, y_test) = cifar10.load_data()
nb_classes = 10
elif network_choice in ['C3', 'C4']:
(X_train, y_train), (X_test, y_test) = cifar100.load_data()
nb_classes = 100
else:
raise ValueError('''Invalid choice of network.
Please choose one of C1, C2, C3 or C4.
Refer to the paper for details regarding these networks''')
X_train = X_train.astype('float32')
X_test = X_test.astype('float32')
X_train /= 255
X_test /= 255
# 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)
# build the network
if network_choice in ['C1', 'C3']:
model = network_zoo.shallownet(nb_classes)
elif network_choice in ['C2', 'C4']:
model = network_zoo.deepnet(nb_classes)
# let's train the model using Adam
model.compile(loss='categorical_crossentropy',
optimizer='adam',
metrics=['accuracy'])
model.save_weights('x0.h5')
# let's first find the small-batch solution
model.fit(X_train, Y_train,
batch_size=256,
nb_epoch=nb_epoch,
validation_data=(X_test, Y_test),
shuffle=True)
并收到以下错误消息:
Traceback (most recent call last):
File "plot_parametric_plot.py", line 64, in <module>
model = network_zoo.shallownet(nb_classes)
File "/mnt_home/klee/LBSBGenGapSharpnessResearch/network_zoo.py", line 36, in shallownet
model.add(Conv2D(64, (5, 5), input_shape=img_size))
File "/home/klee/anaconda3/envs/sharpenv/lib/python3.7/site-packages/keras/engine/sequential.py", line 166, in add
layer(x)
File "/home/klee/anaconda3/envs/sharpenv/lib/python3.7/site-packages/keras/backend/tensorflow_backend.py", line 75, in symbolic_fn_wrapper
return func(*args, **kwargs)
File "/home/klee/anaconda3/envs/sharpenv/lib/python3.7/site-packages/keras/engine/base_layer.py", line 489, in __call__
output = self.call(inputs, **kwargs)
File "/home/klee/anaconda3/envs/sharpenv/lib/python3.7/site-packages/keras/layers/convolutional.py", line 171, in call
dilation_rate=self.dilation_rate)
File "/home/klee/anaconda3/envs/sharpenv/lib/python3.7/site-packages/keras/backend/tensorflow_backend.py", line 3717, in conv2d
**kwargs)
File "/home/klee/anaconda3/envs/sharpenv/lib/python3.7/site-packages/tensorflow_core/python/ops/nn_ops.py", line 918, in convolution_v2
name=name)
File "/home/klee/anaconda3/envs/sharpenv/lib/python3.7/site-packages/tensorflow_core/python/ops/nn_ops.py", line 1010, in convolution_internal
name=name)
File "/home/klee/anaconda3/envs/sharpenv/lib/python3.7/site-packages/tensorflow_core/python/ops/gen_nn_ops.py", line 969, in conv2d
data_format=data_format, dilations=dilations, name=name)
File "/home/klee/anaconda3/envs/sharpenv/lib/python3.7/site-packages/tensorflow_core/python/framework/op_def_library.py", line 742, in _apply_op_helper
attrs=attr_protos, op_def=op_def)
File "/home/klee/anaconda3/envs/sharpenv/lib/python3.7/site-packages/tensorflow_core/python/framework/func_graph.py", line 595, in _create_op_internal
compute_device)
File "/home/klee/anaconda3/envs/sharpenv/lib/python3.7/site-packages/tensorflow_core/python/framework/ops.py", line 3322, in _create_op_internal
op_def=op_def)
File "/home/klee/anaconda3/envs/sharpenv/lib/python3.7/site-packages/tensorflow_core/python/framework/ops.py", line 1786, in __init__
control_input_ops)
File "/home/klee/anaconda3/envs/sharpenv/lib/python3.7/site-packages/tensorflow_core/python/framework/ops.py", line 1622, in _create_c_op
raise ValueError(str(e))
ValueError: Negative dimension size caused by subtracting 5 from 3 for 'conv2d_1/convolution' (op: 'Conv2D') with input shapes: [?,3,32,32], [5,5,32,64].
虽然我不确定这意味着什么……
更新:在写完 Marco Celani 的评论后,这是我在运行主代码后收到的新错误消息:
Traceback (most recent call last):
File "plot_parametric_plot.py", line 64, in <module>
model = network_zoo.shallownet(nb_classes)
File "/mnt_home/klee/LBSBGenGapSharpnessResearch/network_zoo.py", line 36, in shallownet
model.add(Conv2D(64, (5, 5), input_shape=img_size, data_format='channels_first'))
File "/home/klee/anaconda3/envs/sharpenv/lib/python3.7/site-packages/keras/engine/sequential.py", line 166, in add
layer(x)
File "/home/klee/anaconda3/envs/sharpenv/lib/python3.7/site-packages/keras/backend/tensorflow_backend.py", line 75, in symbolic_fn_wrapper
return func(*args, **kwargs)
File "/home/klee/anaconda3/envs/sharpenv/lib/python3.7/site-packages/keras/engine/base_layer.py", line 489, in __call__
output = self.call(inputs, **kwargs)
File "/home/klee/anaconda3/envs/sharpenv/lib/python3.7/site-packages/keras/layers/convolutional.py", line 171, in call
dilation_rate=self.dilation_rate)
File "/home/klee/anaconda3/envs/sharpenv/lib/python3.7/site-packages/keras/backend/tensorflow_backend.py", line 3701, in conv2d
x, tf_data_format = _preprocess_conv2d_input(x, data_format)
File "/home/klee/anaconda3/envs/sharpenv/lib/python3.7/site-packages/keras/backend/tensorflow_backend.py", line 3574, in _preprocess_conv2d_input
if not _has_nchw_support() or force_transpose:
File "/home/klee/anaconda3/envs/sharpenv/lib/python3.7/site-packages/keras/backend/tensorflow_backend.py", line 522, in _has_nchw_support
gpus_available = len(_get_available_gpus()) > 0
File "/home/klee/anaconda3/envs/sharpenv/lib/python3.7/site-packages/keras/backend/tensorflow_backend.py", line 506, in _get_available_gpus
_LOCAL_DEVICES = tf.config.experimental_list_devices()
AttributeError: module 'tensorflow_core._api.v2.config' has no attribute 'experimental_list_devices'
这意味着您不能应用任何操作,因为您减少了网络内部的太多维度(它低于 0)。
查看您的数据格式似乎您的图像是 (3, 32, 32),因此通道是第一维。 Keras 默认情况下对最后一维的通道应用卷积。 要覆盖错误,请尝试在卷积层和池化层中定义data_format='channels_first'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.