Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在Keras model.fit中使用tf.Dataset而不指定目标?_Python_Tensorflow_Keras_Deep Learning_Unsupervised Learning - Fatal编程技术网

Python 如何在Keras model.fit中使用tf.Dataset而不指定目标?

Python 如何在Keras model.fit中使用tf.Dataset而不指定目标?,python,tensorflow,keras,deep-learning,unsupervised-learning,Python,Tensorflow,Keras,Deep Learning,Unsupervised Learning,我想使用带有Keras函数API的自动编码器模型。我还想使用tf.data.Dataset作为模型的输入管道。但是,有一个限制,即我只能通过tuple(输入,目标)将数据集传递给keras.model.fit,具体如下: 输入数据。它可能是:一个tf.data数据集。应返回(输入、目标)或(输入、目标、样本权重)的元组 所以这里有一个问题:我是否可以传递tf.data.Dataset,而不重复这样的输入(输入,输入),或者更像(输入,无)。如果不能,重复输入是否会使我的型号的GPU内存加倍?您可

我想使用带有Keras函数API的自动编码器模型。我还想使用
tf.data.Dataset
作为模型的输入管道。但是,有一个限制,即我只能通过tuple
(输入,目标)
将数据集传递给
keras.model.fit
,具体如下:

输入数据。它可能是:一个tf.data数据集。应返回(输入、目标)或(输入、目标、样本权重)的元组

所以这里有一个问题:我是否可以传递
tf.data.Dataset
,而不重复这样的输入
(输入,输入)
,或者更像
(输入,无)
。如果不能,重复输入是否会使我的型号的GPU内存加倍?

您可以使用
map()
返回输入两次:

import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'
import tensorflow as tf
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Conv2D, MaxPool2D, Conv2DTranspose, Reshape
from functools import partial

(xtrain, _), (xtest, _) = tf.keras.datasets.mnist.load_data()

ds = tf.data.Dataset.from_tensor_slices(
    tf.expand_dims(tf.concat([xtrain, xtest], axis=0), axis=-1))

ds = ds.take(int(1e4)).batch(4).map(lambda x: (x/255, x/255))

custom_convolution = partial(Conv2D, kernel_size=(3, 3),
                             strides=(1, 1),
                             activation='relu',
                             padding='same')
custom_pooling = partial(MaxPool2D, pool_size=(2, 2))

conv_encoder = Sequential([
    custom_convolution(filters=16, input_shape=(28, 28, 1)),
    custom_pooling(),
    custom_convolution(filters=32),
    custom_pooling(),
    custom_convolution(filters=64),
    custom_pooling()
    ])

# conv_encoder(next(iter(ds))[0].numpy().astype(float)).shape
custom_transpose = partial(Conv2DTranspose,
                           padding='same',
                           kernel_size=(3, 3),
                           activation='relu',
                           strides=(2, 2))

conv_decoder = Sequential([
    custom_transpose(filters=32, input_shape=(3, 3, 64), padding='valid'),
    custom_transpose(filters=16),
    custom_transpose(filters=1, activation='sigmoid'),
    Reshape(target_shape=[28, 28, 1])
    ])

conv_autoencoder = Sequential([
    conv_encoder,
    conv_decoder
    ])

conv_autoencoder.compile(loss='binary_crossentropy', optimizer='adam')

history = conv_autoencoder.fit(ds)
您可以使用
map()
返回输入两次:

import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '3'
import tensorflow as tf
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Conv2D, MaxPool2D, Conv2DTranspose, Reshape
from functools import partial

(xtrain, _), (xtest, _) = tf.keras.datasets.mnist.load_data()

ds = tf.data.Dataset.from_tensor_slices(
    tf.expand_dims(tf.concat([xtrain, xtest], axis=0), axis=-1))

ds = ds.take(int(1e4)).batch(4).map(lambda x: (x/255, x/255))

custom_convolution = partial(Conv2D, kernel_size=(3, 3),
                             strides=(1, 1),
                             activation='relu',
                             padding='same')
custom_pooling = partial(MaxPool2D, pool_size=(2, 2))

conv_encoder = Sequential([
    custom_convolution(filters=16, input_shape=(28, 28, 1)),
    custom_pooling(),
    custom_convolution(filters=32),
    custom_pooling(),
    custom_convolution(filters=64),
    custom_pooling()
    ])

# conv_encoder(next(iter(ds))[0].numpy().astype(float)).shape
custom_transpose = partial(Conv2DTranspose,
                           padding='same',
                           kernel_size=(3, 3),
                           activation='relu',
                           strides=(2, 2))

conv_decoder = Sequential([
    custom_transpose(filters=32, input_shape=(3, 3, 64), padding='valid'),
    custom_transpose(filters=16),
    custom_transpose(filters=1, activation='sigmoid'),
    Reshape(target_shape=[28, 28, 1])
    ])

conv_autoencoder = Sequential([
    conv_encoder,
    conv_decoder
    ])

conv_autoencoder.compile(loss='binary_crossentropy', optimizer='adam')

history = conv_autoencoder.fit(ds)
“重复输入使我的型号的GPU内存加倍?”;通常,数据集管道在CPU上运行,而不是在GPU上运行

对于AutoEncoder模型,如果要使用仅包含示例而不包含标签的数据集,可以使用自定义培训:

def loss(model, x):

    y_ = model(x, training=True)           # use x as input

   return loss_object(y_true=x, y_pred=y_) # use x as label (y_true)

with tf.GradientTape() as tape:
   loss_value = loss(model, inputs)
如果需要使用fit()方法,可以将keras.Model子类化并重写train_step()方法。(我没有验证此代码):

“重复输入使我的型号的GPU内存加倍?”;通常,数据集管道在CPU上运行,而不是在GPU上运行

对于AutoEncoder模型,如果要使用仅包含示例而不包含标签的数据集,可以使用自定义培训:

def loss(model, x):

    y_ = model(x, training=True)           # use x as input

   return loss_object(y_true=x, y_pred=y_) # use x as label (y_true)

with tf.GradientTape() as tape:
   loss_value = loss(model, inputs)
如果需要使用fit()方法,可以将keras.Model子类化并重写train_step()方法。(我没有验证此代码):


我已经更新了我的答案