我正在建立一个神经网络模型,其数据矩阵具有相同数量的列(特征)但行数不同,因此训练标签的大小也各不相同。我使用带有logit的交叉熵作为损失函数。
例如,我有这样的数据:
data1 = np.array([[0.1,0.2,0.3],[0.2,0.3,0.4],[0.3,0.4,0.5]])
data2 = np.array([[0.2,0.3,0.4],[0.3,0.4,0.5]])
label_1 = np.array([0,0,1])
label_2 = np.array([1,0])
所以我们有一个维度(3x1)和偏差b的权重向量,我们的损失函数是:
loss = -1*(log(label_1*softmax(data1*weight+b)) + log(label_2*softmax(data2*weight+b)))
在Tensorflow中,我知道我可以使用None维度定义占位符,如:
tf_data = tf.placeholder(tf.float32, shape=(batch_size, None, feature_size))
tf_labels = tf.placeholder(tf.float32, shape=(batch_size, None))
我的问题是,如何将数据提供给feed_dict
?由于data = np.array([data1,data2])
返回一个存储两个numpy数组的numpy数组,因此导致:
ValueError: setting an array element with a sequence
另外,我可以使用什么张量流函数来计算data*weight? tf.matmul(data,weight)
结果的形状必须是2级,但是'MatMul'的等级3
答案 0 :(得分:0)
您的输入数据似乎是一个序列,您的输出数据是一个包含与输入序列中的元素一样多的元素的序列。
我的问题是,如何将数据提供给feed_dict?由于data = np.array([data1,data2])
您收到错误,因为data_2
的第二维小于data_1
的第二维。您可以使用零填充data_2
和label_2
,使其形状分别与data_1
和label_1
相同。
此外,您应该定义一个遮罩占位符,以确保label_2
的填充部分未包含在损失函数的计算中。
所以我们有一个维度(3x1)的权重向量
这不起作用。你的体重矢量应该有(input_dim, output_dim)
形状。在这种情况下,您似乎有二维输入,第二个维度变化。对于此尺寸,您应该采用最大可能的序列长度(因为您将较小的输入填充到此值)。输出维度也将是最大序列长度。假设这是4
,那么W的形状应为:(3, 4, 4)
,b
的形状应为(4,)
。
另外,我可以使用什么张量流函数来计算数据*权重? tf.matmul(数据,权重)结果形状必须是等级2,但是'MatMul'的等级3
tf.matmul
是正确的。当数据具有形状(batch_size, 3, 4)
且权重具有形状(3, 4, 4)
时。结果将具有(batch_size, 4)
形状。
这是您的代码的更新版本(同样假设最大序列长度为4
):
data1 = np.array([[0.1,0.2,0.3],[0.2,0.3,0.4],[0.3,0.4,0.5]])
data2 = np.array([[0.2,0.3,0.4],[0.3,0.4,0.5]])
data1_padded = np.concatenate([data1, np.zeros(shape=(1,3), dtype=np.float32)], 0)
data2_padded = np.concatenate([data2, np.zeros(shape=(2,3), dtype=np.float32)], 0)
label_1 = np.array([0,0,1.])
label_1_padded = np.concatenate([label_1, np.zeros(shape=(1), dtype=np.float32)], 0)
label_2 = np.array([1.,0])
label_2_padded = np.concatenate([label_2, np.zeros(shape=(2), dtype=np.float32)], 0)
mask_1 = np.array([1., 1., 0., 0.])
mask_2 = np.array([1., 1., 1., 0.])
话虽如此,您提出的网络架构(前馈神经网络)并不适合于序列。我建议你看一下递归神经网络和/或卷积神经网络。实现将类似,因为您还需要填充。