tf.data.Dataset: Verilen girdi türü için `batch_size` argümanı belirtilmemelidir


10

Ben kullanıyorum Talos ve Google CoLab TPU a hyperparameter ayar çalıştırmak için Keras modeli. Tensorflow 1.15.0 ve Keras 2.2.4-tf kullandığımı unutmayın.

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)

Tren setini kullanarak bir Veri Kümesine dönüştürdükten sonra tf.data.Dataset, modeli takarken aşağıdaki hatayı alıyorum 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

Sonra, bu yönergeleri izler ve toplu boyut argümanını olarak ayarlamazsam model.fit. Başka bir hata alıyorum:

---------------------------------------------------------------------------
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'

Bütün bir yığın izlemesi gönderebilirseniz bu son hata için yararlı olacaktır, çünkü bu işlev bu dosyadaki bir sürü yerde çağrılıyor gibi görünüyor, bu yüzden nerede olduğunuzu söyleyemem: github.com/tensorflow/tensorflow /blob/r1.15/tensorflow/python/…
mdaoust

Soruyu yeni düzenledim, yığın izini kontrol edebilirsiniz, zaman ayırdığınız ve değerlendirdiğiniz için teşekkür ederiz.
Sami Belkacem

Yanıtlar:


0

dan github kodu :

xBir jeneratör veya örnekse Sequenceve batch_sizekullanıcıların toplu veri kümeleri sağlamasını beklediğimiz şekilde belirtilirse, ValueError öğesi yükseltilir .

Kullanmayı deneyin batch_size = None


* İçin desteklenmeyen işlenen türü (ler): Ben _distribution_standardize_user_data (öz, x, y, sample_weight, class_weight, batch_size, validation_split, karıştır, dönemini allow_partial_batch) TypeError başka hata alıyorum 'NoneType' ve 'int
Sami Belkacem

Ayrıca steps_per_epoch = None ayarlamalısınız
Ioannis Nasios

Çalışmıyor, başka bir hata alıyorum: ValueError: Desteklenmeyen tipte (<sınıf 'NoneType'>) bir değeri (Yok) Tensör'e dönüştürme girişimi. Sanırım kısa programı kopyalayarak hatayı kolayca yeniden oluşturabilirsiniz
Sami Belkacem

0

Aşağıdakilerin faturanıza uygun olup olmayacağından emin değilim ama denemek için bir şey. Tüm yaptığım tekrardan () veri kümesinden ve batch_size = params ['batch_size'] model.fit'den alınmıştır.

Yukarıdakiler feda etmeye hazır olduğunuz şey değilse, lütfen postayı göz ardı edin.

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

Çalışmıyor: TypeError: *: 'NoneType' ve 'int' için desteklenmeyen işlenen tür (ler)
Sami Belkacem

0

Bu ikinci hatayı, sığdırmak için _distribution_standardize_user_datageçmediğinde alırsınız batch_size.

Bu işlev için çalıştırdığınız kod burada:

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

Bir iz geri göndermediniz, ama bahse girerim 2294 hattında başarısız oluyor , çünkü bu bir batch_sizeşeyle çarpılan tek yer .

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

Ayarlayarak kapatabileceğiniz anlaşılıyor shuffle=False.

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

İşe yarıyor mu?


Teşekkürler, ama yine de shuffle = False ile aynı hatayı alıyorum. 2294 değil 2309 satırında başarısız oluyor.
Sami Belkacem

@SamiBelkacem, işte
mdaoust

0

Bu satırları kodunuzdan kaldırabilir ve deneyebilirsiniz:

    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)

Aksi takdirde, yazdıklarınızın tf.data.Dataset.from_tensor_sliceshata ile ilgisi vardır.


Hala çalışmıyor. Dediğiniz gibi, tf.data.Dataset'in hatayla ilgisi vardır. Ancak, belgeler bir Cloud TPU kullanırken dahil edilmesi gerektiğini söylüyor tensorflow.org/guide/tpu#input_datasets
Sami Belkacem
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.