在 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_test
。 x_test, y_test
中包含的那些可以直接提供给 validation_data
参数。
第二题
此问题已在 中处理。检查一下,也许它可以帮助你 ;)。
我有一些数据,我尝试使用 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_test
。 x_test, y_test
中包含的那些可以直接提供给 validation_data
参数。
第二题
此问题已在