Caleb H.
Caleb H.

Reputation: 1717

Tensorflow Keras Python3 expects output of shape (1,) but gets shape (3,)

I'm kind of a newbie to tensorflow and building neural networks.

I'm trying to make a neural network with the tf.keras api that will take a single input, and give 3 outputs. Here is my code:

import os
import tensorflow as tf
from tensorflow import keras
import numpy as np

train_times = np.array([[1],[2],[3],[4],[5],[6],[7],[8]])
train_sensors = np.array([[0.1,0.15,0.2],[0.25,0.3,0.35],[0.4,0.45,0.5],[0.55,0.6,0.65],[0.7,0.75,0.8],[0.85,0.9,0.95],[0.05,0.33,0.56],[0.8,0.35,0.9]])
test_times = np.array([[1],[2],[3],[4],[5],[6],[7],[8]])
test_sensors = np.array([[0.1,0.15,0.2],[0.25,0.3,0.35],[0.4,0.45,0.5],[0.55,0.6,0.65],[0.7,0.75,0.8],[0.85,0.9,0.95],[0.05,0.33,0.56],[0.8,0.35,0.9]])
print(train_sensors[0].shape)
def create_model():
    model = tf.keras.models.Sequential([
    keras.layers.Dense(5, activation=tf.nn.relu, input_shape=(1,), name="Input"),
    keras.layers.Dense(10,activation=tf.nn.relu, name="Middle"),
    keras.layers.Dropout(0.2),
    keras.layers.Dense(3, activation=tf.nn.softmax, name="Out")
    ])
    model.compile(optimizer=tf.keras.optimizers.Adam(), loss=tf.keras.losses.sparse_categorical_crossentropy,
                  metrics=['accuracy'])
    return model


model = create_model()
model.summary()

checkpoint_path = "sensor_predict.ckpt"
checkpoint_dir = os.path.dirname(checkpoint_path)

cp_callback = tf.keras.callbacks.ModelCheckpoint(checkpoint_path,save_weights_only=True,verbose=1)
model.fit(x=train_times, y=train_sensors,epochs = 10,validation_data = (test_sensors, test_times), callbacks = [cp_callback])

I have specified that the last layer should have three outputs, but I get this error every time I run it:

ValueError: Error when checking target: expected Out to have shape (1,) but got array with shape (3,)

I can't figure out why it seems to think I want a single output from the network.

NOTE: The dataset I am using is not what I will actually use. I'm just trying to get a functional network, and then I'll generate the data later.

Upvotes: 0

Views: 438

Answers (1)

jmsinusa
jmsinusa

Reputation: 1652

Your loss function (tf.keras.losses.sparse_categorical_crossentropy) is expecting the training vector to be one hot encoded. Change it to tf.keras.losses.mse, for example, and I think it will work.

See tensorflow docs for the definition.

Upvotes: 1

Related Questions