微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Keras Tuner 和 keras Functional API

如何解决Keras Tuner 和 keras Functional API

对于代码底部错误,我真的很感激:

import numpy as np
import pandas as pd
import tensorflow as tf

from sklearn.model_selection import train_test_split
from tensorflow.keras import layers
from tensorflow.keras.layers.experimental import preprocessing
import os
import matplotlib.pyplot as plt
import pandas as pd
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
from tensorflow.keras.layers.experimental import preprocessing
import seaborn as sns
import numpy as np
pip install -q -U keras-tuner
import keras_tuner as kt
df = pd.read_csv("/content/credit-approval_csv.csv",delimiter=',')
train,test = train_test_split(df,test_size=0.2)
train,val = train_test_split(train,test_size=0.2)
print(len(train),'train examples')
print(len(val),'validation examples')
print(len(test),'test examples')
def df_to_dataset(dataframe,shuffle=True,batch_size=32):
  dataframe = df.copy()
  labels = dataframe.pop('class')
  ds = tf.data.Dataset.from_tensor_slices((dict(dataframe),labels))
  if shuffle:
    ds = ds.shuffle(buffer_size=len(dataframe))
  ds = ds.batch(batch_size)
  ds = ds.prefetch(batch_size)
  return ds
def get_normalization_layer(name,dataset):
  # Create a normalization layer for our feature.
  normalizer = preprocessing.normalization(axis=None)

  # Prepare a Dataset that only yields our feature.
  feature_ds = dataset.map(lambda x,y: x[name])

  # Learn the statistics of the data.
  normalizer.adapt(feature_ds)

  return normalizer
def get_category_encoding_layer(name,dataset,dtype,max_tokens=None):
  # Create a StringLookup layer which will turn strings into integer indices
  if dtype == 'string':
    index = preprocessing.StringLookup(max_tokens=max_tokens)
  else:
    index = preprocessing.IntegerLookup(max_tokens=max_tokens)

  # Prepare a Dataset that only yields our feature
  feature_ds = dataset.map(lambda x,y: x[name])

  # Learn the set of possible values and assign them a fixed integer index.
  index.adapt(feature_ds)

  # Create a discretization for our integer indices.
  encoder = preprocessing.CategoryEncoding(num_tokens=index.vocabulary_size())

  # Apply one-hot encoding to our indices. The lambda function captures the
  # layer so we can use them,or include them in the functional model later.
  return lambda feature: encoder(index(feature))
batch_size = 256
train_ds = df_to_dataset(train,batch_size=batch_size)
val_ds = df_to_dataset(val,shuffle=False,batch_size=batch_size)
test_ds = df_to_dataset(test,batch_size=batch_size)
all_inputs = []
encoded_features = []

# Numeric features.
for header in ['A2','A3','A8','A11','A14','A15']:
  numeric_col = tf.keras.Input(shape=(1,),name=header)
  normalization_layer = get_normalization_layer(header,train_ds)
  encoded_numeric_col = normalization_layer(numeric_col)
  all_inputs.append(numeric_col)
  encoded_features.append(encoded_numeric_col)
