ValueError:检查输入时出错:预期density_9_input具有形状(9,),但数组的形状为(1,)

时间:2020-02-08 13:39:25

标签: python tensorflow machine-learning keras neural-network

首先,我将数据设置为随机化,如下所示:

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)

无论我设置了哪个纪元,我的代码实际上都可以运行, 但我不知道为什么我总是一直把最终输出作为

“ ValueError:检查输入时出错:预期density_9_input具有 形状(9,),但数组的形状为(1,)“

1 个答案:

答案 0 :(得分:2)

即使在注释部分中也提供了解决方案(答案部分),以维护社区的利益。

此问题与形状不兼容有关,请从(9,)更改为(1,9)。

这里是如何重塑的示例

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)

输出:

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

prediction.append(model.predict([point])[0])即此处形状为(9,))变为prediction.append(model.predict([[point]])[0]) ie此处形状变为(1,9)),因此问题已解决。

要进行重塑,可以使用tf.reshapetf.expand_dims

使用tf.reshape进行重塑:

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

输出:

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

使用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)

输出:

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