Test a tensorflow cnn model after the training

2019-09-21 20:10发布

I created a model of a convolutional neural network, I implemented the training and now I have to create a function to run the model in test mode but I have no idea how I could do it.

Ho due dataset, uno per l'allenamento e uno per il test quindi dovrei trovare un modo per testare il modello nel dataset di test.

I could load the test dataset in the same way as the training dataset but then I would not know how to do the test on the model already trained.

This is the model function

import tensorflow as tf

def cnn_model_fn(X, MODE, log=False):

    # INPUT LAYER
    with tf.name_scope('input_layer') as scope:
        input_layer = tf.reshape(X, [-1, 1000, 48, 1])

    # CONVOLUTIONAL LAYER #1
    with tf.name_scope('Conv1') as scope:
        conv1 = tf.layers.conv2d(
            inputs=input_layer,
            filters=4,
            kernel_size=[10, 10],
            strides=(2, 2),
            padding="valid",
        )
        if log==True:
            print('[LOG:conv1]: ' + str(conv1.shape))

        # apply the relu function
        conv1_relu = tf.nn.relu(conv1)
        if log==True:
            print('[LOG:conv1_relu]: ' + str(conv1_relu.shape))

    # POOLING LAYER #1
    with tf.name_scope('Pool1'):
        pool1 = tf.layers.max_pooling2d(
            inputs=conv1_relu,
            pool_size=[2, 2],
            strides=2
        )
        if log==True:
            print('[LOG:pool1]: ' + str(pool1.shape))

    # CONVOLUTIONAL LAYER #2
    with tf.name_scope('Conv2'):
        conv2 = tf.layers.conv2d(
            inputs=pool1,
            filters=64,
            kernel_size=[5, 5],
            padding="same",
        )
        if log==True:
            print('[LOG:conv2]: ' + str(conv2.shape))

        # apply the relu function
        conv2_relu = tf.nn.relu(conv2)
        if log==True:
            print('[LOG:conv2_relu]: ' + str(conv2_relu.shape))


    # POOLING LAYER #2
    with tf.name_scope('Pool2'):
        pool2 = tf.layers.max_pooling2d(
            inputs=conv2_relu,
            pool_size=[2, 2],
            strides=2
        )
        if log==True:
            print('[LOG:pool2]: ' + str(pool2.shape))

        # create a variable with the pool2 size because I need it to calculate the pool2_flat size
        x = tf.TensorShape.as_list(pool2.shape)

    # REDENSIFY POOL2 TO REDUCE COMPUTATIONAL LOAD
    with tf.name_scope('Reshape'):
        pool2_flat = tf.reshape(pool2, [-1, x[1] * x[2] * x[3]])
        if log==True:
            print('[LOG:pool2_flat]: ' + str(pool2_flat.shape))

    # DENSE LAYER
    with tf.name_scope('Dense_layer'):
        dense = tf.layers.dense(
            inputs=pool2_flat,
            units=1024,
        )
        if log==True:
            print('[LOG:dense]: ' + str(dense.shape))

        # apply the relu function
        dense_relu = tf.nn.relu(dense)
        if log==True:
            print('[LOG:dense_relu]: ' + str(dense_relu.shape))

    # add the dropout function
    with tf.name_scope('Dropout'):
        dropout = tf.layers.dropout(
            inputs=dense_relu,
            rate=0.4,
            training=MODE == tf.estimator.ModeKeys.TRAIN
        )
        if log==True:
            print('[LOG:dropout]: ' + str(dropout.shape))

    # LOGIT LAYER
    with tf.name_scope('Logit_layer'):
        logits = tf.layers.dense(
            inputs=dropout,
            units=2
        )
        if log==True:
            print('[LOG:logits]: ' + str(logits.shape))

    return logits

And this is the main program

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function


# IMPORTS
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
import os
import sys
from tqdm import tqdm
import load_dataset
import datetime
import time
get_images = load_dataset.get_images
next_batch = load_dataset.next_batch

import cnn_model_fn
cnn_model_fn = cnn_model_fn.cnn_model_fn

os.system('clear')

