维度输入 Keras

我修改了这里找到的代码。但在我的输入中出现了维度错误,如下所示:

ValueError: 检查输入时出错:期望 InputLayer 有 4 个维度,但得到的数组形状为 (None, None)

这是我修改后的代码(我在 Colab 上运行):

#Power data classification/regression with CNNimport numpy as npimport tensorflow as tffrom tensorflow import kerasimport pandas as pdimport csv as csvimport keras.backend as Kfrom sklearn.preprocessing import MinMaxScaler # For normalizing dataprint("TensorFlow version:",tf.__version__)!wget https://raw.githubusercontent.com/sibyjackgrove/CNN-on-Wind-Power-Data/master/MISO_power_data_classification_labels.csv!wget https://raw.githubusercontent.com/sibyjackgrove/CNN-on-Wind-Power-Data/master/MISO_power_data_input.csv#Read total rows in csv file without loading into memorydef data_set_size(csv_file):    with open(csv_file) as csvfile:        csv_rows = 0        for _ in csvfile:            csv_rows += 1    return csv_rows-1            #Remove header from count and returncsv_file = "./MISO_power_data_classification_labels.csv"n_train = data_set_size(csv_file)print("Training data set size:",n_train)#Python generator to supply batches of traning data during training with loading full data set to memorydef power_data_generator(batch_size,gen_type=''):    valid_size = max(1,np.int(0.2*batch_size))    while 1:        df_input=pd.read_csv('./MISO_power_data_input.csv',usecols =['Wind_MWh','Actual_Load_MWh'],chunksize =24*(batch_size+valid_size), iterator=True)        df_target=pd.read_csv('./MISO_power_data_classification_labels.csv',usecols =['Mean Wind Power','Standard Deviation','WindShare'],chunksize =batch_size+valid_size, iterator=True)        for chunk, chunk2 in  zip(df_input,df_target):            scaler = MinMaxScaler() # Define limits for normalize data            InputX = chunk.values            InputX = scaler.fit_transform(InputX) # Normalize input data            InputY = chunk2.values            InputY = scaler.fit_transform(InputY) # Normalize output data            if gen_type =='training':                yield (InputX[0:batch_size],InputY[0:batch_size])            elif gen_type =='validation':                yield (InputX[batch_size:batch_size+valid_size],InputY[batch_size:batch_size+valid_size])#Define model using KerasYclasses = 3 #Number of output classesdef nossa_metrica(y_true, y_pred):    diff = y_true - y_pred    count = K.sum(K.cast(K.equal(diff, K.zeros_like(diff)), 'int8')) # Count how many times y_true = y_pred    return count/n_trainmodel = keras.Sequential([    tf.keras.layers.Input(shape=(2,24,1),name='InputLayer'),                        tf.keras.layers.Conv2D(filters=4,kernel_size=(2,6),strides=(1,1),activation='relu',name='ConvLayer1'),    tf.keras.layers.Conv2D(filters=4,kernel_size=(1,6),strides=(1,1),activation='relu',name='ConvLayer2'),    tf.keras.layers.Flatten(name="Flatten"),    tf.keras.layers.Dense(units = 8,activation='relu',name='FeedForward1'),    tf.keras.layers.Dense(units = Yclasses,name='OutputLayer'),])model.compile(loss='mse',optimizer='adam',verbose = 2,metrics = [nossa_metrica])model.summary()samples_per_batch = 5train_generator= power_data_generator(batch_size=samples_per_batch,gen_type='training')valid_generator= power_data_generator(batch_size=samples_per_batch,gen_type='validation')number_of_batches = np.int32(n_train/(samples_per_batch+max(1,np.int32(0.2*samples_per_batch)))) #Training startshistory = model.fit(train_generator, steps_per_epoch= number_of_batches,epochs=200,validation_data=valid_generator, validation_steps=number_of_batches,verbose=2)

如果有人能在这里提供一些帮助,我将非常感激!


回答:

tf.keras.layers.Input(shape=(2,24,1),name='InputLayer')

你指定了模型的输入,即传递给 model.fit 的第一个参数应该具有形状 (?, 2, 24, 1),但你传递的并不是这样。实际上,next(train_generator) 产生以下输出:

(array([[0.62840991, 0.36867201],        [0.68026787, 0.32275764],        [0.67140497, 0.30866827],        [0.61158515, 0.32725069],        [0.57037451, 0.41795902]]), array([[0.0301671 , 1.        , 0.00581285],        [0.        , 0.18781352, 0.        ],        [0.12077826, 0.3356642 , 0.19676627],        [0.56275038, 0.8747475 , 0.69121483],        [1.        , 0.        , 1.        ]]))

这是一个形状分别为 (5, 2)(5, 3) 的数组元组。

在你参考的笔记本中,他们通过

InputX = np.resize(InputX,(batch_size+valid_size,24,2,1))

明确设置了所需形状的输入,但这部分代码不在你的代码中。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注