在 Keras.model.fit 中输入什么作为 Y 以及如何将不同维度的数据批次拟合到 Keras 模型?

What to input in Keras.model.fit as Y and how do I fit different dimensions batches of data to Keras model?

我有一些数据,我尝试使用 Keras 模型处理这些数据。 TLDR

1. model.fit()中第二个参数的作用是什么,validation_data[的作用是什么=52=]参数?我将我的 ground_truth 放在 y 中,但我没有任何东西可以放在 validation_data 中,这导致无法使用 回调 参数

2. 如何对以下数据结构使用批处理?

我的数据由成对的 numpy 数组组成:

  • training_data,形状(x,128)
  • ground_truth(概率得分),形状(x,)

其中 x 在 3000-35000 之间的差异取决于文件,但对于两个数组都是相同的。

由于之前的研究发现卷积模型最适合我的目的,我创建了一个模型,输入 (128,128,1) 并为每个提到的 x 返回单个概率分数

model = keras.Sequential()
model.add(layers.Convolution2D(16, (3, 3),padding='valid',input_shape=(128, 128, 1),strides=2,kernel_initializer='glorot_normal',kernel_regularizer=l2(reg_amount),bias_regularizer=l2(reg_amount)))
model.add(layers.Activation('relu'))
model.add(BatchNormalization())
       #Some other layers
model.add(layers.Dense(1,kernel_initializer='glorot_normal',kernel_regularizer=l2(reg_amount),bias_regularizer=l2(reg_amount)))
model.add(layers.Activation('linear'))

model.build()
model.summary()

optimizer = keras.optimizers.SGD(learning_rate=1e-3)
loss_fn = keras.losses.SparseCategoricalCrossentropy(from_logits=True)
model.compile(loss='msle', optimizer=sgd)

然后我尝试拟合这个模型,但我无法使用批处理来完成。我将 training_data 作为第一个参数,将 ground_truth 作为第二个参数:

    spec_file = np.load ('data.npy')              
    anno_file = np.load ('ground_truth.npy')

    hist = model.fit(spec_file, anno_file,batch_size=128,verbose=0,)

我收到以下错误消息:

ValueError: Data cardinality is ambiguous: x sizes: 128 y sizes: 9801 Make sure all arrays contain the same number of samples.

我试过交换维度,转置但错误信息是一样的。

我使用 for 循环解决了这个问题,只从每个数组中提取一批,得到 (128,128) 和 (,128) 形状,它使拟合函数起作用:

for n in range (0,(np.shape(anno_file[0])-128),1):
        mel_spect = np.array(spec_file[0:128,n:n+128])      #(128,128)
        mel_spect = mel_spect[np.newaxis, ...]              #(1,128,128)

        ground_truth = np.array(anno_file[n:n+128])         #(128,)
        ground_truth = ground_truth[np.newaxis, ... ]       #(1,128,)

        hist = model.fit(mel_spect, ground_truth, verbose=0 ) 
        losses.append(hist.history['loss'] )

所以基本上我对每个分析文件都拟合了这个模型数千次,我觉得这是不对的。我应该可以分批推送这些数据,但我不知道怎么做。我也觉得我对fit()函数的理解是错误的。

请告知您如何将这些数据放入 keras 中,因为经过几天的尝试我完全不知道。非常感谢。

第一个问题

如果我正确理解了你的第一个问题,我认为你混淆了训练 ground-truth 和验证数据。

model.fit() 中的第二个参数用于指定 训练 ground-truth,正如您提到的,对于您的 train 数据。该集合必须与您在 x 参数中指定的集合一致。来自 Keras documentation:

y: Target data. Like the input data x, it could be either Numpy array(s) or TensorFlow tensor(s). It should be consistent with x

validation_data参数指的是完全不同的东西。在这里,您从整个数据(和相应的标签)中指定一个 sub-set,它将仅用于计算每个时期获得的训练指标。

也许举个例子更容易理解。假设您正在尝试对猫和狗的图像进行分类。每个图像只能包含一只狗或一只猫,因此它的图像标签可以是一个简单的整数:0 代表狗,1 代表猫。这里,x指的是图像,y指的是整数标签。

如果你想使用 validation_data 参数,你需要做一个先前的拆分(参见 sklearn 模块的 train_test_split 方法),指定 train-test 比率。结果,您收到一个包含 4 个值的元组:x_train, x_test, y_train, y_testx_test, y_test 中包含的那些可以直接提供给 validation_data 参数。

第二题

此问题已在 中处理。检查一下,也许它可以帮助你 ;)。