【发布时间】:2020-04-12 09:05:10
【问题描述】:
我正在处理一个自定义多位数字识别问题。我只有 1 位和 2 位数字。我正在使用一个 VGG16 模型,每个数字都有两个头,以避免有 100 个类。
模型如下所示:
input_shape = (256,96,3)
base_model = VGG16(weights='imagenet', include_top=False, input_shape = input_shape)
xo = base_model.output
x = base_model.input
flat = Flatten(name = 'flat')(xo)
h1 = Dense(1024, activation='relu', name = 'first_hidden_layer')(flat)
d1 = Dropout(0.5, name = 'first_hidden_dropout')(h1)
h2 = Dense(1024, activation='relu', name = 'second_hidden_layer')(d1)
d2 = Dropout(0.5, name = 'second_hidden_dropout')(h2)
o_digit1 = Dense(11, activation='softmax', name = 'digit1_classification')(d2)
o_digit2 = Dense(11, activation='softmax', name = 'digit2_classification')(d2)
model = Model(inputs = x, outputs = [o_digit1, o_digit2] )
opt = Adam(lr=0.0001)
model.compile(optimizer=opt,
loss='categorical_crossentropy',
metrics={'digit1_classification': 'accuracy',
'digit2_classification': 'accuracy'},
loss_weights = {'digit1_classification': 0.5,
'digit2_classification': 0.5})
我想构建一个自定义指标以传递给模型。计算实际数字精度的编译。通常,当您构建自己的度量函数时,您会将y_pred 和y_true 传递给它。
例如
def my_metric1(y_true,y_pred):
return calculations (y_true, y_pred)
我可以使用my_metric1 来单独计算我想要的每个班级的任何内容,但我想要的是计算实际的完整数字准确度。
类似的东西:
def my_metric2(y_pred1, y_true1, y_pred2, y_true2):
return calculations2(y_pred1, y_true1, y_pred2, y_true2)
这里的y_pred1, y_true1, y_pred2, y_true2 是每个数字的预测值和真实值。
我怎样才能做到这一点?
【问题讨论】:
-
是否可以只有一个输出(前两个输出的串联)并为其定义自定义指标/损失?
-
嗯..这可能是可能的。我需要弄清楚如何进行自定义损失,因为我将无法进行 categorical_crossentropy,因为如果我将两个输出存储到一个向量中,它就不会再进行一次热编码了。
-
自定义损失就像自定义指标一样,只是它必须是可区分的。
标签: tensorflow keras deep-learning conv-neural-network vgg-net