KERAS TUNER: объект типа 'HyperParameters' не имеет len () - PullRequest
2 голосов
/ 05 мая 2020

вот мой код, пытающийся использовать KERAS TUNER:

datagen = ImageDataGenerator(
    rescale=1.0/255.0,
    zoom_range=[-2, 2],
    width_shift_range=[-25, 25],
    height_shift_range=[-25, 25],
    rotation_range=40,
    shear_range=40,
    horizontal_flip=True,
    vertical_flip=True,
    brightness_range=[0.98,1.05],
    featurewise_center=True,
    samplewise_center=True,
    # channel_shift_range=1.5,
    #featurewise_center=True,
    #featurewise_std_normalization=True,
    validation_split=0.10)

mean,std=auxfunctions.getMeanStdClassification()
datagen.mean=mean
datagen.std=std

numClasses = 5
width=240 #diabetic retinopaty 120 120, drRafael 40 40, 96 96
height=240
input_shape=(width,height,3)

train_generator = datagen.flow_from_dataframe(
        dataframe=trainLabels,
        directory='./resized_train_cropped',
        x_col="image",
        y_col="level",
        target_size=(240,240),
        batch_size=16,
        class_mode='categorical',
        color_mode='rgb', #quitar o no quitar
        subset='training')

validation_generator =datagen.flow_from_dataframe(
        dataframe=trainLabels,
        directory='./resized_train_cropped',
        x_col="image",
        y_col="level",
        target_size=(240,240),
        batch_size=16,
        class_mode='categorical',
        color_mode='rgb',
        subset='validation')
#----------------------------------------------------------------------------------------

def createBaseNetwork(input_shape):
    weight_decay = 1e-4
    L2_norm = regularizers.l2(weight_decay)

    input = Input(shape=input_shape)
    print(input)

    x = Conv2D(96, (9, 9), activation='relu', name='conv1', kernel_regularizer=L2_norm)(input)
    x = MaxPooling2D((3, 3), name='pool1')(x)
    x = BatchNormalization(axis=-1, momentum=0.99, epsilon=0.001)(x)

    x = Conv2D(384, (5, 5), activation='relu', name='conv2', kernel_regularizer=L2_norm)(x)
    x = MaxPooling2D((3, 3), name='pool2')(x)
    x = BatchNormalization(axis=-1, momentum=0.99, epsilon=0.001)(x)

    x = Conv2D(384, (3, 3), activation='relu', name='conv3')(x)
    x = Conv2D(384, (3, 3), activation='relu', name='conv4')(x)
    x = Conv2D(256, (3, 3), activation='relu', name='conv5')(x)
    x = MaxPooling2D((3, 3), name='pool3')(x)

    x = Flatten()(x)
    x = Dense(4096, activation='relu', name='fc1')(x)

    return Model(input, x)


# ---------------------------------------------------------------------------------
hp=HyperParameters()
baseNetwork=createBaseNetwork(input_shape)
#baseNetwork.load_weights('./ModelWeights2.h5',by_name=True)
for l in baseNetwork.layers:
    l.trainable=True
input_a = Input(shape=input_shape,name='input1')
outLayers = baseNetwork(input_a)
outLayers = Dense(2048, activation='relu', name='fc3')(outLayers)
outLayers= Dropout(0.2)(outLayers)
outLayers = Dense(1024, activation='relu', name='fc4')(outLayers)
outLayers= Dropout(0.2)(outLayers)
outLayers = Dense(hp.Int('input_units',min_value=32,max_value=512), activation='relu', name='fc5')(outLayers)
classifier = Dense(numClasses, activation='softmax', name='predictions')(outLayers)

model = Model(input_a, classifier)
model.summary()

tuner = RandomSearch(
    model,
    objective='val_accuracy',
    max_trials=1,
    executions_per_trial=1,
    directory='./logtunner'
)
tuner.search(
    train_generator,
    validation_data=validation_generator,
    epochs=1,

)

Сейчас я просто пытаюсь использовать его на последнем плотном слое, как вы можете видеть, я просто хочу стимулировать большое количество нейронов. с этим:

hp.Int('input_units',min_value=32,max_value=512)

Но я получаю такую ​​ошибку:

ValueError: TypeError: object of type 'HyperParameters' has no len()

Я не знаю, как ее решить, я провел часы, просматривая видео и учебные пособия, но не знаю, что это такое происходит.

Я также понимаю, что есть еще одно сообщение об ошибке:

This function does not handle the case of the path where all inputs are not already EagerTensors

Но я тоже не знаю об этом

1 Ответ

0 голосов
/ 20 августа 2020

У меня была примерно такая же ошибка. Если вы обратите внимание на keras-тюнер на сайте tenorflow https://www.tensorflow.org/tutorials/keras/keras_tuner или на сайте keras, вы увидите следующее:

tuner = kt.Hyperband(model_builder,
                     objective = 'val_accuracy', 
                     max_epochs = 10,
                     factor = 3,
                     directory = 'my_dir',
                     project_name = 'intro_to_kt')  

первый вход в тюнер функция model_builder, объявленная ранее как

def model_builder(hp):
  model = keras.Sequential()
  model.add(keras.layers.Flatten(input_shape=(28, 28)))
  
  # Tune the number of units in the first Dense layer
  # Choose an optimal value between 32-512
  hp_units = hp.Int('units', min_value = 32, max_value = 512, step = 32)
  model.add(keras.layers.Dense(units = hp_units, activation = 'relu'))
  model.add(keras.layers.Dense(10))

  # Tune the learning rate for the optimizer 
  # Choose an optimal value from 0.01, 0.001, or 0.0001
  hp_learning_rate = hp.Choice('learning_rate', values = [1e-2, 1e-3, 1e-4]) 
  
  model.compile(optimizer = keras.optimizers.Adam(learning_rate = hp_learning_rate),
                loss = keras.losses.SparseCategoricalCrossentropy(from_logits = True), 
                metrics = ['accuracy'])
  
  return model

Итак, все, что вам нужно, это реорганизовать свой код, чтобы он следовал той же структуре. Вам нужно инкапсулировать keras model и keras-tuner hp внутри функции.

Ура.

...