MobileNetV2 icon indicating copy to clipboard operation
MobileNetV2 copied to clipboard

我写了预测代码,为什么预测出来是一个都是同一个类别呀

Open GreenVegetables123 opened this issue 5 years ago • 3 comments

我训练的时候看到准确率是90%以上,但是拿训练图片去预测,却都是一个类别 from keras.models import Model from keras.layers import Input, Conv2D, GlobalAveragePooling2D, Dropout from keras.layers import Activation, BatchNormalization, add, Reshape,DepthwiseConv2D,ReLU

from keras.applications.mobilenet import relu6, DepthwiseConv2D

from keras.utils.vis_utils import plot_model

from keras import backend as K

import cv2 import numpy as np import time

import os os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID" os.environ["CUDA_VISIBLE_DEVICES"] = "-1"

def _conv_block(inputs, filters, kernel, strides): """Convolution Block This function defines a 2D convolution operation with BN and relu6.

# Arguments
    inputs: Tensor, input tensor of conv layer.
    filters: Integer, the dimensionality of the output space.
    kernel: An integer or tuple/list of 2 integers, specifying the
        width and height of the 2D convolution window.
    strides: An integer or tuple/list of 2 integers,
        specifying the strides of the convolution along the width and height.
        Can be a single integer to specify the same value for
        all spatial dimensions.

# Returns
    Output tensor.
"""

channel_axis = 1 if K.image_data_format() == 'channels_first' else -1

x = Conv2D(filters, kernel, padding='same', strides=strides)(inputs)
x = BatchNormalization(axis=channel_axis)(x)
# return Activation(relu6)(x)
return Activation(ReLU(6.))(x)

def _bottleneck(inputs, filters, kernel, t, s, r=False): """Bottleneck This function defines a basic bottleneck structure.

# Arguments
    inputs: Tensor, input tensor of conv layer.
    filters: Integer, the dimensionality of the output space.
    kernel: An integer or tuple/list of 2 integers, specifying the
        width and height of the 2D convolution window.
    t: Integer, expansion factor.
        t is always applied to the input size.
    s: An integer or tuple/list of 2 integers,specifying the strides
        of the convolution along the width and height.Can be a single
        integer to specify the same value for all spatial dimensions.
    r: Boolean, Whether to use the residuals.

# Returns
    Output tensor.
"""

channel_axis = 1 if K.image_data_format() == 'channels_first' else -1
tchannel = K.int_shape(inputs)[channel_axis] * t

x = _conv_block(inputs, tchannel, (1, 1), (1, 1))

x = DepthwiseConv2D(kernel, strides=(s, s), depth_multiplier=1, padding='same')(x)
x = BatchNormalization(axis=channel_axis)(x)
# x = Activation(relu6)(x)
x = Activation(ReLU(6.))(x)

x = Conv2D(filters, (1, 1), strides=(1, 1), padding='same')(x)
x = BatchNormalization(axis=channel_axis)(x)

if r:
    x = add([x, inputs])
return x

def _inverted_residual_block(inputs, filters, kernel, t, strides, n): """Inverted Residual Block This function defines a sequence of 1 or more identical layers.

# Arguments
    inputs: Tensor, input tensor of conv layer.
    filters: Integer, the dimensionality of the output space.
    kernel: An integer or tuple/list of 2 integers, specifying the
        width and height of the 2D convolution window.
    t: Integer, expansion factor.
        t is always applied to the input size.
    s: An integer or tuple/list of 2 integers,specifying the strides
        of the convolution along the width and height.Can be a single
        integer to specify the same value for all spatial dimensions.
    n: Integer, layer repeat times.
# Returns
    Output tensor.
"""

x = _bottleneck(inputs, filters, kernel, t, strides)

for i in range(1, n):
    x = _bottleneck(x, filters, kernel, t, 1, True)

return x

def MobileNetv2( k=3): """MobileNetv2 This function defines a MobileNetv2 architectures.

# Arguments
    input_shape: An integer or tuple/list of 3 integers, shape
        of input tensor.
    k: Integer, number of classes.
# Returns
    MobileNetv2 model.
"""
inputs = Input(shape=(224, 224, 3), dtype='float32')

x = _conv_block(inputs, 32, (3, 3), strides=(2, 2))

x = _inverted_residual_block(x, 16, (3, 3), t=1, strides=1, n=1)
x = _inverted_residual_block(x, 24, (3, 3), t=6, strides=2, n=2)
x = _inverted_residual_block(x, 32, (3, 3), t=6, strides=2, n=3)
x = _inverted_residual_block(x, 64, (3, 3), t=6, strides=2, n=4)
x = _inverted_residual_block(x, 96, (3, 3), t=6, strides=1, n=3)
x = _inverted_residual_block(x, 160, (3, 3), t=6, strides=2, n=3)
x = _inverted_residual_block(x, 320, (3, 3), t=6, strides=1, n=1)

x = _conv_block(x, 1280, (1, 1), strides=(1, 1))
x = GlobalAveragePooling2D()(x)
x = Reshape((1, 1, 1280))(x)
x = Dropout(0.3, name='Dropout')(x)
x = Conv2D(k, (1, 1), padding='same')(x)

x = Activation('softmax', name='softmax')(x)
output = Reshape((k,))(x)

model = Model(inputs, output)
model.load_weights("model/ep052-loss0.066-val_loss0.730.h5")
return model

if name=="main": model=MobileNetv2() files=os.listdir("testimage3/") for file in files: print file time1=time.time() image = cv2.imread("testimage3/"+file) image = cv2.resize(image, (224, 224)) image = image.transpose(1, 0, 2) result = model.predict(np.array([image]),verbose=1) print result print "耗时:",time.time()-time1

GreenVegetables123 avatar Apr 26 '19 02:04 GreenVegetables123

目前这个问题解决了吗?我也是这个问题。

Waxyoung avatar Aug 07 '19 05:08 Waxyoung

我也是兄弟,有解决办法么

cqlp1314 avatar Dec 13 '21 09:12 cqlp1314

应该是BatchNormalization的锅

shuoshuof avatar Jan 15 '23 03:01 shuoshuof