簡體   English   中英

KERAS 調諧器:“HyperParameters”類型的 object 沒有 len()

[英]KERAS TUNER: object of type 'HyperParameters' has no len()

這是我嘗試使用 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

但我對此也沒有任何想法

我或多或少有同樣的錯誤。 If you pay attention to to the keras-tuner in the tensorflow website https://www.tensorflow.org/tutorials/keras/keras_tuner or in the keras website, you see the following:

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

調諧器的第一個輸入是之前聲明為的 function 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封裝在 function 中。

干杯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM