【问题标题】:How to fix "TypeError: Cannot convert the value to a TensorFlow DType"?如何修复“TypeError:无法将值转换为 TensorFlow DType”?
【发布时间】:2021-07-12 00:48:39
【问题描述】:

我尝试为手写数字数据集构建 GAN(生成对抗网络),但遇到了与张量数据类型错误相关的问题。

  1. 第78行,我使用“tf.cast”将所有图像转换为float32。
  2. 对于生成器和鉴别器损失,我使用了“tf.losses.BinaryCrossentropy”。

我没有得到错误发生的位置。

这是完整的代码

import tensorflow as tf
import matplotlib.pyplot as plt
import scipy.io as sio
from sklearn.model_selection import train_test_split
import numpy as np

(train, label), (test, label_test) = tf.keras.datasets.mnist.load_data()

train_images = train.reshape(train.shape[0], 28, 28, 1)
train_images = (train_images-127.5)/127.5

BUFFER_SIZE = train.shape[0]
BATCH_SIZE = 100
train_dataset = tf.data.Dataset.from_tensor_slices(train_images).shuffle(BUFFER_SIZE).batch(BATCH_SIZE)

def discriminator():
    model = tf.keras.Sequential()
    model.add(tf.keras.layers.Conv2D(7, (3,3), padding='same', input_shape=(28, 28, 1)))
    model.add(tf.keras.layers.Flatten())
    model.add(tf.keras.layers.LeakyReLU(0.1))
    model.add(tf.keras.layers.Dense(128, activation='relu'))
    model.add(tf.keras.layers.Dense(1))
    return model

dis_model = discriminator()
disc_opt = tf.optimizers.Adam()

def discriminator_loss(y_pred_real, y_pred_fake):
    real = tf.sigmoid(y_pred_real)
    fake = tf.sigmoid(y_pred_fake)
    fake_loss = tf.losses.binary_crossentropy(tf.ones_like(y_pred_real), y_pred_real)
    real_loss = tf.losses.binary_crossentropy(tf.zeros_like(y_pred_fake), y_pred_fake)
    return fake_loss+real_loss

def generator():
    model = tf.keras.Sequential()
    model.add(tf.keras.layers.Dense(7*7*256, input_shape=(100,)))
    model.add(tf.keras.layers.BatchNormalization())
    model.add(tf.keras.layers.Reshape((7, 7, 256)))
    model.add(tf.keras.layers.Conv2DTranspose(128, (3, 3), padding='same'))
    model.add(tf.keras.layers.BatchNormalization())
    model.add(tf.keras.layers.Conv2DTranspose(64, (3,3), strides=(2,2), padding='same'))
    model.add(tf.keras.layers.BatchNormalization())
    model.add(tf.keras.layers.Conv2DTranspose(1, (3,3), strides=(2,2), padding='same'))
    return model

gen_model = generator()
gen_opt = tf.optimizers.Adam()

def generator_loss(fake_pred):
    loss = tf.sigmoid(fake_pred)
    fake_loss = tf.losses.BinaryCrossentropy(tf.zeros_like(fake_pred), fake_pred)
    return fake_loss

def train_steps(images):
    fake_noise = np.random.randn(BATCH_SIZE, 100).astype('float32')
    with tf.GradientTape() as gen_tape, tf.GradientTape() as disc_tape:
        generated_images = gen_model(fake_noise)

        fake_output = dis_model(generated_images)
        real_output = dis_model(images)

        gen_loss = generator_loss(fake_output)
        disc_loss = discriminator_loss(real_output, fake_output)

        gen_gradient = gen_tape.gradient(gen_loss, gen_model.trainable_variables)
        disc_gradient = disc_tape.gradient(disc_loss, dis_model.trainable_variables)

        gen_opt.apply_gradients(zip(gen_gradient, gen_model.trainable_variables))
        disc_opt.apply_gradients(zip(disc_gradient, dis_model.trainable_variables))

        print('disc_loss: ', np.mean(disc_loss))
        print('gen_loss: ', np.mean(gen_loss))

def train(dataset, epoch):
    for j in range(epoch):
        for images in dataset:
            images = tf.cast(images, tf.dtypes.float32)
            train_steps(images)


train(train_dataset, 2)

错误正在发生

Traceback (most recent call last):
  File "D:/GANs_handwritten/model.py", line 81, in <module>
    train(train_dataset, 2)
  File "D:/GANs_handwritten/model.py", line 78, in train
    train_steps(images)
  File "D:/GANs_handwritten/model.py", line 66, in train_steps
    gen_gradient = gen_tape.gradient(gen_loss, gene.trainable_variables)
  File "C:\Users\Devanshu\AppData\Local\Programs\Python\Python38\lib\site-packages\tensorflow\python\eager\backprop.py", line 1047, in gradient
    if not backprop_util.IsTrainable(t):
  File "C:\Users\Devanshu\AppData\Local\Programs\Python\Python38\lib\site-packages\tensorflow\python\eager\backprop_util.py", line 30, in IsTrainable
    dtype = dtypes.as_dtype(dtype)
  File "C:\Users\Devanshu\AppData\Local\Programs\Python\Python38\lib\site-packages\tensorflow\python\framework\dtypes.py", line 649, in as_dtype
    raise TypeError("Cannot convert value %r to a TensorFlow DType." %
TypeError: Cannot convert value <tensorflow.python.keras.losses.BinaryCrossentropy object at 0x000001E5190BE850> to a TensorFlow DType.

【问题讨论】:

    标签: python tensorflow machine-learning image-processing generative-adversarial-network


    【解决方案1】:

    正如official docs 在TensorFlow 中实现DCGAN 所建议的那样,首先创建一个BinaryCrossentropy 对象,然后使用yy_pred 调用该对象。

    首先,初始化一个BinaryCrossentropy对象,

    # This method returns a helper function to compute cross entropy loss
    cross_entropy = tf.keras.losses.BinaryCrossentropy(from_logits=True)
    

    然后用yy_pred调用cross_entropy对象,

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

    在您的代码中,替换,

    def generator_loss(fake_pred):
        loss = tf.sigmoid(fake_pred)
        fake_loss = tf.losses.BinaryCrossentropy(tf.zeros_like(fake_pred), fake_pred)
        return fake_loss
    

    与,

    def generator_loss(fake_pred):
        loss = tf.sigmoid(fake_pred)
        fake_loss = tf.keras.losses.BinaryCrossentropy()(tf.zeros_like(fake_pred), fake_pred)
        return fake_loss
    

    在方法discriminator_loss中做同样的修正,

    def discriminator_loss(y_pred_real, y_pred_fake):
        real = tf.sigmoid(y_pred_real)
        fake = tf.sigmoid(y_pred_fake)
        fake_loss = tf.keras.losses.BinaryCrossentropy()(tf.ones_like(y_pred_real), y_pred_real)
        real_loss = tf.keras.losses.BinaryCrossentropy()(tf.zeros_like(y_pred_fake), y_pred_fake)
        return fake_loss+real_loss
    

    【讨论】:

      猜你喜欢
      • 2018-06-11
      • 1970-01-01
      • 2021-09-13
      • 2021-12-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-15
      • 2021-10-25
      • 2018-09-12
      相关资源
      最近更新 更多