【问题标题】:How does Keras(Tensorflow) calc. shape of last layer Tensor?Keras(Tensorflow)如何计算。最后一层张量的形状?
【发布时间】:2018-05-04 02:45:31
【问题描述】:

我目前正在研究生成 Conv NN 的图像和生成 Recurrent NN 的音频。我为这两个生成器都构建了,但由于某种原因,build_audio_generator 模型在其最后一层有一个张量 (Tensor("model_4/sequential_4/activation_4/Tanh:0")根据需要形状 (?, 1) 而不是 (?, 28, 28, 1)。我的问题,我该如何更改 build_audio_generator 的代码 使其具有与 build_generator 相同的形状(?, 28, 28, 1)?

代码:

def build_generator(latent_dim, channels, num_classes):

    model = Sequential()

    model.add(Dense(128 * 7 * 7, activation="relu", input_dim=latent_dim))
    model.add(Reshape((7, 7, 128)))
    model.add(BatchNormalization(momentum=0.8))
    model.add(UpSampling2D())
    model.add(Conv2D(128, kernel_size=3, padding="same"))
    model.add(Activation("relu"))
    model.add(BatchNormalization(momentum=0.8))
    model.add(UpSampling2D())
    model.add(Conv2D(64, kernel_size=3, padding="same"))
    model.add(Activation("relu"))
    model.add(BatchNormalization(momentum=0.8))
    model.add(Conv2D(channels, kernel_size=3, padding='same'))
    model.add(Activation("tanh"))

    model.summary()

    noise = Input(shape=(latent_dim,))
    label = Input(shape=(1,), dtype='int32')


    label_embedding = Flatten()(Embedding(num_classes, 100)(label))

    model_input = multiply([noise, label_embedding])

    img = model(model_input)

    return Model([noise, label], img)

def build_audio_generator(latent_dim, num_classes):

    model = Sequential()
    model.add(LSTM(512, input_dim=latent_dim, return_sequences=True))
    model.add(Dropout(0.3))
    model.add(LSTM(512, return_sequences=True))
    model.add(Dropout(0.3))
    model.add(LSTM(512))
    model.add(Dense(256))
    model.add(Dropout(0.3))
    model.add(Dense(num_classes))
    model.add(Activation('tanh'))

    model.summary()

    noise = Input(shape=(None, latent_dim,))
    label = Input(shape=(1,), dtype='int32')
    label_embedding = Flatten()(Embedding(num_classes, 100)(label))
    model_input = multiply([noise, label_embedding])

    sound = model(model_input)

    return Model([noise, label], sound)

# Build the generator
generator = build_generator(100, 3, 1)
audio_generator = build_audio_generator(100, 1)

# The generator takes noise and the target label as input
# and generates the corresponding digit of that label
noise = Input(shape=(None, 100,))
label = Input(shape=(1,))

img = generator([noise, label])

audio = audio_generator([noise, label])

print('Audio: '+ str(audio))
print('Audio shape: ' + str(audio.shape))

print('IMG: '+str(img))
print('IMG shape: ' + str(img.shape))

控制台输出:

Audio: Tensor("model_4/sequential_4/activation_4/Tanh:0", shape=(?, 1), dtype=float32)
Audio shape: (?, 1)
IMG: Tensor("model_3/sequential_3/activation_3/Tanh:0", shape=(?, 28, 28, 1), dtype=float32)
IMG shape: (?, 28, 28, 1)

【问题讨论】:

    标签: python tensorflow neural-network keras


    【解决方案1】:

    我想你会想要 3D 来代替音频,不是吗?

    只需在所有 LSTM 中保留 return_sequences=True

    【讨论】:

    • 酷,这基本上解决了我的问题,但现在我有一个形状为 (?, ?, 1) 的张量,我该如何更改 b>,我只需要重塑吗?
    • 你不需要关心这些。时间步长维度将在内部被视为变量,这不会改变结果中的任何内容。
    • 另外,noise 输入形状是 (None, some_dim),所以我假设您是故意使用可变长度,不是吗?
    • 那么额外的两个是固定尺寸吗?但是为什么 build_generator Tensor 不是 (?, ?, 1),而是 (?, 28, 28, 1)。我为我的愚蠢感到抱歉。 (是的,我确实使用可变长度)
    • 一个模型正在处理图像,2D 卷积,带来 4D 张量。 (如果您在适当的输入形状中使用None,它们也可以使用可变大小)。另一个模型使用循环层,可变长度,带来 3D 张量。中间维度是长度(可变)
    猜你喜欢
    • 2019-10-24
    • 2020-06-17
    • 1970-01-01
    • 1970-01-01
    • 2017-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多