我的数据集具有非静态形状,例如(batch_size, None, None, None, 92)
for x in x_data:
print(x.shape)
(4, 4, 8, 92)
(3, 3, 7, 92)
(4, 4, 8, 92)
(3, 3, 7, 92)
(4, 4, 8, 92)
(4, 4, 7, 92)
(3, 3, 7, 92)
(4, 4, 8, 92)
(4, 4, 8, 92)
(3, 3, 8, 92)
但是当我尝试将此 x_data 提供给我的 X占位符时,我遇到了错误
X = tf.placeholder(tf.float32, [None, None, None, None, 92])
with tf.Session() as sess:
c, _ = sess.run([cost, optimizer], feed_dict={X: x_data, Y: y_data})
此错误可能是由于输入数据的静态形状引起的。
错误消息
Traceback (most recent call last):
File "C:/Users/bsjun/Documents/GitHub/CCpyNN/CCpyNN/Inception_v.2.py", line 274, in <module>
c, hy, _ = sess.run([cost, logit_layer, optimizer], feed_dict={X: batch_x[i], Y: batch_y[i], keep_prob: 0.8})
File "C:\Users\bsjun\AppData\Local\conda\conda\envs\tf_normal\lib\site-packages\tensorflow\python\client\session.py", line 929, in run
run_metadata_ptr)
File "C:\Users\bsjun\AppData\Local\conda\conda\envs\tf_normal\lib\site-packages\tensorflow\python\client\session.py", line 1121, in _run
np_val = np.asarray(subfeed_val, dtype=subfeed_dtype)
File "C:\Users\bsjun\AppData\Local\conda\conda\envs\tf_normal\lib\site-packages\numpy\core\numeric.py", line 501, in asarray
return array(a, dtype, copy=False, order=order)
ValueError: setting an array element with a sequence.
是否可以提供动态形状矩阵?
这是我的代码摘要。
import tensorflow as tf
import numpy as np
shapes = [(4, 4, 8, 92), (3, 3, 7, 92), (4, 4, 8, 92), (3, 3, 7, 92)]
x_data = []
for s in shapes:
x = np.zeros(shape=s)
print(x.shape)
x_data.append(x)
X = tf.placeholder(tf.float32, [None, None, None, None, 92])
with tf.Session() as sess:
sess.run(X, feed_dict={X: x_data})
答案 0 :(得分:2)
它不适用于您提供的数据,但是有一些处理方法。
为什么不起作用
行
x = tf.placeholder(tf.float32, [None, None, None, 92])
表示输入数组的形状事先未知。但是它必须是可以转换为numpy数组的对象。由于您输入的数据是一系列不同形状的numpy数组,因此不会进行转换。
如何处理
1。为模型提供单独的输入。您可能可以修改模型的代码,为其提供两个输入:
例如,在tf.nn.dynamic_rnn()中使用了这种方法,其中一个参数是实际数据,另一个是sequence_length
-每个序列的长度。
2。批次之间数据的形状不同。另一种选择是在每个批次上供给不同形状的阵列。因此,例如,您将batch_size
个形状为(4、4、8、92)的数组分组为一组,并将其输入到模型中。然后,您选取batch_size
个形状为(3、3、8、92)的数组,然后再进行一次遍历,依此类推。因此,形状在数据集中会有所不同,但在单个批次中应保持恒定。