Skip to content

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

Description

@GreenVegetables123

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

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions