python - 试图修复神经网络的构造(错误信息:负维度?)
问题描述
这是基于论文https://arxiv.org/pdf/1609.04836.pdf第 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'
在卷积层和池化层中定义
推荐阅读
- javascript - 如何设置 Leaflet Map 的缩放以显示 React Leaflet 中的所有标记?
- php - jquery 类选择器仅适用于第一行
- emacs - 将组织模式卡住的项目定义为没有计划任务
- javascript - 语法错误,即使在对一个简单的代码进行了各种修复之后,这也让我发疯了第一行它指责错误
- snowflake-cloud-data-platform - 在单个雪花表上并行插入/删除
- url - 有没有办法在 oracle 数据库 11g 中找到 url?
- python - 我在转换货币时收到错误 decimal.InvalidOperation
- c++ - 循环边缘的 C++ 习惯用法
- typescript - 打字稿模板文字作为接口键
- python - Python - 无法从特定网站抓取数据 (CourseHero)