tf.data.Dataset: Argumen `batch_size` tidak boleh ditentukan untuk tipe input yang diberikan

10

Saya menggunakan Talos dan Google colab TPU untuk menjalankan tuning hyperparameter dari model Keras . Perhatikan bahwa saya menggunakan Tensorflow 1.15.0 dan Keras 2.2.4-tf.

import os
import tensorflow as tf
import talos as ta
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.optimizers import Adam
from sklearn.model_selection import train_test_split

def iris_model(x_train, y_train, x_val, y_val, params):

    # Specify a distributed strategy to use TPU
    resolver = tf.contrib.cluster_resolver.TPUClusterResolver(tpu='grpc://' + os.environ['COLAB_TPU_ADDR'])
    tf.contrib.distribute.initialize_tpu_system(resolver)
    strategy = tf.contrib.distribute.TPUStrategy(resolver)

    # Use the strategy to create and compile a Keras model
    with strategy.scope():
      model = Sequential()
      model.add(Dense(32, input_shape=(4,), activation=tf.nn.relu, name="relu"))
      model.add(Dense(3, activation=tf.nn.softmax, name="softmax"))
      model.compile(optimizer=Adam(learning_rate=0.1), loss=params['losses'])

    # Convert data type to use TPU
    x_train = x_train.astype('float32')
    x_val = x_val.astype('float32')

    dataset = tf.data.Dataset.from_tensor_slices((x_train, y_train))
    dataset = dataset.cache()
    dataset = dataset.shuffle(1000, reshuffle_each_iteration=True).repeat()
    dataset = dataset.batch(params['batch_size'], drop_remainder=True)

    # Fit the Keras model on the dataset
    out = model.fit(dataset, batch_size=params['batch_size'], epochs=params['epochs'], validation_data=[x_val, y_val], verbose=0, steps_per_epoch=2)

    return out, model

# Load dataset
X, y = ta.templates.datasets.iris()

# Train and test set
x_train, x_val, y_train, y_val = train_test_split(X, y, test_size=0.30, shuffle=False)

# Create a hyperparameter distributions 
p = {'losses': ['logcosh'], 'batch_size': [128, 256, 384, 512, 1024], 'epochs': [10, 20]}

# Use Talos to scan the best hyperparameters of the Keras model
scan_object = ta.Scan(x_train, y_train, params=p, model=iris_model, experiment_name='test', x_val=x_val, y_val=y_val, fraction_limit=0.1)

Setelah mengonversi set kereta ke Dataset menggunakan tf.data.Dataset, saya mendapatkan kesalahan berikut ketika mencocokkan model dengan out = model.fit:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-3-c812209b95d0> in <module>()
      8 
      9 # Use Talos to scan the best hyperparameters of the Keras model
---> 10 scan_object = ta.Scan(x_train, y_train, params=p, model=iris_model, experiment_name='test', x_val=x_val, y_val=y_val, fraction_limit=0.1)

8 frames
/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/keras/engine/training.py in _validate_or_infer_batch_size(self, batch_size, steps, x)
   1813             'The `batch_size` argument must not be specified for the given '
   1814             'input type. Received input: {}, batch_size: {}'.format(
-> 1815                 x, batch_size))
   1816       return
   1817 

ValueError: The `batch_size` argument must not be specified for the given input type. Received input: <DatasetV1Adapter shapes: ((512, 4), (512, 3)), types: (tf.float32, tf.float32)>, batch_size: 512

Kemudian, jika saya mengikuti instruksi itu dan tidak mengatur argumen ukuran batch model.fit. Saya mendapatkan kesalahan lain di:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-3-c812209b95d0> in <module>()
      8 
      9 # Use Talos to scan the best hyperparameters of the Keras model
---> 10 scan_object = ta.Scan(x_train, y_train, params=p, model=iris_model, experiment_name='test', x_val=x_val, y_val=y_val, fraction_limit=0.1)

8 frames
/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/keras/engine/training.py in _distribution_standardize_user_data(self, x, y, sample_weight, class_weight, batch_size, validation_split, shuffle, epochs, allow_partial_batch)
   2307             strategy) and not drop_remainder:
   2308           dataset_size = first_x_value.shape[0]
-> 2309           if dataset_size % batch_size == 0:
   2310             drop_remainder = True
   2311 

TypeError: unsupported operand type(s) for %: 'int' and 'NoneType'
Sami Belkacem
sumber
Akan membantu untuk kesalahan terakhir jika Anda dapat memposting jejak tumpukan keseluruhan, karena fungsi itu tampaknya dipanggil di banyak tempat di file ini, jadi saya tidak tahu di mana Anda berada: github.com/tensorflow/tensorflow /blob/r1.15/tensorflow/python/…
mdaoust
Saya baru saja mengedit pertanyaan, Anda dapat memeriksa jejak stack, terima kasih atas waktu dan pertimbangan Anda.
Sami Belkacem

Jawaban:

0

dari kode github :

ValueError akan dinaikkan jika xmerupakan generator atau Sequenceinstance dan batch_sizeditentukan seperti yang kami harapkan pengguna untuk menyediakan kumpulan data batch.