# Categorical features encoded as string.
categorical_cols = ['A13','A12','A10','A9','A7','A6','A5','A4','A1']
for header in categorical_cols:
  categorical_col = tf.keras.Input(shape=(1,name=header,dtype='string')
  encoding_layer = get_category_encoding_layer(header,train_ds,dtype='string',max_tokens=5)
  encoded_categorical_col = encoding_layer(categorical_col)
  all_inputs.append(categorical_col)
  encoded_features.append(encoded_categorical_col)
def build_model(hp):
  hp_units = hp.Int('units',min_value=1,max_value=1512,step=32)
  all_features = tf.keras.layers.concatenate(encoded_features)
  dense = layers.Dense(units=hp_units,activation="relu")
  x = dense(all_features)
  x = layers.Dense(units=hp_units,activation="relu")(x)
  x = layers.Dense(units=hp_units,activation="relu")(x)
  x = layers.Dropout(rate=0.5)(x)
  outputs = layers.Dense(units=hp_units)(x)
  
  model = tf.keras.Model(all_inputs,outputs)

  hp_learning_rate = hp.Choice('learning_rate',values=[1e-2,1e-3,1e-4])

  optimizer = hp.Choice("optimizer",["adam","sgd","RMSprop"])
  loss = hp.Choice("loss",["BinaryCrossentropy","CategoricalCrossentropy","SparseCategoricalCrossentropy"])

  model.compile(optimizer,loss,metrics=['accuracy'])

  return model
tuner = kt.Hyperband(build_model,objective='val_accuracy',max_epochs=10,factor=3,hyperband_iterations=1,directory='my_dir',project_name='intro_to_kt',overwrite=True)
tuner.search(train_ds,epochs=50,validation_data=val_ds)

这是发生以下错误时:

learning_rate     |0.001             |?                 
optimizer         |RMSprop           |?                 
loss              |CategoricalCros...|?                 
tuner/epochs      |2                 |?                 
tuner/initial_e...|0                 |?                 
tuner/bracket     |2                 |?                 
tuner/round       |0                 |?                 

Epoch 1/2
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-49-848b8addbd7e> in <module>()
----> 1 tuner.search(train_ds,validation_data=val_ds)

13 frames
/usr/local/lib/python3.7/dist-packages/tensorflow/python/framework/func_graph.py in wrapper(*args,**kwargs)
    984           except Exception as e:  # pylint:disable=broad-except
    985             if hasattr(e,"ag_error_Metadata"):
--> 986               raise e.ag_error_Metadata.to_exception(e)
    987             else:
    988               raise

ValueError: in user code:

    /usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/engine/training.py:855 train_function  *
        return step_function(self,iterator)
    /usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/engine/training.py:845 step_function  **
        outputs = model.distribute_strategy.run(run_step,args=(data,))
    /usr/local/lib/python3.7/dist-packages/tensorflow/python/distribute/distribute_lib.py:1285 run
        return self._extended.call_for_each_replica(fn,args=args,kwargs=kwargs)
    /usr/local/lib/python3.7/dist-packages/tensorflow/python/distribute/distribute_lib.py:2833 call_for_each_replica
        return self._call_for_each_replica(fn,args,kwargs)
    /usr/local/lib/python3.7/dist-packages/tensorflow/python/distribute/distribute_lib.py:3608 _call_for_each_replica
        return fn(*args,**kwargs)
    /usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/engine/training.py:838 run_step  **
        outputs = model.train_step(data)
    /usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/engine/training.py:797 train_step
        y,y_pred,sample_weight,regularization_losses=self.losses)
    /usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/engine/compile_utils.py:204 __call__
        loss_value = loss_obj(y_t,y_p,sample_weight=sw)
    /usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/losses.py:155 __call__
        losses = call_fn(y_true,y_pred)
    /usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/losses.py:259 call  **
        return ag_fn(y_true,**self._fn_kwargs)
    /usr/local/lib/python3.7/dist-packages/tensorflow/python/util/dispatch.py:206 wrapper
        return target(*args,**kwargs)
    /usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/losses.py:1644 categorical_crossentropy
        y_true,from_logits=from_logits)
    /usr/local/lib/python3.7/dist-packages/tensorflow/python/util/dispatch.py:206 wrapper
        return target(*args,**kwargs)
    /usr/local/lib/python3.7/dist-packages/tensorflow/python/keras/backend.py:4862 categorical_crossentropy
        target.shape.assert_is_compatible_with(output.shape)
    /usr/local/lib/python3.7/dist-packages/tensorflow/python/framework/tensor_shape.py:1161 assert_is_compatible_with
        raise ValueError("Shapes %s and %s are incompatible" % (self,other))

    ValueError: Shapes (None,1) and (None,609) are incompatible

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。