tf.data.Dataset : 주어진 입력 유형에 대해`batch_size` 인수를 지정해서는 안됩니다


10

내가 사용하고 탈로스 와 구글 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

방금 질문을 편집했습니다. 스택 추적을 확인할 수 있습니다. 시간과 배려에 감사드립니다.
Sami Belkacem

답변:


0

에서 GitHub의 코드 :

x생성기 또는 Sequence인스턴스 인 경우 ValueError가 발생하며 batch_size사용자가 배치 된 데이터 세트를 제공 할 것으로 예상되는대로 지정됩니다.

사용해보십시오 batch_size = None


_distribution_standardize_user_data (self, x, y, sample_weight, class_weight, batch_size, validation_split, shuffle, epochs, allow_partial_batch)에 다른 오류가 발생합니다. TypeError : * : 'NoneType'및 'int
Sami Belkacem

당신은 또한 steps_per_epoch = 없음으로 설정해야합니다
요안 Nasios

작동하지 않습니다. 다른 오류가 발생합니다. ValueError : 지원되지 않는 유형 (<class 'NoneType'>)의 값 (없음)을 Tensor로 변환하려고했습니다. 짧은 프로그램을 복사하면 쉽게 오류를 재현 할 수 있다고 생각합니다
Sami Belkacem

0

다음이 청구서에 맞는지 확실하지 않지만 시도해 볼만한 것입니다. 내가 한 것은 dataset에서 repeat ()을 제거하고 model.fit에서 batch_size = params [ 'batch_size']를 제거하는 것입니다.

위의 내용이 희생 준비가되어 있지 않은 경우 게시물을 무시하십시오.

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

작동합니까?


고맙지 만 shuffle = False와 동일한 오류가 계속 발생합니다. 2294가 아니라 2309 행에서 실패합니다.
Sami Belkacem

@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은 오류와 관련이 있습니다. 그러나 설명서에는 Cloud TPU를 사용할 때 포함해야 한다고 tensorflow.org/guide/tpu#input_datasets
Sami Belkacem
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.