Преобразование тензора из 128,128,3 в 129,128,3, и значения 1,128,3, дополненные этим тензором, произойдут позже - PullRequest
0 голосов
/ 05 июля 2018

Это мой кусок кода для 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 embedding и генерирует изображение 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 в приведенном выше коде, либо добавив или добавив другой тензор, либо просто изменив форму, что, конечно, невозможно. Любая помощь будет высоко ценится. Спасибо.

1 Ответ

0 голосов
/ 05 июля 2018

Первый аргумент tf.concat должен быть списком тензоров, а второй - осью, по которой происходит конкатенация. Вы можете объединить тензоры img и temp следующим образом:

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_history) отсутствуют. Чтобы преодолеть эту проблему, вам нужно заключить все тензоры TensorFlow в слой Keras Lambda :

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)
...