tf.data.Dataset: ไม่ต้องระบุอาร์กิวเมนต์ `batch_size` สำหรับประเภทอินพุตที่กำหนด


10

ฉันใช้Talosและ Google colab TPUเพื่อเรียกใช้การปรับจูนพารามิเตอร์ของโมเดล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 :

ValueError จะถูกเพิ่มหากxเป็นตัวสร้างหรือSequenceอินสแตนซ์และbatch_sizeมีการระบุตามที่เราคาดหวังให้ผู้ใช้จัดทำชุดข้อมูลเป็นกลุ่ม

ลองใช้ดู batch_size = None


ฉันได้รับข้อผิดพลาดอื่นใน _distribution_standardize_user_data (ตัวเอง, x, y, sample_weight, class_weight, batch_size, validation_split สับเปลี่ยน epochs, allow_partial_batch) TypeError: ชนิดถูกดำเนินการได้รับการสนับสนุน (s) สำหรับ *: 'NoneType' และ 'int
เซ Belkacem

คุณควรตั้ง steps_per_epoch = ไม่มี
Ioannis Nasios

ไม่ทำงานฉันได้รับข้อผิดพลาดอื่น: ValueError: พยายามแปลงค่า (ไม่มี) ด้วยประเภทที่ไม่รองรับ (<class 'NoneType'>) เป็น Tensor ฉันคิดว่าคุณสามารถทำซ้ำข้อผิดพลาดได้อย่างง่ายดายโดยการคัดลอกโปรแกรมสั้น ๆ
Sami Belkacem

0

ไม่แน่ใจว่าสิ่งต่อไปนี้จะพอดีกับใบเรียกเก็บเงินของคุณ แต่เป็นสิ่งที่ต้องลอง สิ่งที่ฉันทำไปแล้วจะถูกนำออกจากการทำซ้ำ () จากชุดข้อมูลและ batch_size = params ['batch_size'] จาก model.fit

หากข้างต้นไม่ใช่สิ่งที่คุณพร้อมที่จะเสียสละโปรดละเว้นโพสต์

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 มันล้มเหลวในบรรทัด 2309 ไม่ใช่ 2294
Sami Belkacem

@SamiBelkacem, that '
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.