我正在 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 回答
您的输入数据似乎是一个序列,您的输出数据是一个包含与输入序列中的元素一样多的元素的序列 .
您收到错误,因为
data_2
的第二个维度小于data_1
的第二个维度 . 您可以用零填充data_2
和label_2
,使它们分别具有与data_1
和label_1
相同的形状 .此外,您应该定义一个遮罩占位符,以确保
label_2
的填充部分未包含在损失函数的计算中 .这不行 . 你的体重矢量应该有形状
(input_dim, output_dim)
. 在这种情况下,您似乎有二维输入,第二个维度变化 . 对于此尺寸,您应该采用最大可能的序列长度(因为您将较小的输入填充到此值) . 输出维度也将是最大序列长度 . 假设这是4
,那么W的形状应该是:(3, 4, 4)
,b
的形状应该是(4,)
.tf.matmul
是对的 . 当数据具有形状(batch_size, 3, 4)
且重量具有形状(3, 4, 4)
时 . 结果将具有形状(batch_size, 4)
.这是代码的更新版本(同样假设最大序列长度为
4
):话虽如此,您提出的网络架构(前馈神经网络)并不适合于序列 . 我建议你看一下递归神经网络和/或卷积神经网络 . 实现将类似,因为您还需要执行填充 .