#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