tf.data.Dataset: दिए गए इनपुट प्रकार के लिए `बैच_साइज़` तर्क निर्दिष्ट नहीं होना चाहिए


10

मैं उपयोग कर रहा हूँ Talos और गूगल colab TPU एक की hyperparameter ट्यूनिंग चलाने के लिए Keras मॉडल। ध्यान दें कि मैं Tensorflow 1.15.0 और 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)

ट्रेन सेट को डेटासेट में उपयोग tf.data.Datasetकरने के बाद, मुझे मॉडल को फिट करते समय निम्न त्रुटि मिलती है 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

फिर, अगर मैं उन निर्देशों का पालन करता हूं और बैच-आकार तर्क को सेट नहीं करता हूं model.fit। मुझे इसमें एक और त्रुटि मिली:

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

यह उस अंतिम त्रुटि के लिए उपयोगी होगा यदि आप एक संपूर्ण स्टैक ट्रेस पोस्ट कर सकते हैं, क्योंकि यह फ़ंक्शन इस फ़ाइल में स्थानों के एक समूह में कहा जाता है, इसलिए मैं नहीं बता सकता कि आप कहां हैं: github.com/tensorflow/tensorflow /blob/r1.15/tensorflow/python/...
mdaoust

मैंने अभी प्रश्न संपादित किया है, आप स्टैक ट्रेस की जांच कर सकते हैं, आपके समय और विचार के लिए धन्यवाद।
सामी बेलकेसम

जवाबों:


0

से GitHub कोड :

अगर xजनरेटर या Sequenceइंस्टेंस है तो ValueError को उठाया जाएगा और batch_sizeजैसा कि हम उम्मीद करते हैं कि उपयोगकर्ता बैचेड डेटासेट प्रदान करेंगे।

प्रयोग करके देखें batch_size = None


के लिए * असमर्थित संकार्य प्रकार (ओं):: मैं _distribution_standardize_user_data (स्वयं, एक्स, वाई, sample_weight, class_weight, batch_size, validation_split, फेरबदल, अवधियों को, allow_partial_batch) लेखन त्रुटि में एक और त्रुटि मिलती है 'NoneType' और 'int
सामी Belkacem

आपको चरण_पर_पॉच = कोई भी नहीं सेट करना चाहिए
Ioannis

यह काम नहीं करता है, मुझे एक और त्रुटि मिलती है: ValueError: एक मान को (कोई भी) एक असमर्थित प्रकार (<वर्ग 'noneType'>) के साथ एक Tensor में बदलने का प्रयास करें। मुझे लगता है कि आप कम प्रोग्राम को आसानी से कॉपी करके आसानी से पुन: उत्पन्न कर सकते हैं
सामी बेलकेसम

0

निश्चित नहीं है कि निम्नलिखित आपके बिल में फिट होगा लेकिन कोशिश करने के लिए कुछ। मेरे द्वारा किए गए सभी डेटासेट और बैच_सेज़ = पैरामेट्स ['बैच_साइज़'] मॉडल.फिट से रिपीट () बंद हो जाते हैं

यदि उपरोक्त आप बलिदान करने के लिए तैयार नहीं हैं, तो कृपया पोस्ट को अनदेखा करें।

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

यह काम नहीं कर रहा है: TypeError: असमर्थित ऑपरेंड प्रकार (ओं) के लिए *: 'noneType' और 'int'
Sami Belkacem

0

_distribution_standardize_user_dataजब आप पास नहीं करते हैं, तो वह दूसरी त्रुटि आपको मिलती हैbatch_size फिट होने लिए है।

उस फ़ंक्शन के लिए आपके द्वारा चलाया जा रहा कोड यहां है:

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

आपने एक ट्रेस-बैक पोस्ट नहीं किया, लेकिन मुझे यकीन है कि यह रेखा 2294 पर विफल हो रही है , क्योंकि यह एकमात्र ऐसी जगह है जहां batch_sizeकिसी चीज से गुणा किया जाता है।

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

ऐसा लगता है कि आप सेटिंग करके इसे बंद कर सकते हैं shuffle=False

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

क्या वह काम करता है?


धन्यवाद, लेकिन मैं अभी भी फेरबदल = गलत के साथ एक ही त्रुटि प्राप्त करता हूं। यह रेखा 2309 पर विफल हो रही है, 2294 पर नहीं।
सामी

@SamiBelkacem, कि '
mdaoust

0

क्या आप अपने कोड से इन पंक्तियों को हटा सकते हैं और आज़मा सकते हैं:

    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)

अन्यथा आपने जो लिखा है tf.data.Dataset.from_tensor_slicesवह त्रुटि के साथ कुछ करना है।


अभी भी काम नहीं कर रहा है। जैसा कि आपने कहा, tf.data.Dataset का त्रुटि से कुछ लेना-देना है। लेकिन, प्रलेखन का कहना है कि क्लाउड TPU tensorflow.org/guide/tpu#input_datasets
Sami
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.