简体   繁体   中英

how to fix this error : numpy.ndarray “ object has no attribute ”append"

I hope that you are doing well. I tried to run the below code. I am getting this error " numpy.ndarray object has no attribute append". I tried to used the solution recommended in other questions, like numpy.append() , numpy.concatenate() but I could not solve the problem.

from keras.applications import VGG16
from keras.applications import imagenet_utils
from keras.preprocessing.image import img_to_array
from keras.preprocessing.image import load_img
from sklearn.preprocessing import LabelEncoder
from hdf5datasetwriter import HDF5DatasetWriter
from imutils import paths
import progressbar
import argparse
import random
import numpy as np
import os


# construct the argument parser and parse the arguments

ap = argparse.ArgumentParser()
ap.add_argument("-d", "--dataset", required= True,
                help=" path to the input dataset ")
ap.add_argument("-o", "--output", required= True,
                help=" path to output HDF5 file ")
ap.add_argument("-b","--batch_size", type= int, default=32,
                help =" batch size of images to be passed through network ")
ap.add_argument("-s","--buffer_size", type =int, default=1000,
                help=" size of feature extraction buffer")

args= vars(ap.parse_args())

# store the batch size in a convenience variable
bs = args["batch_size"]

# grab the list of images that we will be describing then randomly shuffle them to
# allow for easy training and testing splits via array slicing during training time

print ("[INFO] loading images ...")
imagePaths= list(paths.list_images(args["dataset"]))
random.shuffle(imagePaths)

# extract the class labels from the images paths then encode the labels

labels = [p.split(os.path.sep)[-2] for p in imagePaths]
le= LabelEncoder()
labels= le.fit_transform(labels)

# load the VGG16 network

print("[INFO] loading network ...")

model= VGG16(weights="imagenet", include_top=False)

# initialize the HDF5 dataset writer then store the class label names in the
# dataset
dataset = HDF5DatasetWriter((len(imagePaths), 512*7*7), args["output"], dataKey="features",
                            bufSize= args["buffer_size"])
dataset.storeClassLabels(le.classes_)

# initialize the prograss bar
widgets = [" extracting features:", progressbar.Percentage(), " " , progressbar.Bar(),
           " " , progressbar.ETA()]
pbar= progressbar.ProgressBar(maxval=len(imagePaths), widgets= widgets ).start()

# loop over the image patches

for i in np.arange(0, len(imagePaths),bs):
    # extract the batch of images and labels, then initalize the
    # list of actualimages that will be passed through the network for feature
    # extraction

    batchPaths= imagePaths[i:i + bs]
    batchLabels = labels[i:i+bs]
    batchImages = []

    for (j, imagePath) in enumerate(batchPaths):
        # load the input image using the keras helper utility
        # while ensuring the image is resized to 224x224 pixels

        image = load_img(imagePath, target_size = (224,224))
        image = img_to_array(image)

        # preprocess the image by (1) expanding the dimensions and
        # (2) substracting the mean RGB pixel intensity from the imagenet dataset

        image = np.expand_dims(image, axis =0)
        #image = imagenet_utils.preprocess_input(image)

        # add the image to the batch
        batchImages.append(image)

        # pass the images through the network and use the outputs as our
        # actual featues

        batchImages = np.vstack(batchImages)
        features = model.predict(batchImages, batch_size = bs)

        # reshape the features so that each image is represented by a flattened feature vector of the maxPooling2D outputs
        features = features.reshape((features.shape[0], 512*7*7))
        # add the features and the labels to HDF5 dataset
        dataset.add(features, batchLabels)
        pbar.update(i)


dataset.close()
pbar.finish()

I am getting this

在此处输入图片说明

I would like that you help me to solve this problem. thanks in to all in advance

Numpy array instance doesn't have append function. Call

numpy.append(your_arr, value_to_append)

which is class function.

From the documentation :

You should be doing something like batchImages = np.append(batchImages, image) because "append" is not actually a defined function on numpy arrays, which is what the error message is saying. If you want to insert somewhere specific in the array, np.insert(batchImages, index, image) works as well.

You start with

batchImages = []

then successfully append to the list

batchImages.append(image)

then in the same iteration, you make an array and assign it to the same variable:

batchImages = np.vstack(batchImages)

next iteration, batchImages is no longer a list, so the append doesn't work!

I wonder if that vstack has the wrong indentation. Is it supposed to happen in the j iteration, or the i one?

Ignore the recommendations to use np.append . It should not be used iteratively, and is hard to use correctly. It's just a crude cover function for concatenate . vstack is better.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM