首页 > 解决方案 > 如何在自动编码器中使用 sparse_categorical_cross_entropy?

问题描述

我正在尝试训练自动编码器,由于内存问题,我决定停止使用单热编码,而是尝试使用 SparseCategoricalCrossentropy()。不幸的是,在尝试训练我得到的模型后:tensorflow.python.framework.errors_impl.InvalidArgumentError: logits and labels must have the same first dimension, got logits shape [512,32] and labels shape [2560]

from keras.metrics import SparseCategoricalAccuracy
from tensorflow.keras.layers import *
from tensorflow.keras.models import *
from tensorflow.keras.losses import *

import numpy as np
from tensorflow.python.keras.optimizer_v1 import RMSprop

BATCH_SIZE = 128
EPOCHS = 10
numpy_dataset = np.create
def create_autoencoder(sequence_length, latent_dim):
    # Define encoder input shape
    encoder_input = Input(shape=sequence_length, batch_size=BATCH_SIZE)
    latent = Input(shape=latent_dim)
    encoded = Dense(latent_dim, activation='tanh')(encoder_input)
    decoded = Dense(sequence_length, activation='sigmoid')(latent)
    encoder = Model(inputs=encoder_input, outputs=encoded, name="encoder")
    decoder = Model(inputs=latent, outputs=decoded, name="decoder")
    autoencoder = Model(inputs=encoder_input, outputs=decoder(encoded), name="autoencoder")
    return autoencoder


def data_generator(numpy_dataset, steps_per_epoch):
    # Computes the number of elements that should be removed so that the training data can be split
    # equally between batches
    # elements2remove = len(train_notes) - steps_per_epoch * BATCH_SIZE

    # steps_per_epoch =
    for i in range(EPOCHS):
        for batch in np.array_split(numpy_dataset, steps_per_epoch):
            yield batch, batch


def train(model, numpy_dataset):
    steps_per_epoch = len(numpy_dataset) // BATCH_SIZE
    model.compile(loss=SparseCategoricalCrossentropy(),
                  optimizer=RMSprop(learning_rate=0.01),
                  metrics=[SparseCategoricalAccuracy()])

    model.fit(x=data_generator(numpy_dataset=numpy_dataset, steps_per_epoch=steps_per_epoch),
              epochs=EPOCHS,
              batch_size=BATCH_SIZE,
              steps_per_epoch=steps_per_epoch)

autoencoder = create_autoencoder(32, 2)
train(autoencoder, numpy_dataset)

我简化了代码,使其更清晰。所以让我们说,在我创建的代码的前面numpy_dataset,它属于shape=(2560, 32)and dtype=int32。我该如何解决这个问题?

标签: pythontensorflowmachine-learningkerasautoencoder

解决方案


推荐阅读