将张量从128,128,3转换为129,128,3,填充到该张量的1,128,3值稍后发生

问题描述 投票:1回答:1

这是我的GAN代码,其中模型正在初始化,一切正常,只有问题的相关代码出现在这里:

z = Input(shape=(100+384,))
img = self.generator(z)
print("before: ",img)    #128x128x3 shape, dtype=tf.float32
temp = tf.get_variable("temp", [1, 128, 3],dtype=tf.float32)
img=tf.concat(img,temp)
print("after: ",img)    #error ValueError: Incompatible type conversion requested to type 'int32' for variable of type 'float32_ref'
valid = self.discriminator(img)
self.combined = Model(z, valid)

我有128x128x3图像要生成,我想要做的是给鉴别器提供129x128x3图像,1x128x3文本嵌入矩阵在训练时与图像连接。但我必须在开始时指定张量的形状和输入值,每个模型,即GEN和DISC将得到。 Gen采用100noise + 384嵌入矩阵并生成128x128x3图像,该图像再次被一些嵌入(即1x128x3)嵌入并被馈送到DISC。所以我的问题是这种方法是否正确?此外,如果它是正确的或有意义,那么我如何具体说明一开始所需的东西,以便它不会给我像不兼容的形状的错误,因为在开始时我必须添加这些行: -

    z = Input(shape=(100+384,))
    img = self.generator(z)    #128x128x3
    valid = self.discriminator(img)   #should be 129x128x3
    self.combined = Model(z, valid)

但img是128x128x3,后来在训练期间通过连接嵌入矩阵变为129x128x3。那么如何在上面的代码中将“img”从128,128,3改为129,128,3,或者通过填充或附加另一个张量,或者简单地重塑当然不可能。任何帮助将非常感激。谢谢。

python tensorflow keras generative-adversarial-network
1个回答
1
投票

tf.concat的第一个参数应该是张量列表,而第二个参数是连接的轴。您可以将imgtemp张量连接如下:

import tensorflow as tf

img = tf.ones(shape=(128, 128, 3))
temp = tf.get_variable("temp", [1, 128, 3], dtype=tf.float32)
img = tf.concat([img, temp], axis=0)

with tf.Session() as sess:
    print(sess.run(tf.shape(img)))

更新:这里有一个最小的例子,说明为什么你得到错误“AttributeError:'Tensor'对象没有属性'_keras_history'”。以下代码段中会弹出此错误:

from keras.layers import Input, Lambda, Dense
from keras.models import Model
import tensorflow as tf

img = Input(shape=(128, 128, 3))  # Shape=(batch_size, 128, 128, 3)
temp = Input(shape=(1, 128, 3))  # Shape=(batch_size, 1, 128, 3)
concat = tf.concat([img, temp], axis=1)
print(concat.get_shape())
dense = Dense(1)(concat)
model = Model(inputs=[img, temp], outputs=dense)

这是因为张量concat不是Keras张量,因此缺少一些典型的Keras张量属性(如_keras_history)。要解决这个问题,您需要将所有TensorFlow张量封装到Keras Lambda layer中:

from keras.layers import Input, Lambda, Dense
from keras.models import Model
import tensorflow as tf

img = Input(shape=(128, 128, 3))  # Shape=(batch_size, 128, 128, 3)
temp = Input(shape=(1, 128, 3))  # Shape=(batch_size, 1, 128, 3)
concat = Lambda(lambda x: tf.concat([x[0], x[1]], axis=1))([img, temp])
print(concat.get_shape())
dense = Dense(1)(concat)
model = Model(inputs=[img, temp], outputs=dense)
© www.soinside.com 2019 - 2024. All rights reserved.