Выполнение логического вывода в сети InceptionV3 дважды дает совершенно разные результаты - PullRequest
1 голос
/ 25 января 2020

Когда я вычисляю начальный балл, большую часть времени я получаю NaN.

Пытаясь выяснить, почему это происходит, я обнаружил, что запуск сети дважды на одних и тех же изображениях может привести к тому, что некоторые изображения будут совершенно разными результаты (разница больше 0,9, в то время как максимальная разница может быть 1), изображения, получившие высокую разницу, менялись от запуска к запуску.

Мой GPU - 2080ti, я использую Ubuntu с tenorflow = 1.13.1. я пытаюсь изменить драйверы, версию tenorflow, запустить форму docker, одна и та же проблема возникает постоянно.

У меня есть другой сервер в университете с тем же графическим процессором (2080ti), и когда я пытаюсь бежать туда проблема исчезнет.

Спасибо за помощь.

мой скрипт

# Code derived from tensorflow/tensorflow/models/image/imagenet/classify_image.py
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import os.path
import tarfile

import numpy as np
from six.moves import urllib
import tensorflow as tf
import sys
import warnings
from scipy import linalg

MODEL_DIR = '/tmp/imagenet'
DATA_URL = 'http://download.tensorflow.org/models/image/imagenet/inception-2015-12-05.tgz'
softmax = None
pool3 = None

# Call this function with list of images. Each of elements should be a
# numpy array with values ranging from 0 to 255.
def get_features(images):
   assert ((images.shape[3]) == 3)
   assert (np.max(images) > 10)
   assert (np.min(images) >= 0.0)
   images = images.astype(np.float32)
   bs = 100
   sess = tf.get_default_session()
   preds = []
   for inp in np.array_split(images, round(images.shape[0] / bs)):
       sys.stdout.write(".")
       sys.stdout.flush()
       pred = sess.run(softmax, {'InputTensor:0': inp})
       preds.append(pred)
   preds = np.concatenate(preds, 0)
   return preds




# This function is called automatically.
def _init_inception():
   global softmax
   global pool3
   if not os.path.exists(MODEL_DIR):
       os.makedirs(MODEL_DIR)
   filename = DATA_URL.split('/')[-1]
   filepath = os.path.join(MODEL_DIR, filename)
   if not os.path.exists(filepath):
       def _progress(count, block_size, total_size):
           sys.stdout.write('\r>> Downloading %s %.1f%%' % (
               filename, float(count * block_size) / float(total_size) * 100.0))
           sys.stdout.flush()

       filepath, _ = urllib.request.urlretrieve(DATA_URL, filepath, _progress)
       print()
       statinfo = os.stat(filepath)
       print('Succesfully downloaded', filename, statinfo.st_size, 'bytes.')
   tarfile.open(filepath, 'r:gz').extractall(MODEL_DIR)
   with tf.gfile.GFile(os.path.join(
           MODEL_DIR, 'classify_image_graph_def.pb'), 'rb') as f:
       graph_def = tf.GraphDef()
       graph_def.ParseFromString(f.read())
       # Import model with a modification in the input tensor to accept arbitrary
       # batch size.
       input_tensor = tf.placeholder(tf.float32, shape=[None, None, None, 3],
                                     name='InputTensor')
       _ = tf.import_graph_def(graph_def, name='inception_v3',
                               input_map={'ExpandDims:0': input_tensor})
   # Works with an arbitrary minibatch size.
   pool3 = tf.get_default_graph().get_tensor_by_name('inception_v3/pool_3:0')
   ops = pool3.graph.get_operations()
   for op_idx, op in enumerate(ops):
       if 'inception_v3' in op.name:
           for o in op.outputs:
               shape = o.get_shape()
               shape = [s.value for s in shape]
               new_shape = []
               for j, s in enumerate(shape):
                   if s == 1 and j == 0:
                       new_shape.append(None)
                   else:
                       new_shape.append(s)
               o.set_shape(tf.TensorShape(new_shape))
   w = tf.get_default_graph().get_operation_by_name("inception_v3/softmax/logits/MatMul").inputs[1]
   logits = tf.matmul(tf.squeeze(pool3, [1, 2]), w)
   softmax = tf.nn.softmax(logits)

_init_inception()
if __name__ =='__main__':
   (x_train, y_train), (x_test, y_test) = tf.keras.datasets.cifar10.load_data()
   with tf.Session() as sess:
       preds1 = get_features(x_train)
       preds2 = get_features(x_train)
       print(abs(preds1-preds2).max())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...