Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Transform 3D Tensor to 4D

Tags:

tensorflow

I am using the VGG16 Model, which expects a 4D Tensor as input. When I call model.fit(xtrain, ytrain, ...) my xtrain is a list of 3D Tensor [size, size, features] - so in this case: [224,224,3]

What I want is 4D Tensors with [len(images), size, size, features]

How could I modify my code to get there?

I tried tf.expand_dims and tf.concant but it didn't work.

# Transforming my image to a 3D Tensor
image = tf.io.read_file(image)
image = tf.image.decode_jpeg(image, channels=3)
image = tf.image.resize(image, [IMG_SIZE, IMG_SIZE])
image = image / 255.0

Error msg after model.fit:

Error when checking input: expected input_1 to have 4 dimensions, but got array with shape (224, 224, 3)

like image 806
Fabian Avatar asked Sep 13 '25 08:09

Fabian


1 Answers

It looks like you are reading in only a single image and passing that. If that's the case, you can add a dimension of 1 to the first axis of the image. There's lots of ways to do that.

Using reshape:

image = image.reshape(1, 224, 224, 3)

Using some fancy numpy slicing notation to add an axis (personal favorite):

image = image[None, ...]

Using numpy.expand_dims() as explained in Abhijit's answer.

I imagine you want to be reading a bunch of images in though. Possibly an issue with your input process? Can you wrap your read in a loop and read multiple files? Something like:

images = []
for file in image_files:
    image = tf.io.read_file(file)
    # ...
    images.append(image)
images = np.asarray(images)
like image 87
Engineero Avatar answered Sep 16 '25 08:09

Engineero