local_path = os.getcwd()
save_path = local_path + '/.Checkpoints/model.ckpt'
TensorBoard_path = local_path + "/.TensorBoard"
dataset_path = local_path + '/DATASET/'

#Training Parameters
learning_rate = 0.001
batch_size = 5
epochs = 2

MODE = 'TRAIN'

len_X, X, Y = get_images(
    files_path=dataset_path,
    img_size_h=1000,
    img_size_w=48,
    mode='TRAIN',
    randomize=True
)

X_batch, Y_batch = next_batch(
    total=len_X,
    images=X,
    labels=Y,
    batch_size=batch_size,
    index=0
)

logits = cnn_model_fn(X_batch, MODE)
prediction = tf.nn.softmax(logits)
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(logits=logits, labels=Y_batch))
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate)
train_op = optimizer.minimize(loss)
correct_predict = tf.equal(tf.argmax(prediction, 1), tf.argmax(Y_batch, 1))
accuracy = tf.reduce_mean(tf.cast(correct_predict, tf.float32))

init = tf.global_variables_initializer()
best_acc=0

with tf.Session() as sess:

    sess.run(init)
    saver = tf.train.Saver()

    if MODE == 'TRAIN':
        os.system('clear')
        print("TRAINING MODE")
        print('\n[epoch, iter]\t\tAccuracy\tProgress\tTime')

        for step in range(1, epochs+1):
            for i in range(0, int(len_X/batch_size)+1):
                t0 = time.time()

                X_batch, Y_batch = next_batch(
                    total=len_X,
                    images=X,
                    labels=Y,
                    batch_size=batch_size,
                    index=i
                )

                sess.run(train_op)
                los, acc= sess.run([loss, accuracy])

                t1 = time.time()
                t = t1-t0

                check = '[ ]'
                if acc >= best_acc:
                    check = '[X]'
                    best_acc = acc
                    print('[e:' + str(step) + ', i:' + str(i) + ']\t\t' + '%.4f' % acc + '\t\t' + check + '\t\t' + '%.3f' % t + 's')
                    saver.save(sess,save_path)
                else:
                    print('[e:' + str(step) + ', i:' + str(i) + ']\t\t' + '%.4f' % acc + '\t\t' + check + '\t\t' + '%.3f' % t + 's')

        writer = tf.summary.FileWriter(TensorBoard_path, sess.graph)

    elif MODE=='TEST':
        os.system('clear')
        print("TESTING MODE")
        saver.restore(sess, save_path)
        # here I need to test the model 


sess.close()

Thank you so much for your help and your time.

EDIT: I solved doing this

saver.restore(sess, save_path)
print("Initialization Complete")

len_X_test, X_test, Y_test = get_images(
    files_path=dataset_path,
    img_size_h=img_size_h,
    img_size_w=img_size_w,
    mode='TEST',
    randomize=True
)

train_feed = {x: X_test, y: Y_test}

print("Testing Accuracy:"+str(sess.run(accuracy, feed_dict=train_feed)))

2条回答
forever°为你锁心
2楼-- · 2019-09-21 21:01

I solved doing this:

saver.restore(sess, save_path)
print("Initialization Complete")

len_X_test, X_test, Y_test = get_images(
    files_path=dataset_path,
    img_size_h=img_size_h,
    img_size_w=img_size_w,
    mode='TEST',
    randomize=True
)

train_feed = {x: X_test, y: Y_test}

# test the model
print("Testing Accuracy:"+str(sess.run(accuracy, feed_dict=train_feed)))
查看更多
神经病院院长
3楼-- · 2019-09-21 21:04

You can do it in the same way as model training. Split the test into batches and compute loss and accuracy for each batch independently. Assuming the test set length is divisible by the batch size:

accuracies = []
losses = []
for i in range(0, len_X // batch_size + 1:
    X_batch, Y_batch = next_batch(
         total=len_X,
         images=X,
         labels=Y,
         batch_size=batch_size,
         index=i
    )

    los, acc= sess.run([loss, accuracy])
    accuracies.append(acc)
    losses.append(loss)
test_acc = np.mean(accuracies)
test_loss = np.mean(losses)
查看更多
登录 后发表回答