Reputation: 43
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
Reputation: 9321
Your model to me just feels wrong:
Conv2D
on the data with shape (batch_size, 28, 28)
shape expected is (batch_size, 28, 28, color_channels)
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