InvalidArgumentError: Вы должны передать значение для тензора-заполнителя 'Placeholder' с dtype float и shape - PullRequest
3 голосов
/ 10 апреля 2019

Я написал следующий код в моем Pycharm, который выполняет Fully Connect Layer (FCL) в Tensorflow.Заполнитель случается неверный аргумент ошибки.Поэтому я ввел все dtype, shape и name в качестве заполнителя, но я все еще получаю недопустимая ошибка аргумента .

Я хочу создать новый сигнал (1,222) - модель FCL.
входной сигнал (1, 222) => выходной сигнал (1, 222)

  • maxPredict: Найти индекс с наибольшим значением в выходном сигнале.
  • calculate Y: получить значение массива частот, соответствующее maxPredict.
  • loss: использовать разницу между истинным Y и рассчитать Y как убыток.
  • loss = tf.abs (trueY - рассчитатьY) `

Код (возникает ошибка)
x = tf.placeholder(dtype=tf.float32, shape=[1, 222], name='inputX')

ОШИБКА

InvalidArgumentError (см. Выше для отслеживания): вы должны передать значение для тензора-заполнителя 'inputX' с dtype float и shape [1,222] тензор потока.python.framework.errors_impl.InvalidArgumentError: Вы должны передать значение для тензора заполнителя 'inputX' с плавающей точкой dtype и формой [1,222] [[{{node inputX}} = Placeholderdtype = DT_FLOAT, shape = [1,222], _device = "/ job: localhost / replica:0 / задача: 0 / устройство: ЦП: 0 "]] Во время обработки вышеуказанного исключения произошло другое исключение:

Новый случай ошибки

Я изменил свой код.
x = tf.placeholder(tf.float32, [None, 222], name='inputX')

Ошибка: случай 1
tensorFreq = tf.convert_to_tensor(basicFreq, tf.float32)
newY = tf.gather(tensorFreq, maxPredict) * 60
loss = tf.abs(y - tf.Variable(newY))

ValueError:Параметр initial_value должен иметь указанную форму: Tensor ("mul: 0", shape = (?,), dtype = float32)

Ошибка: случай 2
tensorFreq = tf.convert_to_tensor(basicFreq, tf.float32)
newY = tf.gather(tensorFreq, maxPredict) * 60
loss = tf.abs(y - newY)

Traceback (последний вызов был последним): Файл "D: /PycharmProject/DetectionSignal/TEST_FCL_StackOverflow.py", строка 127, вtrainStep = opt.minimize (потеря) Файл "C: \ Users \ Heewony \ Anaconda3 \ envs \ TSFW_pycharm \ lib \ site-packages \ tenorsflow \ python \ training \ optimizer.py", строка 407, в минимизации ([str (v) для _, v в grads_and_vars], потеря)) ValueError: Градиенты не указаны ни для одной переменной, проверьте график на наличие операций, которые не поддерживают градиенты , между переменными [tf.Variable 'Variable: 0' shape= (222, 1024) dtype = float32_ref, tf.Variable 'Variable_1: 0' shape = (1024,) dtype = float32_re, ......... tf.Variable 'Variable_5: 0' shape = (222,) dtype = float32_ref] и Tensor потерь («Abs: 0», dtype = float32) .

Среда разработки

  • Платформа и распространение ОС: Windows 10 x64
  • TensorFlow установлен из: Anaconda
  • Tensorflow версия 1.12.0:
  • python 3.6.7:
  • Мобильное устройство: N / A
  • Точная команда для воспроизведения: N / A
  • Модель и память графического процессора: NVIDIA GeForce CTX 1080 Ti
  • CUDA / cuDNN: 9,0 / 7,4

Модель и функция

def Model_FCL(inputX):
    data = inputX  # input Signals

    # Fully Connected Layer 1
    flatConvh1 = tf.reshape(data, [-1, 222])
    fcW1 = tf.Variable(tf.truncated_normal(shape=[222, 1024], stddev=0.05))
    fcb1 = tf.Variable(tf.constant(0.1, shape=[1024]))
    fch1 = tf.nn.relu(tf.matmul(flatConvh1, fcW1) + fcb1)

    # Fully Connected Layer 2
    flatConvh2 = tf.reshape(fch1, [-1, 1024])
    fcW2 = tf.Variable(tf.truncated_normal(shape=[1024, 1024], stddev=0.05))
    fcb2 = tf.Variable(tf.constant(0.1, shape=[1024]))
    fch2 = tf.nn.relu(tf.matmul(flatConvh2, fcW2) + fcb2)

    # Output Layer
    fcW3 = tf.Variable(tf.truncated_normal(shape=[1024, 222], stddev=0.05))
    fcb3 = tf.Variable(tf.constant(0.1, shape=[222]))

    logits = tf.add(tf.matmul(fch2, fcW3), fcb3)
    predictY = tf.nn.softmax(logits)
    return predictY, logits

def loadMatlabData(fileName):
    contentsMat = sio.loadmat(fileName)
    dataInput = contentsMat['dataInput']
    dataLabel = contentsMat['dataLabel']

    dataSize = dataInput.shape
    dataSize = dataSize[0]
    return dataInput, dataLabel, dataSize

def getNextSignal(num, data, labels, WINDOW_SIZE, OUTPUT_SIZE):
    shuffleSignal = data[num]
    shuffleLabels = labels[num]

    # shuffleSignal = shuffleSignal.reshape(1, WINDOW_SIZE)
    # shuffleSignal = np.asarray(shuffleSignal, np.float32)
    return shuffleSignal, shuffleLabels

def getBasicFrequency():
    # basicFreq => shape(222)
    basicFreq = np.array([0.598436736688, 0.610649731314, ... 3.297508549096])
    return basicFreq

График

basicFreq = getBasicFrequency()
myGraph = tf.Graph()
with myGraph.as_default():
    # define input data & output data 입력받기 위한 placeholder
    x = tf.placeholder(dtype=tf.float32, shape=[1, 222], name='inputX') # Signal size = [1, 222]
    y = tf.placeholder(tf.float32, name='trueY') # Float value size = [1]

    print('inputzz ', x, y)
    print('Graph  ', myGraph.get_operations())
    print('TrainVariable ', tf.trainable_variables())

    predictY, logits = Model_FCL(x) # Predict Signal, size = [1, 222]
    maxPredict = tf.argmax(predictY, 1, name='maxPredict') # Find max index of Predict Signal

    tensorFreq = tf.convert_to_tensor(basicFreq, tf.float32)
    newY = tf.gather(tensorFreq, maxPredict) * 60   # Find the value that corresponds to the Freq array index
    loss = tf.abs(y - tf.Variable(newY))  # Calculate absolute (true Y - predict Y)
    opt = tf.train.AdamOptimizer(learning_rate=0.0001)
    trainStep = opt.minimize(loss)

    print('Graph  ', myGraph.get_operations())
    print('TrainVariable ', tf.trainable_variables())  

Сеанс

with tf.Session(graph=myGraph) as sess:
    sess.run(tf.global_variables_initializer())

    dataFolder = './'
    writer = tf.summary.FileWriter('./logMyGraph', sess.graph)
    startTime = datetime.datetime.now()

    numberSummary = 0
    accuracyTotalTrain = []
    for trainEpoch in range(1, 25 + 1):
        arrayTrain = []

        dataPPG, dataLabel, dataSize = loadMatlabData(dataFolder + "TestValues.mat")

        for i in range(dataSize):
            batchSignal, valueTrue = getNextSignal(i, dataPPG, dataLabel, 222, 222)
            _, lossPrint, valuePredict = sess.run([trainStep, loss, newY], feed_dict={x: batchSignal, y: valueTrue})
            print('Train ', i, ' ', valueTrue, ' - ', valuePredict, '   Loss ', lossPrint)

            arrayTrain.append(lossPrint)
            writer.add_summary(tf.Summary(value=[tf.Summary.Value(tag='Loss', simple_value=float(lossPrint))]),
                               numberSummary)
            numberSummary += 1
        accuracyTotalTrain.append(np.mean(arrayTrain))
    print('Final Train : ', accuracyTotalTrain)

    sess.close()    

Ответы [ 2 ]

0 голосов
/ 10 апреля 2019

Должны быть две вещи, которые нужно изменить.

Ошибка: случай 0. Вам не нужно менять форму потока между слоями. Вы можете использовать None в первом измерении, чтобы передать динамический размер пакета.

Ошибка: случай 1. Вы можете напрямую использовать свой newY в качестве выхода NN. Вы используете только tf.Variable для определения веса или смещения.

Ошибка: случай 2. И кажется, что тензорный поток не имеет реализации градиентного спуска ни для tf.abs(), ни tf.gather(). При наличии проблемы регрессии среднеквадратичная ошибка часто оказывается достаточной.

Здесь я переписываю ваш код. У меня нет вашей части matlab, поэтому я не могу отладить ваш интерфейс python / matlab:

Модель:

def Model_FCL(inputX):
    # Fully Connected Layer 1
    fcW1 = tf.get_variable('w1', shape=[222, 1024], initializer=tf.initializer.truncated_normal())
    fcb1 = tf.get_variable('b1', shape=[222], initializer=tf.initializer.truncated_normal())
    # fcb1 = tf.get_variable('b1', shape=[None, 222], trainable=False, initializer=tf.constant_initializer(valueThatYouWant)) # if you want to fix your bias constant
    fch1 = tf.nn.relu(tf.matmul(inputX, fcW1) + fcb1, name='relu1')

    # Fully Connected Layer 2
    fcW2 = tf.get_variable('w2', shape=[1024, 1024], initializer=tf.initializer.truncated_normal())
    fcb2 = tf.get_variable('b2', shape=[222], initializer=tf.initializer.truncated_normal())
    # fcb2 = tf.get_variable('b2', shape=[None, 222], trainable=False, initializer=tf.constant_initializer(valueThatYouWant)) # if you want to fix your bias constant
    fch2 = tf.nn.relu(tf.matmul(fch1, fcW2) + fcb2, name='relu2')

    # Output Layer
    fcW3 = tf.get_variable('w3', shape=[1024, 222], initializer=tf.initializer.truncated_normal())
    fcb3 = tf.get_variable('b3', shape=[222], initializer=tf.initializer.truncated_normal())
    # fcb2 = tf.get_variable('b2', shape=[None, 222], trainable=False, initializer=tf.constant_initializer(valueThatYouWant)) # if you want to fix your bias constant
    logits = tf.add(tf.matmul(fch2, fcW3), fcb3)

    predictY = tf.nn.softmax(logits)  #I'm not sure that it will learn if you do softmax then abs/MSE
    return predictY, logits

График:

with myGraph.as_default():
    # define input data & output data 입력받기 위한 placeholder
    # put None(dynamic batch size) not -1 at the first dimension so that you can change your batch size
    x = tf.placeholder(tf.float32, shape=[None, 222], name='inputX')  # Signal size = [1, 222]
    y = tf.placeholder(tf.float32, shape=[None], name='trueY')  # Float value size = [1]

    ...

    predictY, logits = Model_FCL(x)  # Predict Signal, size = [1, 222]
    maxPredict = tf.argmax(predictY, 1, name='maxPredict')  # Find max index of Predict Signal

    tensorFreq = tf.convert_to_tensor(basicFreq, tf.float32)
    newY = tf.gather(tensorFreq, maxPredict) * 60   # Find the value that corresponds to the Freq array index

    loss = tf.losses.mean_squared_error(labels=y, predictions=newY)  # maybe use MSE for regression problem
    # loss = tf.abs(y - newY)  # Calculate absolute (true Y - predict Y) #tensorflow doesn't have gradient descent implementation for tf.abs
    opt = tf.train.AdamOptimizer(learning_rate=0.0001)
    trainStep = opt.minimize(loss)
0 голосов
/ 10 апреля 2019

Кажется, что переменная batchSignal имеет неправильный тип или форму. Это должен быть просто массив формы [1, 222]. Если вы хотите использовать пакет примеров размером n × 222, заполнитель x должен иметь форму [None, 222] и заполнитель y shape [None].

Кстати, рассмотрите возможность использования tf.layers.dense вместо явной инициализации переменных и реализации слоев самостоятельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...