Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
GreenVegetables123 opened this issue Apr 26, 2019 · 3 comments

Comments

@GreenVegetables123
Copy link

我训练的时候看到准确率是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

@Waxyoung
Copy link

Waxyoung commented Aug 7, 2019

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

@cqlp1314
Copy link

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

@shuoshuof
Copy link

应该是BatchNormalization的锅

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants