pycharm 无效参数错误:您必须使用dtype float和shape为占位符Tensor“Placeholder”输入一个值

c0vxltue  于 2022-11-08  发布在  PyCharm
关注(0)|答案(3)|浏览(223)

我已经在我的Pycharm中编写了以下代码,它在Tensorflow中执行完全连接层(FCL)。占位符发生了无效参数错误。因此我在占位符中输入了所有dtypeshapename,但仍然得到无效参数错误
我想通过FCL模型制作新的Signal(1,222)。
输入信号(1,222)=〉输出信号(1,222)

  • maxPredict:查找输出信号中具有最高值的索引。
  • calculate Y:获取maxPredict对应的频率数组值。
  • loss:使用真实Y和计算Y之间的差值作为损失。
  • loss = tf.绝对值(真Y-计算Y)′
    代码(发生错误)

x = tf.placeholder(dtype=tf.float32, shape=[1, 222], name='inputX')

错误
**InvalidArgumentError(请参阅上文的回溯):您必须使用dtype float和shape [1,222]**tensorflow.python.framework.errors_impl.InvalidArgumentError为占位符Tensor'inputX'输入一个值:您必须为占位符Tensor'inputX'输入一个值,其dtype为浮点,shape为[1,222] {{node inputX}} =占位符dtype =DT_FLOAT,shape=[1,222],_device="/job:localhost/replica:0/task:0/device:CPU: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))

值错误:initial_value必须具有指定的形状:Tensor(“mul:0”,形状=(?,),数据类型=浮点32)
错误案例2

tensorFreq = tf.convert_to_tensor(basicFreq, tf.float32)
newY = tf.gather(tensorFreq, maxPredict) * 60
loss = tf.abs(y - newY)
回溯(最近的呼叫排在最后):文件“D:/PycharmProject/检测信号/TEST_FCL_StackOverflow.py”,第127行,在trainStep =选项最小化(丢失)文件“C:\用户\Heewony\Anaconda 3\envs\TSFW_pycharm\lib\站点包\tensorflow \python\培训\优化器. py”,第407行,在最小化([str(v)for _,v in grads_and_vars],丢失))中值错误:没有为任何变量提供梯度,请检查图形中是否存在不支持梯度的操作,在变量之间[tf.变量'变量:0'形状=(222,1024)dtype=float32_ref,tf.变量'变量_1:0'形状=(1024,)dtype=float32_re,......... tf.变量'变量_5:0'形状=(222,)dtype=float32_ref]和损失Tensor(“绝对值:0”,dtype= float 32)

开发环境

  • 操作系统平台和分发:Windows 10 x64操作系统
  • TensorFlow安装自:水蟒
  • tensorflow 版本1.12.0:
  • Python 3.6.7:
  • 移动的设备:不适用
  • 要重现的确切命令:不适用
  • GPU型号和内存:NVIDIA ® GeForce ®凌志™ CTX 1080钛处理器
  • 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()
axkjgtzd

axkjgtzd1#

看起来变量batchSignal的类型或形状是错误的。它必须是形状正好为[1, 222]的numpy数组。如果要使用一批大小为 n × 222的示例,占位符x的形状应为[None, 222],占位符y的形状应为[None]
顺便说一下,考虑使用tf.layers.dense,而不是显式初始化变量并自己实现层。

gdrx4gfi

gdrx4gfi2#

应该有两件事要改变。

**错误案例0。**您不需要在层之间重新调整流的形状。您可以在第一个维使用None来传递动态批大小。
**错误案例1。**您可以直接使用newY作为NN的输出。您只能使用tf.Variable来定义权重或偏差。
**错误案例2。**而且似乎tensorflow对于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)
33qvvth1

33qvvth13#

如果即使按照错误消息的建议输入了正确的numpy形状并保持了正确的dtype(np.int32或np.float32),仍然出现相同的错误,则以下代码应该可以解决您的问题:


# this code will print the list of placeholders and other variables declared in the memory which is causing your error

[n.name for n in tf.get_default_graph().as_graph_def().node] 

# it will reset your declared placeholders so you can start over

tf.reset_default_graph()

这个问题也可以通过在每次调试时重复重启内核来解决,但这是不可行的。

相关问题