【问题标题】:InvalidArgumentError: Input to reshape is a tensor with 27000 values, but the requested shape has 810000 [Op:Reshape]InvalidArgumentError:reshape 的输入是一个具有 27000 个值的张量,但请求的形状有 810000 [Op:Reshape]
【发布时间】:2020-02-15 09:46:04
【问题描述】:

为 ModelNet10 设置 3D-GAN 时收到以下错误消息:

InvalidArgumentError:reshape 的输入是一个具有 27000 个值的张量,但请求的形状有 810000 [Op:Reshape]

在我看来,批处理没有正确创建,因此张量的形状无效。尝试了不同的东西,但无法设置批次.. 我非常感谢有关如何清理我的代码的任何提示! 提前致谢!

import time

import numpy as np
import tensorflow as tf
np.random.seed(1)

from tensorflow.keras import layers
from IPython import display

# Load the data
modelnet_path = '/modelnet10.npz'
data = np.load(modelnet_path)
X, Y = data['X_train'], data['y_train']
X_test, Y_test = data['X_test'], data['y_test']
X = X.reshape(X.shape[0], 30, 30, 30, 1).astype('float32')

#Hyperparameters
BUFFER_SIZE = 3991
BATCH_SIZE = 30
LEARNING_RATE = 4e-4
BETA_1 = 5e-1
EPOCHS = 100

#Random seed for image generation
n_examples = 16
noise_dim = 100
seed = tf.random.normal([n_examples, noise_dim])

train_dataset = tf.data.Dataset.from_tensor_slices(X).batch(BATCH_SIZE)

# Build the network
def make_discriminator_model():    
    model = tf.keras.Sequential()
    model.add(layers.Reshape((30, 30, 30, 1), input_shape=(30, 30, 30)))  
    model.add(layers.Conv3D(16, 6, strides=2, activation='relu'))
    model.add(layers.Conv3D(64, 5, strides=2, activation='relu'))
    model.add(layers.Conv3D(64, 5, strides=2, activation='relu'))
    model.add(layers.Flatten())
    model.add(layers.Dense(10))

    return model

discriminator = make_discriminator_model()

def make_generator_model():   
    model = tf.keras.Sequential()
    model.add(layers.Dense(15*15*15*128, use_bias=False,input_shape=(100,)))
    model.add(layers.BatchNormalization())
    model.add(layers.ReLU())
    model.add(layers.Reshape((15,15,15,128)))    
    model.add(layers.Conv3DTranspose(64, (5,5,5), strides=(1,1,1), padding='valid', use_bias=False))
    model.add(layers.BatchNormalization())
    model.add(layers.ReLU())  
    model.add(layers.Conv3DTranspose(32, (5,5,5), strides=(2,2,2), padding='valid', use_bias=False, activation='tanh'))

    return model

generator = make_generator_model()

#Optimizer & Loss function
cross_entropy = tf.keras.losses.BinaryCrossentropy(from_logits=True)

def discriminator_loss(real_output, fake_output):
    real_loss = cross_entropy(tf.ones_like(real_output), real_output)
    fake_loss = cross_entropy(tf.zeros_like(fake_output), fake_output)
    total_loss = real_loss + fake_loss

    return total_loss

def generator_loss(fake_output):
    return cross_entropy(tf.ones_like(fake_output), fake_output)

optimizer = tf.keras.optimizers.Adam(lr=LEARNING_RATE, beta_1=BETA_1)

#Training
def train_step(shapes):
    noise = tf.random.normal([BATCH_SIZE, noise_dim])

    with tf.GradientTape() as gen_tape, tf.GradientTape() as disc_tape:
        generated_shapes = generator(noise, training=True)

        real_output = discriminator(shapes, training=True)
        fake_output = discriminator(generated_shapes, training=True)
        gen_loss = generator_loss(fake_output)
        disc_loss = discriminator_loss(real_output, fake_output)

    gen_gradients = gen_tape.gradient(gen_loss, generator.trainable_variables)
    disc_gradients = disc_tape.gradient(disc_loss, discriminator.trainable_variables)

    optimizer.apply_gradients(zip(gen_gradients, generator.trainable_variables))
    optimizer.apply_gradients(zip(disc_gradients, discriminator.trainable_variables))

def train(dataset, epochs):
    for epoch in range(epochs):
        start = time.time()

        for shape_batch in dataset:
            train_step(shape_batch)

        display.clear_output(wait=True)
        print ('Time for epoch {} is {} sec'.format(epoch + 1, time.time()-start))

    display.clear_output(wait=True)      

train(X_test, EPOCHS)

【问题讨论】:

  • 输入数据(X 和 Y)的形状是什么。如果您也将它们添加到问题中将会很有帮助,因为它会提高清晰度。
  • train_dataset 未使用 - 这是故意的吗?你将X_test 传递给train 方法,我猜你想要train_dataset

标签: python numpy tensorflow machine-learning artificial-intelligence


【解决方案1】:

X_test 只是一个列表,因此在您的训练循环中,只有一个样本 (30*30*30=27000) 输入模型,但模型本身要求 30(batchsize) * 30 * 30 *30=810000。

modelnet_path = '/modelnet10.npz'
data = np.load(modelnet_path)
X, Y = data['X_train'], data['y_train']
X_test, Y_test = data['X_test'], data['y_test']
X = X.reshape(X.shape[0], 30, 30, 30, 1).astype('float32')

...
train_dataset = tf.data.Dataset.from_tensor_slices(X).batch(BATCH_SIZE)
...
def train(dataset, epochs):
    for epoch in range(epochs):
        start = time.time()

        for shape_batch in dataset:
            train_step(shape_batch)

        display.clear_output(wait=True)
        print ('Time for epoch {} is {} sec'.format(epoch + 1, time.time()-start))

    display.clear_output(wait=True)      

train(X_test, EPOCHS)

考虑使用您创建的 train_dataset 进行训练,或将 X_test 生成为 tf.dataset。

train(train_dataset , EPOCHS)

【讨论】:

  • 你说得对,我拿错了数据集。谢谢你的帮助!如果有人正在从事类似的项目,请注意可能还需要在 Conv3DTranspose 中使用 Padding='same' 以使代码可执行。
猜你喜欢
  • 2022-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-21
  • 1970-01-01
相关资源
最近更新 更多