python - 连体网络停留在 50% 的准确率
问题描述
我正在尝试构建一个连体网络来进行重新识别,该网络的最终输出应该是比较的特征向量,以确定输入图像是否来自同一类。我的模型的准确率停留在 50%。我尝试了损失函数、准确性和模型层的多种变化,但似乎没有任何效果,而且我在该领域的知识阻止了我尝试另一种方法。什么可能解决这个问题?
def cnn(in_dims):
model = Sequential()
model.add(Conv2D(8,(3,3),padding='same',input_shape=(in_dims[0],in_dims[1],in_dims[2]),activation='relu',name='conv1'))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(MaxPooling2D((2,2),(2,2),padding='same',name='pool1'))
model.add(Conv2D(16,(3,3),padding='same',activation='relu',name='conv2'))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(MaxPooling2D((2,2),(2,2),padding='same',name='pool2'))
model.add(Conv2D(32,(3,3),padding='same',activation='relu',name='conv3'))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(MaxPooling2D((2,2),(2,2),padding='same',name='pool3'))
model.add(Conv2D(64,(3,3),padding='same',activation='relu',name='conv4'))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(MaxPooling2D((2,2),(2,2),padding='same',name='pool4'))
model.add(Flatten(name='flatten'))
model.add(Dense(64,name='embeddings'))
return model
def double_loss(y_true, y_pred):
total_length = y_pred.shape.as_list()[-1]
image1 = y_pred[:,0:int(total_length*1/2)]
image2 = y_pred[:,int(total_length*1/2):int(total_length*2/2)]
dist = K.sum(K.square(image1 - image2), axis=1)
return dist
def accuracy(y_true, y_pred):
return K.mean(K.equal(y_true, K.cast(y_pred < 0.5, y_true.dtype)))
input_1 = Input(shape=(128,64,3,), name='input_1')
input_2 = Input(shape=(128,64,3,), name = 'input_2')
shared = cnn([128,64,3])
encoded_image1 = shared(input_1)
encoded_image2 = shared(input_2)
merged_vector = concatenate([encoded_image1, encoded_image2], axis=-1, name='merged_layer')
model = Model(inputs=[input_1, input_2], outputs=merged_vector)
model.compile(loss=double_loss, optimizer=Adam(lr = 0.0001, beta_1 = 0.9, beta_2 = 0.999), metrics=[accuracy])
history = model.fit([X_a_train, X_b_train], y=y_train,
batch_size=128, epochs=100, validation_data=[[X_a_val, X_b_val], y_val])
解决方案
推荐阅读
- android - 如何为 Exoplayer 360 视频启用 GyroSensors
- excel - Excel VBA 运行时错误 13 与 Select Case
- angular - NGRX / RXJS:如何将可观察流递归映射到单个平面流
- azure - 如何从 Azure Monitor 导出数据以获得无限保留?
- flutter - 是否可以使用 charts_flutter 绘制带有值流的实时图表?
- python - Change label text in widget via mainwindow
- python - 如何在小部件上使用 PyQt5 显示图像?
- python - 如何将 C++ tesseract-ocr 代码转换为 Python?
- android - 在alarmmanager中点击通知后打开活动并广播Kotlin
- python - 无法将输入数组从形状 (250,500,3) 广播到形状 (0,238,3)