Запуск RandomizedSearchCV с классификатором нейронных сетей с несколькими входами/выходами

#python #keras #scikit-learn #tf.keras

#python #keras #scikit-learn #tf.keras

Вопрос:

Чтобы создать минимальный рабочий пример, мы будем использовать набор данных mnist, поставляемый с keras.

 (x_train,y_train),(x_test,y_test)=mnist.load_data() partial_x_train=x_train[:50000]/255 x_val=x_train[50000:]/255  partial_y_train=y_train[:50000] y_val=y_train[50000:] # Let's assume we have two outputs partial_y_train_output1=partial_y_train partial_y_train_output2=partial_y_train y_val_output1=y_val y_val_output2=y_val  

Здесь приведено динамическое определение модели NN:

 class simple_model(keras.Model):  def __init__(self,units=30,activation="relu",**kwargs):   # default values for units and activation  super().__init__(**kwargs)  self.hidden1=keras.layers.Dense(units=units,activation=activation)  self.hidden2=keras.layers.Dense(units=units,activation=activation)  self.output1=keras.layers.Dense(10,activation="softmax")  self.output2=keras.layers.Dense(10,activation="softmax")    def call(self,inputs):  input1,input2=inputs  input1=keras.layers.Flatten()(input1)  input2=keras.layers.Flatten()(input2)  hidden1=self.hidden1(input1)  hidden2=self.hidden2(input2)  concate=keras.layers.concatenate([hidden1,hidden2])  output1=self.output1(concate)  output2=self.output2(hidden2)  return output1,output2  

Затем я определяю функцию, которая будет обернута вокруг.

 def build_compile_simple_model(learning_rate=3e-3,**kwargs):  # units,activation, and other kwargs  model=simple_model(**kwargs)  optimizer=keras.optimizer.SGD(lr=learning_rate)  model.compile(optimizer=optimizer,  # we must use sparse, since we have sparse labels  loss=[tf.keras.losses.SparseCategoricalCrossentropy(),  tf.keras.losses.SparseCategoricalCrossentropy()],  loss_weights=[0.9,0.1],  metrics=["accuracy","mse"])  return model  

Завершая это:

 keras_NN_scikit=keras.wrappers.scikit_learn.KerasClassifier(build_compile_simple_model)  

Определение гиперпараметров, которые будут опробованы:

 param_dist={  "units":np.arange(30,170,20),  "activation":["sigmoid","softplus","tanh"],  "learning_rate":reciprocal(3e-4,3e-2) }  

И, наконец, с помощью RandomizedSearchCV:

 rdm_search_cv=RandomizedSearchCV(keras_NN_scikit, param_dist, n_iter=10,cv=3)  rdm_search_cv.fit((partial_x_train,partial_x_train),  (partial_y_train_output1,partial_y_train_output2),  epochs=10,  #batch_size=512,  validation_data=((x_val,x_val),  (y_val_output1,y_val_output2)),  callbacks=[early_stopping_cb],   verbose=2)    

When I run the above, after importing the usual modules, I get:

 ValueError: Cannot have number of splits n_splits=3 greater than the number of samples: n_samples=2.  

This makes me think that rdm_search_cv thinks that the multiple input(dim=2) is in fact just 2 samples…

How does one use a multiple input/output NN with RandomizedSearchCV?

Edit: The imports are the following:

 import tensorflow as tf from tensorflow import keras from tensorflow.keras import models from tensorflow.keras import layers from keras.datasets import mnist  import pandas as pd  import numpy as np   from sklearn.model_selection import train_test_split, RandomizedSearchCV from scipy.stats import reciprocal