Tensorflow - softmax,具有不同尺寸的数据

时间:2017-08-29 10:06:37

标签: python numpy tensorflow

我正在建立一个神经网络模型,其数据矩阵具有相同数量的列(特征)但行数不同,因此训练标签的大小也各不相同。我使用带有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

1 个答案:

答案 0 :(得分:0)

您的输入数据似乎是一个序列,您的输出数据是一个包含与输入序列中的元素一样多的元素的序列。

  

我的问题是,如何将数据提供给feed_dict?由于data = np.array([data1,data2])

您收到错误,因为data_2的第二维小于data_1的第二维。您可以使用零填充data_2label_2,使其形状分别与data_1label_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.])

话虽如此,您提出的网络架构(前馈神经网络)并不适合于序列。我建议你看一下递归神经网络和/或卷积神经网络。实现将类似,因为您还需要填充。