简体   繁体   中英

Using Keras to design a CNN: Understanding Tensor Shape

just starting out with ML, and wanted to create my own CNN to detect orientation of images with faces. I followed a tutorial to accept input images of 64x64x1, and here is my code:

from keras.models import Model
from keras.layers import Input
from keras.layers import Dense
from keras.layers import Flatten
from keras.layers.convolutional import Conv2D
from keras.layers.pooling import MaxPooling2D
from keras.preprocessing.image import ImageDataGenerator

datagen = ImageDataGenerator()
train_it = datagen.flow_from_directory('firstThousandTransformed/', class_mode='categorical', batch_size=64, color_mode="grayscale")
val_it = datagen.flow_from_directory('validation/', class_mode='categorical', batch_size=64, color_mode="grayscale")

imageInput = Input(shape=(64,64,1))
conv1 = Conv2D(32, kernel_size=4, activation='relu')(imageInput)
pool1 = MaxPooling2D(pool_size=(2, 2))(conv1)
conv2 = Conv2D(16, kernel_size=4, activation='relu')(pool1)
pool2 = MaxPooling2D(pool_size=(2, 2))(conv2)
flat = Flatten()(pool2)
hidden1 = Dense(10, activation='relu')(flat)
output = Dense(4, activation='sigmoid')(hidden1)
model = Model(inputs=imageInput, outputs=output)
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
print(model.summary())
model.fit(train_it, steps_per_epoch=16, validation_data=val_it, validation_steps=8)

However, I get this error when I try to run:

Input to reshape is a tensor with 3810304 values, but the requested shape requires a multiple of 2704 [[node model/flatten/Reshape (defined at c:\Users\cdues\Desktop\kerasTutorial\orentationTry.py:33) ]] [Op:__inference_train_function_836]

Below is my model summary:

在此处输入图像描述

I need some help understanding what a Tensor shape is and where my code has gone wrong here. Just working through the tutorial with Keras, I didn't encounter Tensor shape and now I am sort of lost. Sorry for the basic question, can yall help a noobie out? Thanks!

Try using the target_size argument while calling flow_from_directory.

train_it = datagen.flow_from_directory('firstThousandTransformed/',
                                       class_mode='categorical', 
                                       batch_size=64,
                                       color_mode='grayscale',
                                       target_size=(64,64))

val_it = datagen.flow_from_directory('validation/',
                                      class_mode='categorical',
                                      batch_size=64,
                                      color_mode='grayscale',
                                      target_size=(64,64))

This way you can reshape the images from the directories before feeding to the model.

First in ImageDataGenerator there is a parameter called rescale. Typically with pixel values in the range 0 to 255 rescale is set to 1/255 so pixel value fall in the range from 0 to 1. I recommend you use that. Documentation for ImageDataGenerator is here. . In flow from directory you can specify the image size with parameter target_size: Tuple of integers (height, width) , default: (256, 256) . Documentation is at location specified earlier. In your model you have 4 nodes in your output layer. This implies you are classifying images into one of 4 classes. If that is the case in model.compile you should use categorical cross entropy as the loss. Change the activation function in your output layer to softmax.

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