Как прогнозировать, используя модель трансферного обучения?
Я использую Inception-v3 для трансферного обучения в задаче машинного обучения. Слои Inception v3 используются для создания файлов узких мест, а затем я добавил 3 полностью связанных слоя для обучения этих узких мест. Обучение прошло хорошо, но у меня возникли проблемы с предсказанием входного изображения.
Вот код генерации моей модели:
def create_inception_graph(num_batches_per_epoch, FLAGS):
modelFilePath = os.path.join(FLAGS.imagenet_inception_model_dir, INCEPTION_MODEL_GRAPH_DEF_FILE)
inceptionV3 = InceptionV3(modelFilePath)
inceptionV3.add_final_training_ops(FLAGS.num_classes, FLAGS.final_tensor_name, FLAGS.optimizer_name,
num_batches_per_epoch, FLAGS)
inceptionV3.add_evaluation_step()
return inceptionV3
def _add_fully_connected_layer(self, input_to_layer, input_size, output_size, layer_name, keep_rate):
with tf.name_scope(layer_name):
with tf.name_scope('weights'):
initial_value_weights = tf.truncated_normal([input_size, output_size], stddev=0.001)
layer_weights = tf.Variable(initial_value_weights, name='final_weights')
with tf.name_scope('biases'):
layer_biases = tf.Variable(tf.zeros([output_size]), name='final_biases')
with tf.name_scope('Wx_plus_b'):
logits_bn = tf.matmul(input_to_layer, layer_weights) + layer_biases
logits_bn = tf.nn.relu(logits_bn)
logits_bn = tf.nn.dropout(logits_bn, keep_rate)
return logits_bn
Вот функция для генерации 3-х конечных полностью связанных слоев, которые будут сохранены после начала-V3
def add_final_training_ops(self, class_count, final_tensor_name, optimizer_name, num_batches_per_epoch, FLAGS):
with self.inceptionGraph.as_default():
with tf.name_scope('input'):
self.bottleneckInput = tf.placeholder_with_default(self.bottleneckTensor,
shape=[None, BOTTLENECK_TENSOR_SIZE],
name='BottleneckInputPlaceholder')
self.groundTruthInput = tf.placeholder(tf.float32, [None, class_count], name='GroundTruthInput')
self.keep_rate = tf.placeholder(tf.float32, name='dropout_keep_rate')
self.is_training_ph = tf.placeholder(tf.bool, name='is_training_ph')
layer_name = 'final_minus_2_training_ops'
logits_final_minus_2 = self._add_fully_connected_layer(self.bottleneckInput, BOTTLENECK_TENSOR_SIZE,
FINAL_MINUS_2_LAYER_SIZE, layer_name, self.keep_rate,
self.is_training_ph, FLAGS)
layer_name = 'final_minus_1_training_ops'
logits_final_minus_1 = self._add_fully_connected_layer(logits_final_minus_2, FINAL_MINUS_2_LAYER_SIZE,
FINAL_MINUS_1_LAYER_SIZE, layer_name, self.keep_rate,
self.is_training_ph, FLAGS)
layer_name = 'final_training_ops'
with tf.name_scope(layer_name):
with tf.name_scope('weights'):
initial_value = tf.truncated_normal([FINAL_MINUS_1_LAYER_SIZE, class_count], stddev=0.001)
layer_weights = tf.Variable(initial_value, name='final_weights')
#bishwa
self.variable_summaries(layer_weights)
with tf.name_scope('biases'):
layer_biases = tf.Variable(tf.zeros([class_count]), name='final_biases')
#bishwa
self.variable_summaries(layer_biases)
with tf.name_scope('Wx_plus_b'):
logits = tf.matmul(logits_final_minus_1, layer_weights) + layer_biases
#bishwa
tf.summary.histogram('pre_activations', logits)
self.finalTensor = tf.nn.softmax(logits, name=final_tensor_name)
#bishwa
tf.summary.histogram('activations', self.finalTensor)
with tf.name_scope('cross_entropy'):
self.cross_entropy = tf.nn.softmax_cross_entropy_with_logits(labels=self.groundTruthInput,
logits=logits)
with tf.name_scope('total'):
self.cross_entropy_mean = tf.reduce_mean(self.cross_entropy)
#bishwa
tf.summary.scalar('cross_entropy', self.cross_entropy_mean)
self.global_step = tf.Variable(0, name='global_step', trainable=False)
self.create_learning_rate(FLAGS, self.global_step, num_batches_per_epoch)
with tf.name_scope('train'):
if optimizer_name == "sgd":
optimizer = tf.train.GradientDescentOptimizer(learning_rate=self.learning_rate)
elif optimizer_name == "adam":
optimizer = tf.train.AdamOptimizer(learning_rate=self.learning_rate)
elif optimizer_name == "rmsprop":
optimizer = tf.train.RMSPropOptimizer(self.learning_rate, FLAGS.rmsprop_decay,
momentum=FLAGS.rmsprop_momentum,
epsilon=FLAGS.rmsprop_epsilon)
else:
raise ValueError('Incorrect Optimizer Type...')
self.trainStep = optimizer.minimize(self.cross_entropy_mean, global_step=self.global_step)
Теперь, после обучения, сохранения модели и прогнозирования для нового изображения, я написал следующий код, но получил ошибку, путая с тем, какой тензор будет использоваться для ввода и прогнозирования.
tf.reset_default_graph()
imported_meta = tf.train.import_meta_graph("model/malignant-detection-model-.meta")
with tf.Session() as sess:
imported_meta.restore(sess, tf.train.latest_checkpoint('model/'))
print('Model restored successfully...')
logits = tf.get_default_graph().get_tensor_by_name("final_result:0")
x = tf.get_default_graph().get_tensor_by_name("input/BottleneckInputPlaceholder:0")
y = sess.run([logits], feed_dict={x:bottleneck})
print(y)
Но этот код дает мне ошибку, говоря, что я допустил ошибку в тензоре или имени операции и загрузке (299,299,3) изображения в (?,2048).
Мне очень нужна помощь в этом случае.