2017-10-10 2 views
1

Je cherche un moyen d'évaluer numériquement les résultats de mon CNN unet-like.Comment évaluer numériquement les résultats d'un CNN non-like?

Le CNN est entraîné pour supprimer les artefacts des images en niveaux de gris. Par conséquent, le CNN obtient une image en niveaux de gris "9 canaux" contenant des artefacts dans chaque canal (9 images en niveaux de gris avec des données partiellement redondantes mais des artefacts différents sont concaténés -> dimensions [numTrainInputs, 512, 512, 9]). image en niveaux de gris sans artefacts [numTrainInputs, 512, 512, 1]. Le CNN est formé en utilisant MSE comme fonction de perte et Adam en tant qu'Optimizer et Keras. Jusqu'ici tout va bien. Visuellement, le CNN fournit de bons résultats par rapport à une image "vérité terrain" sans artefact -> dimensions [numTrainInputs, 512, 512, 1] mais la précision pendant l'entraînement reste à 0%. Je pense que c'est parce qu'aucune des images de résultats ne correspond parfaitement à la vérité du terrain, n'est-ce pas?! Mais comment puis-je évaluer les résultats numériquement? J'ai cherché quelques évaluations numériques dans le domaine des autoencoders, mais je n'ai pas trouvé le bon chemin. Quelqu'un peut-il me donner un indice?

Le CNN ressemble à ceci:

input_1 = Input((X_train.shape[1],X_train.shape[2], X_train.shape[3])) 

conv1 = Conv2D(16, (3,3), strides=(2,2), activation='elu', use_bias=True, padding='same')(input_1) 
conv2 = Conv2D(32, (3,3), strides=(2,2), activation='elu', use_bias=True, padding='same')(conv1) 
conv3 = Conv2D(64, (3,3), strides=(2,2), activation='elu', use_bias=True, padding='same')(conv2) 
conv4 = Conv2D(128, (3,3), strides=(2,2), activation='elu', use_bias=True, padding='same')(conv3) 
conv5 = Conv2D(256, (3,3), strides=(2,2), activation='elu', use_bias=True, padding='same')(conv4) 
conv6 = Conv2D(512, (3,3), strides=(2,2), activation='elu', use_bias=True, padding='same')(conv5) 

upconv1 = Conv2DTranspose(256, (3,3), strides=(1,1), activation='elu', use_bias=True, padding='same')(conv6) 
upconv2 = Conv2DTranspose(128, (3,3), strides=(2,2), activation='elu', use_bias=True, padding='same')(upconv1) 
upconv3 = Conv2DTranspose(64, (3,3), strides=(2,2), activation='elu', use_bias=True, padding='same')(upconv2) 
upconv3_1 = concatenate([upconv3, conv4], axis=3) 

upconv4 = Conv2DTranspose(32, (3,3), strides=(2,2), activation='elu', use_bias=True, padding='same')(upconv3_1) 
upconv4_1 = concatenate([upconv4, conv3], axis=3) 

upconv5 = Conv2DTranspose(16, (3,3), strides=(2,2), activation='elu', use_bias=True, padding='same')(upconv4_1) 
upconv5_1 = concatenate([upconv5,conv2], axis=3) 

upconv6 = Conv2DTranspose(8, (3,3), strides=(2,2), activation='elu', use_bias=True, padding='same')(upconv5_1) 
upconv6_1 = concatenate([upconv6,conv1], axis=3) 

upconv7 = Conv2DTranspose(1, (3,3), strides=(2,2), activation='linear', use_bias=True, padding='same')(upconv6_1) 

model = Model(outputs=upconv7, inputs=input_1) 



model.compile(loss='mean_squared_error', optimizer='adam', metrics=['accuracy']) 
model.fit(X_train, Y_train, batch_size=1, epochs=100, shuffle=True, validation_split=0.01, callbacks=[tbCallback]) 

Merci beaucoup pour votre aide!

Répondre

1

Vous utilisez les métriques incorrectes pour ce problème. Dans la «régression», la précision n'a pas de sens. Modifier à MSE par exemple:

model.compile(loss='mean_squared_error', optimizer='adam', metrics=['mean_squared_error'])) 
+0

Est-il judicieux d'utiliser MSE en fonction de la perte et aussi comme métrique d'erreur? N'est-ce pas dire la même chose deux fois? –

+0

En régression c'est bien. Si vous voulez une mesure différente, vous pouvez essayer SSIM pour évaluer plus à quel point l'image filtrée est similaire à l'image sans bruit. – maz