tf.data.Dataset: Không được chỉ định đối số `batch_size` cho kiểu đầu vào đã cho


10

Tôi đang sử dụng Talos và Google colab TPU để chạy điều chỉnh siêu tham số của mô hình Keras . Lưu ý rằng tôi đang sử dụng Tensorflow 1.15.0 và 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)

Sau khi chuyển đổi tàu được đặt thành Bộ dữ liệu bằng cách sử dụng tf.data.Dataset, tôi gặp lỗi sau khi khớp mô hình với 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

Sau đó, nếu tôi làm theo các hướng dẫn đó và không đặt đối số kích thước lô thành model.fit. Tôi nhận được một lỗi khác trong:

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

Sẽ rất hữu ích cho lỗi cuối cùng đó nếu bạn có thể đăng toàn bộ dấu vết ngăn xếp, bởi vì chức năng đó dường như được gọi tại một loạt các vị trí trong tệp này, vì vậy tôi không thể biết bạn đang ở đâu: github.com/tensorflow/tensorflow /blob/r1.15/tensorflow/python/
mdaoust

Tôi chỉ chỉnh sửa câu hỏi, bạn có thể kiểm tra theo dõi ngăn xếp, cảm ơn bạn đã dành thời gian và sự quan tâm của bạn.
Sami Belkacem

Câu trả lời:


0

từ mã github :

ValueError sẽ được nâng lên nếu x là một trình tạo hoặc Sequencethể hiện và batch_sizeđược chỉ định như chúng tôi mong muốn người dùng cung cấp các bộ dữ liệu theo đợt.

Hãy thử sử dụng batch_size = None


Tôi nhận được lỗi khác trong _distribution_standardize_user_data (tự, x, y, sample_weight, class_weight, batch_size, validation_split, shuffle, kỷ nguyên, allow_partial_batch) Lỗi Loại: không được hỗ trợ loại toán hạng (s) cho *: 'NoneType' và 'int
Sami Belkacem

bạn cũng nên đặt step_per_epoch = Không có
Ioannis Nasios

Nó không hoạt động, tôi gặp một lỗi khác: ValueError: Cố gắng chuyển đổi một giá trị (Không có) với loại không được hỗ trợ (<class 'noneType'>) thành một Tenor. Tôi nghĩ bạn có thể dễ dàng tái tạo lỗi bằng cách sao chép chương trình ngắn
Sami Belkacem

0

Không chắc chắn nếu sau đây sẽ phù hợp với hóa đơn của bạn nhưng một cái gì đó để thử. Tất cả những gì tôi đã làm là lấy đi lặp lại () từ tập dữ liệu và batch_size = params ['batch_size'] từ model.fit

Nếu những điều trên không phải là những gì bạn đã sẵn sàng hy sinh thì hãy bỏ qua bài viết.

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

Nó không hoạt động: TypeError: loại toán hạng không được hỗ trợ cho *: 'noneType' và 'int'
Sami Belkacem

0

Đó là lỗi thứ hai mà bạn gặp phải _distribution_standardize_user_data, khi bạn không vượt quabatch_size để phù hợp.

Mã bạn đang chạy cho chức năng đó có ở đây:

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

Bạn đã không đăng một dấu vết, nhưng tôi cá là nó không thành công trên dòng 2294 , vì đó là nơi duy nhất batch_sizeđược nhân lên bởi một thứ gì đó.

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

Có vẻ như bạn có thể tắt nó bằng cách cài đặt shuffle=False.

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

Nó có hoạt động không?


Cảm ơn, nhưng tôi vẫn nhận được lỗi tương tự với shuffle = Sai. Nó không thành công trên dòng 2309, không phải 2294.
Sami Belkacem

@SamiBelkacem, đó '
mdaoust

0

Bạn có thể xóa, những dòng này từ mã của bạn và thử:

    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)

Nếu không, những gì bạn đã viết tf.data.Dataset.from_tensor_slicescó liên quan đến lỗi.


Vẫn không làm việc. Như bạn đã nói, tf.data.Dataset có liên quan đến lỗi. Tuy nhiên, tài liệu nói rằng cần phải đưa nó vào khi sử dụng một tenorflow
Sami Belkacem
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.