首页 > 解决方案 > 检索错误预测结果的问题

问题描述

我有以下代码尝试使用mobilenetv2执行预测,但是预测结果没有提供预期结果,它提供了错误的预测结果,预期输出需要是这个[('n02504458','African_elephant',0.5459417),( 'n01871265', '象牙', 0.28918085), ('n02504013', 'Indian_elephant', 0.08010819)]

from keras.applications.mobilenet_v2 import decode_predictions
#from keras.applications.imagenet_utils import decode_predictions
from keras.applications.imagenet_utils import preprocess_input
def relu6(x):
  return K.relu(x, max_value=6)
def _conv_block(inputs, filters, kernel, strides, use_bias=True):
  channel_axis = 1 if K.image_data_format() == 'channels_first' else -1
  if nlay < 0 or nlay > 16:
    basename = 'conv_%d' % (nlay + 1)
  else:
    basename = 'expanded_conv_%d_expand' % nlay
  x = Conv2D(filters, kernel, padding='same', strides=strides, name=basename, use_bias=use_bias) 
  (inputs)
  x = BatchNormalization(axis=channel_axis, name=basename + '_batch_normalization')(x)
  return Activation(relu6, name=basename + '_activation')(x)
def _bottleneck(inputs, filters, kernel, t, s, r=False):
  global nlay
  channel_axis = 1 if K.image_data_format() == 'channels_first' else -1
  #Create expansions layer only if needed (expansion factor >1)
  if t > 1:
    tchannel = K.int_shape(inputs)[channel_axis] * t
    x = _conv_block(inputs, tchannel, (1, 1), (1, 1), use_bias=False)
  else:
    x = inputs
  x = DepthwiseConv2D(kernel, strides=(s, s), depth_multiplier=1, padding='same',
                    name='expanded_conv_%d_depthwise' % nlay, use_bias=False)(x)
  x = BatchNormalization(axis=channel_axis, name='expanded_conv_%d_depthwise_batch_normalization' % 
 nlay)(x)
  x = Activation(relu6, name='expanded_conv_%d_depthwise_activation' % nlay)(x)
  x = Conv2D(filters, (1, 1), strides=(1, 1), padding='same', name='expanded_conv_%d_project' % nlay, 
  use_bias=False)(x)
  x = BatchNormalization(axis=channel_axis, name='expanded_conv_%d_project_batch_normalization' % 
  nlay)(x)
  if r:
    x = add([x, inputs], name="expanded_conv_%d_add" % nlay)
  nlay += 1
  return x
 def _inverted_residual_block(inputs, filters, kernel, t, strides, n):
  x = _bottleneck(inputs, filters, kernel, t, strides)
  for i in range(1, n):
    x = _bottleneck(x, filters, kernel, t, 1, True)
  return x
def roundup(n):
 x = (n + 6) // 8
 return x * 8
def MobileNetv2(input_shape, k, width_multiplier=1.0):
 global nlay
 nlay = -1
 inputs = Input(shape=input_shape)
 x = _conv_block(inputs, roundup(int(32 * width_multiplier)), (3, 3), strides=(2, 2), use_bias=False)
 nlay += 1
 fix = 0
 if width_multiplier - 1.3 < 0.01:
    fix = -2
 x = _inverted_residual_block(x, roundup(int(16 * width_multiplier)), (3, 3), t=1, strides=1, n=1)
 x = _inverted_residual_block(x, roundup(int(24 * width_multiplier)), (3, 3), t=6, strides=2, n=2)
 x = _inverted_residual_block(x, roundup(int(32 * width_multiplier)), (3, 3), t=6, strides=2, n=3)
 x = _inverted_residual_block(x, roundup(int(64 * width_multiplier) + fix), (3, 3), t=6, strides=2, 
 n=4)
 x = _inverted_residual_block(x, roundup(int(96 * width_multiplier)), (3, 3), t=6, strides=1, n=3)
 x = _inverted_residual_block(x, roundup(int(160 * width_multiplier)), (3, 3), t=6, strides=2, n=3)
 x = _inverted_residual_block(x, roundup(int(320 * width_multiplier)), (3, 3), t=6, strides=1, n=1)
 last_conv_size = max(1280, int(1280 * width_multiplier))
 x = _conv_block(x, last_conv_size, (1, 1), strides=(1, 1), use_bias=False)
 x = GlobalAveragePooling2D()(x)
 x = Reshape((1, 1, last_conv_size))(x)
 x = Dropout(0.3, name='Dropout')(x)
 x = Conv2D(k, (1, 1), padding='same', name='logits', use_bias=True)(x)
 x = Activation('softmax', name='softmax')(x)
 output = Reshape((k,), name='out')(x)
 model = Model(inputs, output)
 plot_model(model, to_file='MobileNetv2.png', show_shapes=True)
 return model
 if __name__ == '__main__':
  model = MobileNetv2((224, 224, 3), 1000)
  img_path = 'elephant.jpg'
  img = image.load_img(img_path, target_size=(224, 224))
  x = image.img_to_array(img)
  x = np.expand_dims(x, axis=0)
  x = preprocess_input(x)
  print('Input image shape:', x.shape)
  preds = model.predict(x)
  print(':', decode_predictions(preds))

预测结果输出

[[('n15075141', 'toilet_tissue', 0.001), ('n02319095', 'sea_urchin', 0.001), ('n02395406', '猪', 0.001), ('n02391049', '斑马', 0.001), ('n02389026', '酢浆草', 0.001)]]

标签: tensorflowmachine-learningkerasconv-neural-network

解决方案


你还没有训练你的网络。您可以:

  • 加载预训练的权重。仅当您使用预训练的 Keras 网络之一时,此选项才可用。对于图像分类,一个不错的选择是 ImageNet:

    model = ResNet50(weights='imagenet')

  • model.fit在某些数据集上使用方法训练您的网络。这种方法也可以用于自定义网络。


推荐阅读