Как ввести одну переменную на последнем уровне в keras?

#python #tensorflow #keras

#python #тензорный поток #keras

Вопрос:

Я пытаюсь включить переменную на последнем шаге NN с прямой связью в Keras. Кажется, я могу заставить его работать только тогда, когда я включаю 2 столбца, а не только один. Вот мой пример кода:

Сначала я готовлю свои основные входные наборы данных:

 import pandas as pd
from keras.models import Model
from keras.layers import Dense, Input, Concatenate
from keras.optimizers import Adam

iris = pd.read_csv('https://raw.githubusercontent.com/mwaskom/seaborn-data/master/iris.csv')
iris.loc[:, 'target'] = (iris.species == "setosa").map(int)
train_x = iris.drop(columns=['target', 'species'])
train_y = iris['target'].map(int)
  

Затем я разделяюсь train_x на два отдельных фрейма данных и ввожу их в сеть в разных местах:

 feature_x = train_x.drop(columns='petal_width')
single_feature_x = train_x[['petal_width']]

input_x = Input(shape=feature_x.shape, name='feature_input')
single_input_x = Input(shape=single_feature_x.shape, name='single_input')

x = Dense(4, activation='relu')(input_x)

concat_feat = Concatenate(axis=-1, name='concat_fc')([x, single_input_x])

outputs = Dense(1, activation='sigmoid')(concat_feat)

model = Model(inputs=[input_x, single_input_x], outputs=outputs)
model.compile(loss='binary_crossentropy',
              optimizer=Adam(lr=0.001))

model.fit({'feature_input': feature_x,
           'single_input': single_feature_x},
          train_y,
          epochs=100,
          batch_size=512,
          verbose=1)
  

Это выдает ошибку:

 ValueError: Shape must be rank 2 but is rank 3 for '{{node model_5/concat_fc/concat}} = ConcatV2[N=2, T=DT_FLOAT, Tidx=DT_INT32](model_5/dense_10/Relu, model_5/Cast_1, model_5/concat_fc/concat/axis)' with input shapes: [?,4], [?,1,1], [].
  

Однако, если я добавлю эту одну строку, она будет работать просто отлично:

 feature_x = train_x.drop(columns='petal_width')
single_feature_x = train_x[['petal_width']]
# Add a constant column so the shape becomes (?,2)
single_feature_x.loc[:, 'constant'] = 0
  

Почему это работает с двумя столбцами, но не с одним?

Ответ №1:

вам просто нужно правильно указать форму ввода. В случае 2D-данных вам нужно передать только функцию dim. Размер выборки не требуется. Вам просто нужно исправить ввод в:

 input_x = Input(shape=feature_x.shape[1], name='feature_input')
single_input_x = Input(shape=single_feature_x.shape[1], name='single_input')
  

здесь работает ноутбук

Комментарии:

1. Спасибо! Я подумал, что это что-то с формами, но я не смог ее решить. Это работает как шарм.