Я создал свою модель тензорного потока (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