filthycasual
filthycasual

Reputation: 43

ValueError: Failed to find data adapter that can handle input: (<class 'tuple'> containing values of types {"<class 'int'>"}), <class 'numpy.ndarray'>

import tensorflow as tf
import cv2
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, Activation, Flatten
from tensorflow.keras.layers import Conv2D, MaxPooling2D
from tensorflow.keras.callbacks import TensorBoard

mnist = tf.keras.datasets.mnist

(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train = tf.keras.utils.normalize(x_train, axis=1)
x_test = tf.keras.utils.normalize(x_test, axis=1)

dense_layers = [0, 1, 2]
layer_sizes = [32, 64, 128]
conv_layers = [1, 2, 3]

for dense_layer in dense_layers:
    for layer_size in layer_sizes:
        for conv_layer in conv_layers:
            Name = "{}-conv-{}dense-{}-units".format(conv_layer, dense_layer, layer_size)
            tensorboard = TensorBoard(log_dir = 'logs/{}'.format(Name))
            
            model = Sequential()
            
            model.add(Conv2D(layer_size, (3,3), input_shape = x_train.shape[0:]))
            model.add(Activation("relu"))
            model.add(MaxPooling2D(pool_size = (2,2)))
            
            x_train = x_train.shape[0:]
            
            for i in range(conv_layer-1):
                model.add(Conv2D(layer_size, (3,3),))
                model.add(Activation("relu"))
                model.add(MaxPooling2D(pool_size = (2,2)))
                
            model.add(Flatten())
            
            for i in range(dense_layer):
                model.add(Dense(layer_size))
                model.add(Activation("relu"))
                model.add(Dropout(0.2))
                
            model.add(Dense(1))
            model.add(Activation("sigmoid"))
            
            model.compile(loss = "binary_crossentropy", optimizer = "adam", metrics = ['accuracy'])
            model.fit(x_train, y_train, batch_size = 30, epochs = 10)
                      
model.save("MNIST CNN")

-->model.fit(x_train, y_train, batch_size = 30, epochs = 10) ValueError: Failed to find data adapter that can handle input: (<class 'tuple'> containing values of types {"<class 'int'>"}), <class 'numpy.ndarray'>

How do I fix this?

Upvotes: 0

Views: 1911

Answers (1)

crispengari
crispengari

Reputation: 9321

Your model to me just feels wrong:

  1. Firstly you are using Conv2D on the data with shape (batch_size, 28, 28) shape expected is (batch_size, 28, 28, color_channels)
  2. Secondly you are using binary_cross_entropy for a multi-class classification binary_cross_entropy is only used when we have two outcomes.

How to solve your problem?

Change the input pipeline by reshaping features in the expectes shape as follows:

x_train = x_train.reshape(-1, 28, 28, 1)
x_test = x_test.reshape(-1, 28, 28, 1)

Change the Conv2D input shape in your function

model.add(Conv2D(layer_size, (3,3), input_shape = x_train.shape[1:]))

Change the output layer units to 10 since you are classifying 10 classes:

 model.add(Dense(10))

During model combilation you can use either sparse_categorical_crossentropy or categorical_crossentropy as your loss. But note that categorical_crossentropy expect labels to be one_hot encoded so in your case you should use sparse_categorical_crossentropy

Your new code

import tensorflow as tf
import cv2
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, Activation, Flatten
from tensorflow.keras.layers import Conv2D, MaxPooling2D
from tensorflow.keras.callbacks import TensorBoard

mnist = tf.keras.datasets.mnist

(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train = tf.keras.utils.normalize(x_train, axis=1)
x_test = tf.keras.utils.normalize(x_test, axis=1)

dense_layers = [0, 1, 2]
layer_sizes = [32, 64, 128]
conv_layers = [1, 2, 3]
x_train = x_train.reshape(-1, 28, 28, 1)
x_test = x_test.reshape(-1, 28, 28, 1)
for dense_layer in dense_layers:
    for layer_size in layer_sizes:
        for conv_layer in conv_layers:
            Name = "{}-conv-{}dense-{}-units".format(conv_layer, dense_layer, layer_size)
            tensorboard = TensorBoard(log_dir = 'logs/{}'.format(Name))
            
            model = Sequential()
            
            model.add(Conv2D(layer_size, (3,3), input_shape = x_train.shape[1:]))
            model.add(Activation("relu"))
            model.add(MaxPooling2D(pool_size = (2,2)))
            for i in range(conv_layer-1):
                model.add(Conv2D(layer_size, (3,3),))
                model.add(Activation("relu"))
                model.add(MaxPooling2D(pool_size = (2,2)))
                
            model.add(Flatten())
            
            for i in range(dense_layer):
                model.add(Dense(layer_size))
                model.add(Activation("relu"))
                model.add(Dropout(0.2))
                
            model.add(Dense(10))
            model.add(Activation("sigmoid"))
            print(model.summary())
            
            model.compile(loss = tf.keras.losses.sparse_categorical_crossentropy, optimizer = "adam", metrics = ['accuracy'])
            model.fit(x_test, y_test, batch_size = 30, epochs = 10)
                      
model.save("MNIST CNN")

Upvotes: 1

Related Questions