首先,我将数据设置为随机化,如下所示:
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,)“
答案 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.reshape
和tf.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)