【发布时间】:2019-12-12 10:21:28
【问题描述】:
我的输入数组是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)
但是当我尝试编译它时它并不喜欢它,因为Model没有.add的选项。
有没有一种简单的方法来修改我已经拥有的东西来实现我的新目的?非常感谢任何指导。
【问题讨论】:
-
如果您更改模型结构,之前的权重将无法使用。
-
顺序模型应该可以有多个输出
-
@Frobot 见here。
-
@venkata-krishnan 您是指具有单个输出的模型的权重吗?我对保留它们不感兴趣。我想要一个有两个输出的新模型,我可以用两个指标在数据集上进行训练。
-
你有 one 输出 layer 和 two neurons,因此 Sequential API 将工作正常。另一方面,如果您的模型有多个输出/输入层(而不是神经元),那么您必须使用函数式 API。
标签: python keras deep-learning conv-neural-network loss-function