Justin Chan
Justin Chan

Reputation: 11

ValueError: Error when checking input: expected dense_9_input to have shape (9,) but got array with shape (1,)

Firstly, I set my data to be randomized as shown:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from itertools import combinations as comb
import math
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Flatten

dataset = pd.read_csv('Partial_quantarize.csv') #My dataset
print(dataset.columns.values)

pick = np.random.rand(len(dataset)) < 0.7
train = dataset[pick]
test = dataset[~pick]

#ingredient for training/testing the algorithm
coord = ['ra','dec']
cmodel_mags = ['Mag_u','Mag_g','Mag_r','Mag_i','Mag_z']
rad = ['rad_u', 'rad_g', 'rad_r', 'rad_i', 'rad_z']
dered = ['ext_u','ext_g','ext_r','ext_i','ext_z']
dered_color_indices = ['ext_ug','ext_gr','ext_ri','ext_iz']
coindex = ['coindex_u','coindex_g','coindex_r','coindex_i','coindex_z']
cmodel_color_indices = ['ug','gr','ri','iz']
prad50 = ['petroR50_u','petroR50_g','petroR50_r','petroR50_i','petroR50_z']
prad90 = ['petroR90_u','petroR90_g','petroR90_r','petroR90_i','petroR90_z']
#rad = ['petroRad_u','petroRad_g','petroRad_r','petroRad_i','petroRad_z']
#petro_color_indices = ['p_ug','p_gr','p_ri','p_iz']

#training models
model1 = cmodel_mags + cmodel_color_indices
model2 = cmodel_mags + cmodel_color_indices + rad
model3 = cmodel_mags + cmodel_color_indices + rad + coindex
model4 = dered + dered_color_indices
model5 = dered + dered_color_indices + rad
model6 = dered + dered_color_indices + rad + coindex
model7 = cmodel_mags + cmodel_color_indices + dered + dered_color_indices + rad + coindex
fullparms = coord + cmodel_mags + cmodel_color_indices + dered + dered_color_indices + rad + prad50 + prad90 + coindex

print(train[model4].shape,test[model4].shape) #this gives me (70061,9) (29939,9)

def nn_mlp(test, train, labels, k=7):
    ylabel = train['redshift']
    prediction = []
    batch=1
    no_bins = k*100 if k*100 < 1000 else 1000
    max_z = np.max(train['redshift'].values)
    min_z = np.min(train['redshift'].values)
    model = Sequential()
    model.add(Dense(len(labels), input_dim=len(labels), kernel_initializer='normal', use_bias=True, activation='relu'))
    model.add(Dense(1, kernel_initializer='normal', use_bias=True))
    model.compile(loss='mean_squared_error', optimizer='adam')
    edges = np.histogram(train['redshift'].values[::batch], bins=no_bins, range=(min_z,max_z))[1]
    edges_with_overflow = np.histogram(train['redshift'].values[::batch], bins=no_bins+1, range=(min_z, max_z))[1]
    model.fit(train[labels].values[::batch], edges_with_overflow[np.digitize(train['redshift'].values[::batch], edges)], epochs=1)
    for point in test[labels].values:
        prediction.append(model.predict([point])[0])
    return np.array(prediction)

pred_4 = nn_mlp(test, train, model4)

My code can actually run no matter which epochs I set, but I do not know why I always kept on getting the final output as

"ValueError: Error when checking input: expected dense_9_input to have shape (9,) but got array with shape (1,)"

Upvotes: 1

Views: 753

Answers (1)

user11530462
user11530462

Reputation:

Providing the solution here (Answer Section), even though it is present in the Comment Section, for the benefit of the community.

This issue is related to shape incompatibility, please reshape from (9,) to (1, 9).

Here is the example how to reshape

import tensorflow as tf

a = tf.constant([1, 2, 3, 4, 5, 6, 7, 8, 9]) 
print(a)

b=tf.constant([[1, 2, 3, 4, 5, 6, 7, 8, 9]])
print(b)

Output:

Tensor("Const_1:0", shape=(9,), dtype=int32)
Tensor("Const_2:0", shape=(1, 9), dtype=int32)

After changing from prediction.append(model.predict([point])[0]) (i.e here shape was (9,)) to prediction.append(model.predict([[point]])[0]) (i.e here shape became (1, 9)), hence issue was resolved.

For reshape you can use tf.reshape and tf.expand_dims

Reshape using tf.reshape:

a = tf.constant([1, 2, 3, 4, 5, 6, 7, 8, 9]) 
print(a)
c=tf.reshape(a, [1, 9]) 
print(c)

Output:

Tensor("Const_3:0", shape=(9,), dtype=int32)
Tensor("Reshape_1:0", shape=(1, 9), dtype=int32)

Reshape using tf.expand_dims:

a = tf.constant([1, 2, 3, 4, 5, 6, 7, 8, 9]) 
print(a)
d=tf.expand_dims(a, 0) 
print(d)

Output:

Tensor("Const_4:0", shape=(9,), dtype=int32)
Tensor("ExpandDims_1:0", shape=(1, 9), dtype=int32)

Upvotes: 2

Related Questions