tf.data.Dataset: input batch_size` আর্গুমেন্ট প্রদত্ত ইনপুট ধরণের জন্য নির্দিষ্ট করা উচিত নয়


10

আমি ব্যবহার করছি Talos এবং Google colab নমনীয় একটি এর hyperparameter টিউনিং চালানোর জন্য Keras মডেল। নোট করুন যে আমি টেনসরফ্লো 1.15.0 এবং কেরাস 2.2.4-টিএফ ব্যবহার করছি।

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/…
এমডিউস্ট

আমি কেবল প্রশ্নটি সম্পাদনা করেছি, আপনি স্ট্যাক ট্রেসটি পরীক্ষা করতে পারেন, আপনার সময় এবং বিবেচনার জন্য আপনাকে ধন্যবাদ।
সামি বেলক্যাসেম

উত্তর:


0

গিথুব কোড থেকে :

যদি xকোনও জেনারেটর বা Sequenceদৃষ্টান্ত হয় এবং batch_sizeমান ব্যবহারকারীরা ব্যাচড ডেটাসেট সরবরাহের প্রত্যাশা অনুযায়ী সুনির্দিষ্টভাবে মান উত্থাপিত হয় ।

ব্যবহার করার চেষ্টা করুন batch_size = None


জন্য * অসমর্থিত প্রতীক টাইপ (গুলি):: আমি _distribution_standardize_user_data (স্ব x, y, sample_weight, class_weight, batch_size, validation_split, এলোমেলো, সময়কাল, allow_partial_batch) TypeError অন্য ভুল পান 'NoneType' এবং 'int- এ
সামি Belkacem

আপনার পদক্ষেপ_পার_পোচ = কোনওটি সেট করা উচিত নয়
আইওনিস নাসিওস

এটি কাজ করে না, আমি আরেকটি ত্রুটি পেয়েছি: ভ্যালুআরর: একটি অসমর্থিত ধরণের (<শ্রেণি 'ননটাইপ'>) দিয়ে একটি মানকে (কোনও নয়) একটি টেনসরে রূপান্তর করার চেষ্টা। আমি মনে করি আপনি সংক্ষিপ্ত প্রোগ্রামটি অনুলিপি করে সহজেই ত্রুটিটি পুনরুত্পাদন করতে পারবেন
সামি বেলক্যাসেম

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: *: 'NoType' এবং 'int' এর জন্য অসমর্থিত অপরেন্দ্র প্রকার (গুলি)
সামি

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

ওইটা কি কাজ করে?


ধন্যবাদ, তবে আমি এখনও একই ত্রুটিটি এলোমেলো = মিথ্যা দিয়ে পেয়েছি। এটি 2294 নয়, 2309 লাইনে ব্যর্থ হচ্ছে
সামি

@ সামিবেলক্যাসেম, এটি '
এমডিউস্টে

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 এর ত্রুটির সাথে কিছু করার আছে। তবে, ডকুমেন্টেশনটিতে বলা হয়েছে যে ক্লাউড টিপিইউ টেনসরফ্লো.আর
সামি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.