【问题标题】:Tensorflow Input Shapes IncompatibleTensorflow 输入形状不兼容
【发布时间】:2020-09-15 04:45:56
【问题描述】:

尝试构建一个 Tensorflow 模型,其中我的数据具有 70 个特征。这是我的第一层的设置:

tf.keras.layers.Dense(units=50, activation='relu', input_shape=(None,70)),

将输入形状设置为(None,70) 对我来说似乎是最好的,因为我使用的是前馈神经网络,其中每一“行”数据都是唯一的。我正在使用大小为 10 的批量大小(目前)。我的输入形状是否应该更改为 (10,70)??

我已尝试使用原始的(None, 70) 并得到错误:

WARNING:tensorflow:Model was constructed with shape (None, None, 70) for input Tensor("dense_33_input:0", shape=(None, None, 70), dtype=float32), but it was called on an input with incompatible shape (10, 70).

TypeError: Input 'y' of 'Mul' Op has type float64 that does not match type float32 of argument 'x'.

对于input_shape 到底出了什么问题感到非常困惑,因为(None, 70) 似乎最适合。非常感谢任何帮助。

编辑:想要添加一个可重现的示例以获得更多上下文。对不起,长度。这是 [this example][1] 的复制品,以更好地适应我当前的数据(非图像)。

变分自动编码器模型

class VAE(tf.keras.Model):
    
    def __init__(self, latent_dim):
        super(VAE, self).__init__()
        self.latent_dim = latent_dim
        self.encoder = tf.keras.Sequential(
        [
            tf.keras.layers.Dense(units=50, activation='relu', input_shape=(70,)),
            tf.keras.layers.Dense(latent_dim + latent_dim), #No activation
        ])
        
        self.decoder = tf.keras.Sequential(
        [
            tf.keras.layers.Dense(units=50, activation='relu', input_shape=(latent_dim,)),
            tf.keras.layers.Dense(units=70),
        ])
        
    @tf.function
    def sample(self, eps=None):
        if eps is None:
            eps = tf.random.normal(shape=(100, self.latent_dim))
        return self.decode(eps, apply_sigmoid=True)

    def encode(self, x):
        mean, logvar = tf.split(self.encoder(x), num_or_size_splits=2, axis=1)
        return mean, logvar

    def reparameterize(self, mean, logvar):
        eps = tf.random.normal(shape=mean.shape)
        return eps * tf.exp(logvar * .5) + mean

    def decode(self, z, apply_sigmoid=False):
        logits = self.decoder(z)
        if apply_sigmoid:
            probs = tf.sigmoid(logits)
            return probs
        return logits


  [1]: https://www.tensorflow.org/tutorials/generative/cvae

优化器和损失函数

optimizer = tf.keras.optimizers.Adam(1e-4)

def log_normal_pdf(sample, mean, logvar, raxis=1):
    log2pi = tf.math.log(2. * np.pi)
    return tf.reduce_sum(
        -.5 * ((sample - mean) ** 2. * tf.exp(-logvar) + logvar + log2pi), axis=raxis)

def compute_loss(model, x):
    mean, logvar = model.encode(x)
    z = model.reparameterize(mean, logvar)
    x_logit = model.decode(z)
    cross_ent = tf.nn.sigmoid_cross_entropy_with_logits(logits=x_logit, labels=x)
    logpx_z = -tf.reduce_sum(cross_ent, axis=[1])
    logpz = log_normal_pdf(z, 0, 0)
    logqz_x = log_normal_pdf(z, mean, logvar)
    return -tf.reduce_mean(logpx_z + logpz - logqz_x)

@tf.function
def train_step(model, x, optimizer):
    with tf.GradientTape() as tape:
        loss = compute_loss(model, x)
    gradients = tape.gradient(loss, model.trainable_variables)
    optimizer.apply_gradients(zip(gradients, model.trainable_variables))

训练

X = tf.random.uniform((100,70))
y = tf.random.uniform((100,))

ds_train = tf.data.Dataset.from_tensor_slices((X, y))

tf.random.set_seed(1)

train = ds_train.shuffle(buffer_size=len(X))
train = train.batch(batch_size=10, drop_remainder=False)

epochs = 5
latent_dim = 2

model = VAE(2)

for epoch in range(1, epochs+1):
    start_time = time.time()
    for i, (train_x, train_y) in enumerate(train):
        train_step(model, train_x, optimizer)
    end_time = time.time()
    
    loss = tf.keras.metrics.Mean()
    for i, (test_x, test_y) in enumerate(ds_test):
        loss(compute_loss(model, test_x))
    elbo = -loss.result()
    display.clear_output(wait=False)
    print('Epoch: {}, Test set ELBO: {}, time elapse for current epoch: {}'
         .format(epoch, elbo, end_time - start_time))

【问题讨论】:

  • 你能定义X_trainy_train吗?
  • 对不起...现在应该修复了。 y 在本例中是不必要的。
  • 我无法使用您的示例重现此错误,并且遇到了其他错误。你能修复你的例子吗?尝试在新的 python 解释器中运行它(没有定义变量)。没有示例,将很难提供帮助。
  • @jakub 刚刚对 y 和 reduce_sum 上的轴进行了细微更改。应该是我有同样的错误
  • 谢谢。您可以尝试将 logpz = log_normal_pdf(z, 0., 0.) 更改为 logpz = log_normal_pdf(z, 0., 0.) 吗?这将使那些零浮动而不是整数。我遇到了tf.exp不能取int32的错误。

标签: python tensorflow


【解决方案1】:

input_shape 不应包含批次维度。使用input_shape=(70,)

tf.keras.layers.Dense(units=50, activation='relu', input_shape=(70,))

您可以在调用model.fit(..., batch_size=10) 时设置批量大小。请参阅tf.keras.Model.fit 上的文档。

由于将int32 值传递给tf.math.exp,原始帖子中存在另一个错误。那行应该是

logpz = log_normal_pdf(z, 0., 0.)

解决这个错误。请注意 0. 值,其计算结果为浮点数而不是整数。

【讨论】:

  • 仍然收到最后一个错误:TypeError: Input 'y' of 'Mul' Op has type float64 that does not match type float32 of argument 'x'. 如果有帮助,可以分享更多代码...
  • 是的,请用一个最小的、可重现的例子更新你的帖子。
  • 刚刚...让我知道你的想法。谢谢
猜你喜欢
  • 1970-01-01
  • 2021-05-12
  • 2021-05-29
  • 2018-01-10
  • 2021-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多