Запустите тензор потока на тестовом наборе с обучающим конвейером tf.data и без заполнителей на графике - PullRequest
0 голосов
/ 14 октября 2019

Я создал свою модель тензорного потока (r1.14) с использованием конвейера tf.data. Я успешно тренировался и спас свою модель. Чего я не могу понять, так это как протестировать импортированный график на тестовом наборе, так как в моем обучающем коде изначально нет заполнителей (так как они не требуются ни в одном конвейере tf.data)

Iпросматривал везде онлайн, но все они описывают процесс тестирования данных, в которых обучающий код изначально содержит заполнители. Ниже приведен мой тестовый код для импорта набора данных

list_ds = tf.data.Dataset.list_files(train_dir)
training_dataset = list_ds.map(process_path, num_parallel_calls=8)

batched_training_dataset = training_dataset.shuffle(buffer_size=300).batch(minibatch_size).prefetch(1)
iterator = tf.data.Iterator.from_structure(batched_training_dataset.output_types,batched_training_dataset.output_shapes)

training_init_op = iterator.make_initializer(batched_training_dataset)
next_element = iterator.get_next()
data = next_element     
X = data[0]
Y = data[1]

(обратите внимание, что путь_процесса можно рассматривать как черный ящик со всеми моими операциями предварительной обработки)

Ниже приведен код модели:

def initialize_variables():
    with tf.variable_scope('model',reuse=tf.AUTO_REUSE):
        #W1 is filter for first cnn layer. shape is (height,width,in_channel,out_channel)
        W1 = tf.get_variable('W1',shape=[4,4,3,16],initializer=tf.contrib.layers.xavier_initializer())
        W2 = tf.get_variable('W2',shape=[3,3,16,32],initializer= tf.contrib.layers.xavier_initializer())
        W3 = tf.get_variable('W3',shape=[3,3,32,16],initializer= tf.contrib.layers.xavier_initializer())
        parameters = {'W1':W1, 'W2':W2,'W3':W3}
    return parameters


def forward_prop(X,parameters, is_train=True):
    '''Arguments:
               X of shape (num_featues,batch_size)
  tf.reset_default_graph()              parameters-- dictionary of parameters
      Returns:
      logits-- without calculating activation function on the last layer as the cost function doesn't need it. 
    '''
     #Z = tf.nn.conv2d(input,Weights,strides=[1,stride_y,stride_x,1],padding='VALID')
    #tf.nn.max_pool(x, ksize=[1, filter_height, filter_width, 1],strides = [1, stride_y, stride_x, 1],padding = padding, name = name)

    W1 = parameters['W1']
    W2 = parameters['W2']
    W3 = parameters['W3']


    Z1 = tf.nn.conv2d(X,W1,strides=[1,1,1,1],padding='VALID')
    A1 = tf.nn.relu(Z1)
    P1 = tf.nn.max_pool(A1,ksize=[1,3,3,1],strides=[1,2,2,1],padding='VALID') 

    Z2 = tf.nn.conv2d(P1,W2, strides=[1,1,1,1],padding='VALID')
    A2 = tf.nn.relu(Z2)
    P2 = tf.nn.max_pool(A2,ksize=[1,3,3,1],strides=[1,2,2,1],padding='VALID') 

    Z3 = tf.nn.conv2d(P2,W3, strides=[1,1,1,1],padding='VALID')
    A3 = tf.nn.relu(Z3)
    P3 = tf.nn.max_pool(A3,ksize=[1,3,3,1],strides=[1,2,2,1],padding='VALID') 

    f1 = tf.contrib.layers.flatten(P3)
    logits = tf.contrib.layers.fully_connected(f1,5,activation_fn=None)
    return logits


def compute_cost(Z,Y):
    logits = tf.transpose(Z)
    labels = tf.transpose(Y)

    cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(logits=logits,labels = labels))
    return cost

Я написал это до сих пор, который работает нормально, но я не могу понять, что добавить в sess.run (), чтобы фактически начать тестирование:

def test_model(test_dir):
    g = tf.Graph()
    with tf.Session(graph = g, config=tf.ConfigProto(allow_soft_placement=True, log_device_placement=True)) as sess:
      with tf.device('/gpu:0'):
          saver = tf.train.import_meta_graph(weight_dir+'model_parameters.meta')
          saver.restore(sess, tf.train.latest_checkpoint(weight_dir))

          print("Model restored.")

          list_ds = tf.data.Dataset.list_files(test_dir)
          print(g.get_operations())

          test_dataset = list_ds.map(process_path, num_parallel_calls=8)
          for data in test_dataset:
              X = data[0]
              Y = data[1]
              #put sess.run here
...