首页 文章

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

提问于
浏览
1

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

另外,我可以用什么tensorflow函数计算 data*weight? tf.matmul(data,weight) 结果的形状必须是等级2,但是'MatMul'的等级3

1 回答

  • 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.])
    

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

相关问题