python - 为什么这会给我 InvalidArgumentError?
问题描述
我正在尝试在 keras 中构建以下堆叠沙漏模型
def create_hourglass_network(num_classes, num_stacks, num_channels, inres, outres, bottleneck):
input = Input(shape=(inres[0], inres[1], 3))
front_features = create_front_module(input, num_channels, bottleneck)
head_next_stage = front_features
outputs = []
for i in range(num_stacks):
head_next_stage, head_to_loss = hourglass_module(head_next_stage, num_classes, num_channels, bottleneck, i)
outputs.append(head_to_loss)
model = Model(inputs=input, outputs=outputs)
rms = RMSprop(lr=5e-4)
model.compile(optimizer=rms, loss=mean_squared_error, metrics=["accuracy"])
return model
def hourglass_module(bottom, num_classes, num_channels, bottleneck, hgid):
# create left features , f1, f2, f4, and f8
left_features = create_left_half_blocks(bottom, bottleneck, hgid, num_channels)
# create right features, connect with left features
rf1 = create_right_half_blocks(left_features, bottleneck, hgid, num_channels)
# add 1x1 conv with two heads, head_next_stage is sent to next stage
# head_parts is used for intermediate supervision
head_next_stage, head_parts = create_heads(bottom, rf1, num_classes, hgid, num_channels)
return head_next_stage, head_parts
def bottleneck_block(bottom, num_out_channels, block_name):
# skip layer
if K.int_shape(bottom)[-1] == num_out_channels:
_skip = bottom
else:
_skip = Conv2D(num_out_channels, kernel_size=(1, 1), activation='relu', padding='same',
name=block_name + 'skip')(bottom)
# residual: 3 conv blocks, [num_out_channels/2 -> num_out_channels/2 -> num_out_channels]
_x = Conv2D(num_out_channels / 2, kernel_size=(1, 1), activation='relu', padding='same',
name=block_name + '_conv_1x1_x1')(bottom)
_x = BatchNormalization()(_x)
_x = Conv2D(num_out_channels / 2, kernel_size=(3, 3), activation='relu', padding='same',
name=block_name + '_conv_3x3_x2')(_x)
_x = BatchNormalization()(_x)
_x = Conv2D(num_out_channels, kernel_size=(1, 1), activation='relu', padding='same',
name=block_name + '_conv_1x1_x3')(_x)
_x = BatchNormalization()(_x)
_x = Add(name=block_name + '_residual')([_skip, _x])
return _x
def bottleneck_mobile(bottom, num_out_channels, block_name):
# skip layer
if K.int_shape(bottom)[-1] == num_out_channels:
_skip = bottom
else:
_skip = SeparableConv2D(num_out_channels, kernel_size=(1, 1), activation='relu', padding='same',
name=block_name + 'skip')(bottom)
# residual: 3 conv blocks, [num_out_channels/2 -> num_out_channels/2 -> num_out_channels]
_x = SeparableConv2D(num_out_channels / 2, kernel_size=(1, 1), activation='relu', padding='same',
name=block_name + '_conv_1x1_x1')(bottom)
_x = BatchNormalization()(_x)
_x = SeparableConv2D(num_out_channels / 2, kernel_size=(3, 3), activation='relu', padding='same',
name=block_name + '_conv_3x3_x2')(_x)
_x = BatchNormalization()(_x)
_x = SeparableConv2D(num_out_channels, kernel_size=(1, 1), activation='relu', padding='same',
name=block_name + '_conv_1x1_x3')(_x)
_x = BatchNormalization()(_x)
_x = Add(name=block_name + '_residual')([_skip, _x])
return _x
def create_front_module(input, num_channels, bottleneck):
# front module, input to 1/4 resolution
# 1 7x7 conv + maxpooling
# 3 residual block
_x = Conv2D(64, kernel_size=(7, 7), strides=(2, 2), padding='same', activation='relu', name='front_conv_1x1_x1')(
input)
_x = BatchNormalization()(_x)
_x = bottleneck(_x, num_channels // 2, 'front_residual_x1')
_x = MaxPooling2D(pool_size=(2, 2), strides=(2, 2))(_x)
_x = bottleneck(_x, num_channels // 2, 'front_residual_x2')
_x = bottleneck(_x, num_channels, 'front_residual_x3')
return _x
def create_left_half_blocks(bottom, bottleneck, hglayer, num_channels):
# create left half blocks for hourglass module
# f1, f2, f4 , f8 : 1, 1/2, 1/4 1/8 resolution
hgname = 'hg' + str(hglayer)
f1 = bottleneck(bottom, num_channels, hgname + '_l1')
_x = MaxPooling2D(pool_size=(2, 2), strides=(2, 2))(f1)
f2 = bottleneck(_x, num_channels, hgname + '_l2')
_x = MaxPooling2D(pool_size=(2, 2), strides=(2, 2))(f2)
f4 = bottleneck(_x, num_channels, hgname + '_l4')
_x = MaxPooling2D(pool_size=(2, 2), strides=(2, 2))(f4)
f8 = bottleneck(_x, num_channels, hgname + '_l8')
return (f1, f2, f4, f8)
def connect_left_to_right(left, right, bottleneck, name, num_channels):
'''
:param left: connect left feature to right feature
:param name: layer name
:return:
'''
# left -> 1 bottlenect
# right -> upsampling
# Add -> left + right
_xleft = bottleneck(left, num_channels, name + '_connect')
_xright = UpSampling2D()(right)
add = Add()([_xleft, _xright])
out = bottleneck(add, num_channels, name + '_connect_conv')
return out
def bottom_layer(lf8, bottleneck, hgid, num_channels):
# blocks in lowest resolution
# 3 bottlenect blocks + Add
lf8_connect = bottleneck(lf8, num_channels, str(hgid) + "_lf8")
_x = bottleneck(lf8, num_channels, str(hgid) + "_lf8_x1")
_x = bottleneck(_x, num_channels, str(hgid) + "_lf8_x2")
_x = bottleneck(_x, num_channels, str(hgid) + "_lf8_x3")
rf8 = Add()([_x, lf8_connect])
return rf8
def create_right_half_blocks(leftfeatures, bottleneck, hglayer, num_channels):
lf1, lf2, lf4, lf8 = leftfeatures
rf8 = bottom_layer(lf8, bottleneck, hglayer, num_channels)
rf4 = connect_left_to_right(lf4, rf8, bottleneck, 'hg' + str(hglayer) + '_rf4', num_channels)
rf2 = connect_left_to_right(lf2, rf4, bottleneck, 'hg' + str(hglayer) + '_rf2', num_channels)
rf1 = connect_left_to_right(lf1, rf2, bottleneck, 'hg' + str(hglayer) + '_rf1', num_channels)
return rf1
def create_heads(prelayerfeatures, rf1, num_classes, hgid, num_channels):
# two head, one head to next stage, one head to intermediate features
head = Conv2D(num_channels, kernel_size=(1, 1), activation='relu', padding='same', name=str(hgid) + '_conv_1x1_x1')(
rf1)
head = BatchNormalization()(head)
# for head as intermediate supervision, use 'linear' as activation.
head_parts = Conv2D(num_classes, kernel_size=(1, 1), activation='linear', padding='same',
name=str(hgid) + '_conv_1x1_parts')(head)
# use linear activation
head = Conv2D(num_channels, kernel_size=(1, 1), activation='linear', padding='same',
name=str(hgid) + '_conv_1x1_x2')(head)
head_m = Conv2D(num_channels, kernel_size=(1, 1), activation='linear', padding='same',
name=str(hgid) + '_conv_1x1_x3')(head_parts)
head_next_stage = Add()([head, head_m, prelayerfeatures])
return head_next_stage, head_parts
我正在使用以下方法构建模型:
model=create_hourglass_network(19,2,256,(256,256),(64,64),bottleneck_block)
我收到以下错误:
InvalidArgumentError: Value for attr 'T' of float is not in the list of allowed values: int32, int64
; NodeDef: {{node RandomUniform}}; Op<name=RandomUniform; signature=shape:T -> output:dtype; attr=seed:int,default=0; attr=seed2:int,default=0; attr=dtype:type,allowed=[DT_HALF, DT_BFLOAT16, DT_FLOAT, DT_DOUBLE]; attr=T:type,allowed=[DT_INT32, DT_INT64]; is_stateful=true> [Op:RandomUniform]
这到底是指什么?将bottleneck_block 作为参数传递是否有问题?如果您有任何想法,他们将不胜感激!
这是调用bottle_neck时的完整堆栈跟踪:
File "<ipython-input-11-2bee0ad641ac>", line 1, in <module>
out=bottleneck_block(np.zeros((4,256,256,3)),256,"blah")
File "C:\Users\alecd\untitled2.py", line 65, in bottleneck_block
File "C:\Users\alecd\Anaconda3\envs\tensorflow\lib\site-packages\tensorflow_core\python\keras\engine\base_layer.py", line 887, in __call__
self._maybe_build(inputs)
File "C:\Users\alecd\Anaconda3\envs\tensorflow\lib\site-packages\tensorflow_core\python\keras\engine\base_layer.py", line 2141, in _maybe_build
self.build(input_shapes)
File "C:\Users\alecd\Anaconda3\envs\tensorflow\lib\site-packages\tensorflow_core\python\keras\layers\convolutional.py", line 165, in build
dtype=self.dtype)
File "C:\Users\alecd\Anaconda3\envs\tensorflow\lib\site-packages\tensorflow_core\python\keras\engine\base_layer.py", line 522, in add_weight
aggregation=aggregation)
File "C:\Users\alecd\Anaconda3\envs\tensorflow\lib\site-packages\tensorflow_core\python\training\tracking\base.py", line 744, in _add_variable_with_custom_getter
**kwargs_for_getter)
File "C:\Users\alecd\Anaconda3\envs\tensorflow\lib\site-packages\tensorflow_core\python\keras\engine\base_layer_utils.py", line 139, in make_variable
shape=variable_shape if variable_shape else None)
File "C:\Users\alecd\Anaconda3\envs\tensorflow\lib\site-packages\tensorflow_core\python\ops\variables.py", line 258, in __call__
return cls._variable_v1_call(*args, **kwargs)
File "C:\Users\alecd\Anaconda3\envs\tensorflow\lib\site-packages\tensorflow_core\python\ops\variables.py", line 219, in _variable_v1_call
shape=shape)
File "C:\Users\alecd\Anaconda3\envs\tensorflow\lib\site-packages\tensorflow_core\python\ops\variables.py", line 197, in <lambda>
previous_getter = lambda **kwargs: default_variable_creator(None, **kwargs)
File "C:\Users\alecd\Anaconda3\envs\tensorflow\lib\site-packages\tensorflow_core\python\ops\variable_scope.py", line 2507, in default_variable_creator
shape=shape)
File "C:\Users\alecd\Anaconda3\envs\tensorflow\lib\site-packages\tensorflow_core\python\ops\variables.py", line 262, in __call__
return super(VariableMetaclass, cls).__call__(*args, **kwargs)
File "C:\Users\alecd\Anaconda3\envs\tensorflow\lib\site-packages\tensorflow_core\python\ops\resource_variable_ops.py", line 1406, in __init__
distribute_strategy=distribute_strategy)
File "C:\Users\alecd\Anaconda3\envs\tensorflow\lib\site-packages\tensorflow_core\python\ops\resource_variable_ops.py", line 1537, in _init_from_args
initial_value() if init_from_fn else initial_value,
File "C:\Users\alecd\Anaconda3\envs\tensorflow\lib\site-packages\tensorflow_core\python\keras\engine\base_layer_utils.py", line 119, in <lambda>
init_val = lambda: initializer(shape, dtype=dtype)
File "C:\Users\alecd\Anaconda3\envs\tensorflow\lib\site-packages\tensorflow_core\python\ops\init_ops_v2.py", line 437, in __call__
return self._random_generator.random_uniform(shape, -limit, limit, dtype)
File "C:\Users\alecd\Anaconda3\envs\tensorflow\lib\site-packages\tensorflow_core\python\ops\init_ops_v2.py", line 800, in random_uniform
shape=shape, minval=minval, maxval=maxval, dtype=dtype, seed=self.seed)
File "C:\Users\alecd\Anaconda3\envs\tensorflow\lib\site-packages\tensorflow_core\python\ops\random_ops.py", line 245, in random_uniform
rnd = gen_random_ops.random_uniform(shape, dtype, seed=seed1, seed2=seed2)
File "C:\Users\alecd\Anaconda3\envs\tensorflow\lib\site-packages\tensorflow_core\python\ops\gen_random_ops.py", line 812, in random_uniform
_six.raise_from(_core._status_to_exception(e.code, message), None)
File "<string>", line 3, in raise_from
InvalidArgumentError: Value for attr 'T' of float is not in the list of allowed values: int32, int64
; NodeDef: {{node RandomUniform}}; Op<name=RandomUniform; signature=shape:T -> output:dtype; attr=seed:int,default=0; attr=seed2:int,default=0; attr=dtype:type,allowed=[DT_HALF, DT_BFLOAT16, DT_FLOAT, DT_DOUBLE]; attr=T:type,allowed=[DT_INT32, DT_INT64]; is_stateful=true> [Op:RandomUniform]
解决方案
推荐阅读
- javascript - Javascript映射到数组
- python-3.x - 为什么它不遍历该句子中的整个字符串循环?我打算写所有的小写字母?
- html - 外部 style.css 不适用于引导 css
- c# - input type="range" - 在 ASP.NET 中将数据从视图发送到控制器
- java - 春天用jsp
- python - 使用 python 将表格数据及其格式和样式从 Outlook 提取到 Excel
- r - 重新计算数据集中的秒数/序列
- mysql - 将跟踪的图像存储在数据库中与目录中
- r - 从 colSums R 中排除选定的值和 NA
- javascript - 按下时如何获取div的内容?