我的输入数组是image_array
,包含 10000 张大小为 512x512、4 个通道的图像的数据。 IE。image_array.shape = (10000, 512, 512, 4)
。每张图像都有一个相关的指标,我想训练 CNN 来为我进行预测。因此metric_array.shape = (10000)
。由于我不希望网络偏向更频繁出现的指标值,因此我有一个加权数组,其中包含指标的每个值的权重。因此weightArray.shape = (10000)
.
我正在使用 Keras。这是我的顺序模型:
model = Sequential()
model.add(Conv2D(32, use_bias=True, kernel_size=(3,3), strides=(1, 1), activation='relu', input_shape=(512,512,4))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
model.add(Conv2D(64, use_bias=True, kernel_size=(3,3), strides=(1, 1), activation='relu'))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
model.add(Conv2D(128, use_bias=True, kernel_size=(3,3), strides=(1, 1), activation='relu'))
model.add(BatchNormalization())
model.add(Flatten())
model.add(Dense(32))
model.add(Activation('relu'))
model.add(BatchNormalization())
model.add(Dense(1, activation=relu_max))
我想使用均方误差损失函数和随机梯度下降优化器。我编译我的模型:
model.compile(loss='mean_squared_error', optimizer=optimizers.SGD(lr=0.01))
我将数据集分为训练和验证:
X_train, X_validate, Y_train, Y_validate, W_train, W_validate \
= train_test_split(image_array, metric_array, weightArray, test_size=0.3)
最后训练模型:
model.fit(X_train, Y_train, epochs=100, batch_size = 32, \
validation_data=(X_validate,Y_validate), sample_weight=W_train)
以上所有工作。现在,我想做的是使用 2 个指标而不是 1 个。我对每个图像都有一个 metric1 值和一个 metric2 值。 metric1 和 metric2 的每个值都有一个关联的权重。因此
metric_array1.shape = metric_array2.shape = weightArray1.shape = weightArray2.shape = (10000)
然后,我的网络将有两个输出节点,每个节点对应一个指标。
我尝试将上面的最后一层更改为:
model.add(Dense(2, activation=relu_max))
然后,我将度量和权重数据组合成一个 metric_array 和一个元组的weightArray,形状为 (10000, 2)。
这让我发现顺序模型是为单个输出而设计的,因此我应该使用函数模型。
我读过一些文档,看起来相当复杂。我尝试使用上面的模型(但最后一层有 2 个节点),然后执行
from keras.models import Model
new_model = Model(model)
但当我尝试编译它时它不喜欢它,因为模型没有选项.add
.
有没有一种简单的方法来修改我已经拥有的东西以获得我的新目的?我真的很感激任何指导。