Coba gunakan batch_size = None

Ioannis Nasios
sumber
Saya mendapatkan error lain di _distribution_standardize_user_data (self, x, y, sample_weight, class_weight, batch_size, validation_split, shuffle, zaman, allow_partial_batch) TypeError: tidak didukung jenis operan (s) untuk *: 'NoneType' dan 'int
Sami Belkacem
Anda juga harus mengatur steps_per_epoch = Tidak Ada
Ioannis Nasios
Tidak berfungsi, saya mendapatkan kesalahan lain: ValueError: Mencoba untuk mengkonversi nilai (Tidak ada) dengan jenis yang tidak didukung (<class 'NoneType'>) ke Tensor. Saya pikir Anda dapat dengan mudah mereproduksi kesalahan dengan menyalin program singkat
Sami Belkacem
0

Tidak yakin apakah yang berikut ini sesuai dengan tagihan Anda, tetapi sesuatu untuk dicoba. Semua yang saya lakukan diambil dari repeat () dari dataset dan batch_size = params ['batch_size'] dari model.fit

Jika hal di atas bukan yang siap Anda korbankan maka abaikan pos tersebut.

import os
import tensorflow as tf
import talos as ta
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense

def iris_model(x_train, y_train, x_val, y_val, params):

    # Specify a distributed strategy to use TPU
    resolver = tf.distribute.cluster_resolver.TPUClusterResolver(tpu='grpc://' + os.environ['COLAB_TPU_ADDR'])
    tf.config.experimental_connect_to_host(resolver.master())
    tf.tpu.experimental.initialize_tpu_system(resolver)
    strategy = tf.distribute.experimental.TPUStrategy(resolver)

    with strategy.scope():
        model = Sequential()
        model.add(Dense(32, input_dim=4, activation=params['activation']))
        model.add(Dense(3, activation='softmax'))
        model.compile(optimizer=params['optimizer'], loss=params['losses'])

    # Convert the train set to a Dataset to use TPU
    dataset = tf.data.Dataset.from_tensor_slices((x_train, y_train))
    dataset = dataset.cache().shuffle(1000, reshuffle_each_iteration=True).batch(params['batch_size'], drop_remainder=True)

    out = model.fit(dataset, epochs=params['epochs'], validation_data=[x_val, y_val], verbose=0)

    return out, model

x, y = ta.templates.datasets.iris()

p = {'activation': ['relu', 'elu'],
       'optimizer': ['Nadam', 'Adam'],
       'losses': ['logcosh'],
       'batch_size': (20, 50, 5),
       'epochs': [10, 20]}

scan_object = ta.Scan(x, y, model=iris_model, params=p, fraction_limit=0.1, experiment_name='first_test')
Amit
sumber
Ini tidak berfungsi: TypeError: jenis operan yang tidak didukung untuk *: 'NoneType' dan 'int'
Sami Belkacem
0

Kesalahan kedua yang Anda dapatkan, dalam _distribution_standardize_user_data, ketika Anda tidak lulus batch_sizesesuai.

Kode yang Anda jalankan untuk fungsi itu ada di sini:

https://github.com/tensorflow/tensorflow/blob/r1.15/tensorflow/python/keras/engine/training.py#L2192

Anda tidak memposting jejak balik, tapi saya yakin itu gagal pada baris 2294 , karena itu satu-satunya tempat di mana batch_sizedikalikan dengan sesuatu.

if shuffle:
          # We want a buffer size that is larger than the batch size provided by
          # the user and provides sufficient randomness. Note that larger
          # numbers introduce more memory usage based on the size of each
          # sample.
          ds = ds.shuffle(max(1024, batch_size * 8))

Sepertinya Anda dapat mematikannya dengan mengatur shuffle=False.

fit(ds, shuffle=False,...)

Apakah itu bekerja?

mdaoust
sumber
Terima kasih, tapi saya masih mendapatkan kesalahan yang sama dengan shuffle = False. Gagal pada saluran 2309, bukan 2294.
Sami Belkacem
@SamiBelkacem, itu '
mdaoust
0

Bisakah Anda menghapus, baris-baris ini dari kode Anda dan mencoba:

    dataset = dataset.cache()
    dataset = dataset.shuffle(1000, reshuffle_each_iteration=True).repeat()
    dataset = dataset.batch(params['batch_size'], drop_remainder=True)
WITH THESE:
    dataset = dataset.repeat()
    dataset = dataset.batch(128, drop_remainder=True)
    dataset = dataset.prefetch(1)

Kalau tidak, apa yang Anda tuliskan tf.data.Dataset.from_tensor_slicesada hubungannya dengan kesalahan.

Rishabh Sahrawat
sumber
Masih tidak bekerja. Seperti yang Anda katakan, tf.data.Dataset ada hubungannya dengan kesalahan. Tetapi, dokumentasi mengatakan perlu memasukkannya saat menggunakan Cloud TPU tensorflow.org/guide/tpu#input_datasets
Sami Belkacem