训练后测试一个tensorflow cnn模型

2024-04-29 11:47:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我创建了一个卷积神经网络的模型,我实现了训练,现在我必须创建一个函数来在测试模式下运行模型,但是我不知道我该怎么做。在

所有的数据集,都没有按照测试的模式进行数据集测试。在

我可以用与训练数据集相同的方式加载测试数据集,但这样我就不知道如何在已经训练好的模型上进行测试。在

这是模型函数

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

这是主程序

^{pr2}$

非常感谢你的帮助和你的时间。在

编辑:我解决了这个问题

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)))

Tags: namelogtruesizeiftfwithdense
2条回答

我解决了这个问题:

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)))

你可以用和模特训练一样的方法来做。独立分批次进行准确度和损失计算。假设测试集长度可被批大小整除:

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)

相关问题 更多 >