почему входные данные несовместимы со слоем model_16?

#tensorflow #keras #conv-neural-network #layer #max-pooling

#tensorflow #keras #conv-нейронная сеть #слой #максимальное объединение

Вопрос:

Я обучаю свою модель, чтобы классифицировать этапы ожидания, после извлечения объектов из моего сигнала я собрал объекты (X) в фрейме данных с формой (335,48) и y (метки) в форме (335,)

это мой код :

 def get_base_model():
    inp = Input(shape=(335,48))
    img_1 = Convolution1D(16, kernel_size=5, activation=activations.relu, padding="valid")(inp)
    img_1 = Convolution1D(16, kernel_size=5, activation=activations.relu, padding="valid")(img_1)
    img_1 = MaxPool1D(pool_size=2)(img_1)
    img_1 = SpatialDropout1D(rate=0.01)(img_1)
    img_1 = Convolution1D(32, kernel_size=3, activation=activations.relu, padding="valid")(img_1)
    img_1 = Convolution1D(32, kernel_size=3, activation=activations.relu, padding="valid")(img_1)
    img_1 = MaxPool1D(pool_size=2)(img_1)
    img_1 = SpatialDropout1D(rate=0.01)(img_1)
    img_1 = Convolution1D(32, kernel_size=3, activation=activations.relu, padding="valid")(img_1)
    img_1 = Convolution1D(32, kernel_size=3, activation=activations.relu, padding="valid")(img_1)
    img_1 = MaxPool1D(pool_size=2)(img_1)
    img_1 = SpatialDropout1D(rate=0.01)(img_1)
    img_1 = Convolution1D(256, kernel_size=3, activation=activations.relu, padding="valid")(img_1)
    img_1 = Convolution1D(256, kernel_size=3, activation=activations.relu, padding="valid")(img_1)
    img_1 = GlobalMaxPool1D()(img_1)
    img_1 = Dropout(rate=0.01)(img_1)

    dense_1 = Dropout(0.01)(Dense(64, activation=activations.relu, name="dense_1")(img_1))

    base_model = models.Model(inputs=inp, outputs=dense_1)
    opt = optimizers.Adam(0.001)

    base_model.compile(optimizer=opt, loss=losses.sparse_categorical_crossentropy, metrics=['acc'])
    model.summary()
    return base_model
model=get_base_model()

test_loss, test_acc = model.evaluate(Xtest, ytest, verbose=0) 
model.fit(X,y)
print('nTest accuracy:', test_acc)
 

Я получил ошибку :
Ввод 0 несовместим со слоем model_16: ожидаемая форма = (Нет, 335, 48), найденная форма = (Нет, 48)

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

1. @AkshaySehgal спасибо, что ответили мне, вот весь код, не могли бы вы, пожалуйста, направить меня: colab.research.google.com/drive /…

Ответ №1:

Вот что вам нужно сделать.

  1. В качестве входных данных вам не нужно указывать (355, 48) размер входных данных. Первый канал автоматически устанавливается на none . Установка его в (48,) значение позволит вам передавать 48 объектов для каждого образца.
  2. Conv1D ожидает 2D-тензор, поэтому используйте layers.Reshape для изменения (48,) на (48,1)
  3. Большое количество maxpools вызывает некоторые проблемы, поэтому я удалил некоторые блоки conv1d и обновил размеры ядра, чтобы у вас не заканчивались функции для свертки.
 from tensorflow.keras.layers import *
from tensorflow.keras import activations, losses, optimizers, models

def get_base_model():
    inp = Input(shape=(48,))
    x = Reshape((-1,1))(inp)
    img_1 = Convolution1D(16, kernel_size=3, activation=activations.relu, padding="valid")(x)
    img_1 = Convolution1D(16, kernel_size=3, activation=activations.relu, padding="valid")(img_1)
    img_1 = MaxPool1D(pool_size=2)(img_1)
    img_1 = SpatialDropout1D(rate=0.01)(img_1)
    img_1 = Convolution1D(32, kernel_size=2, activation=activations.relu, padding="valid")(img_1)
    img_1 = Convolution1D(32, kernel_size=2, activation=activations.relu, padding="valid")(img_1)
    img_1 = MaxPool1D(pool_size=2)(img_1)
    img_1 = SpatialDropout1D(rate=0.01)(img_1)
    img_1 = Convolution1D(256, kernel_size=3, activation=activations.relu, padding="valid")(img_1)
    img_1 = Convolution1D(256, kernel_size=3, activation=activations.relu, padding="valid")(img_1)
    img_1 = GlobalMaxPool1D()(img_1)
    img_1 = Dropout(rate=0.01)(img_1)

    dense_1 = Dropout(0.01)(Dense(64, activation=activations.relu, name="dense_1")(img_1))

    base_model = models.Model(inputs=inp, outputs=dense_1)
    opt = optimizers.Adam(0.001)

    base_model.compile(optimizer=opt, loss=losses.sparse_categorical_crossentropy, metrics=['acc'])
    model.summary()
    return base_model

model = get_base_model()

X = np.random.random((335, 48))
y = np.random.random((335,))

model.fit(X, y, epochs=4)
 
 Model: "functional_194"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_158 (InputLayer)       [(None, 48)]              0         
_________________________________________________________________
reshape_48 (Reshape)         (None, 48, 1)             0         
_________________________________________________________________
conv1d_57 (Conv1D)           (None, 46, 16)            64        
_________________________________________________________________
conv1d_58 (Conv1D)           (None, 44, 16)            784       
_________________________________________________________________
max_pooling1d_21 (MaxPooling (None, 22, 16)            0         
_________________________________________________________________
spatial_dropout1d_21 (Spatia (None, 22, 16)            0         
_________________________________________________________________
conv1d_59 (Conv1D)           (None, 21, 32)            1056      
_________________________________________________________________
conv1d_60 (Conv1D)           (None, 20, 32)            2080      
_________________________________________________________________
max_pooling1d_22 (MaxPooling (None, 10, 32)            0         
_________________________________________________________________
spatial_dropout1d_22 (Spatia (None, 10, 32)            0         
_________________________________________________________________
conv1d_61 (Conv1D)           (None, 8, 256)            24832     
_________________________________________________________________
conv1d_62 (Conv1D)           (None, 6, 256)            196864    
_________________________________________________________________
global_max_pooling1d_6 (Glob (None, 256)               0         
_________________________________________________________________
dropout_12 (Dropout)         (None, 256)               0         
_________________________________________________________________
dense_1 (Dense)              (None, 64)                16448     
_________________________________________________________________
dropout_13 (Dropout)         (None, 64)                0         
=================================================================
Total params: 242,128
Trainable params: 242,128
Non-trainable params: 0


Epoch 1/4
11/11 [==============================] - 0s 19ms/step - loss: 8.6069 - acc: 0.0000e 00
Epoch 2/4
11/11 [==============================] - 0s 9ms/step - loss: 4.1998 - acc: 0.0000e 00
Epoch 3/4
11/11 [==============================] - 0s 11ms/step - loss: 4.1589 - acc: 0.0000e 00
Epoch 4/4
11/11 [==============================] - 0s 10ms/step - loss: 4.1820 - acc: 0.0000e 00
 

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

1. Я получил сообщение об ошибке: имя ‘Reshape’ не определено

2. from tensorflow.keras.layers import Reshape Пожалуйста, импортируйте это. Обновил мой ответ тем же.

3. Дайте мне знать, если вы сможете запустить код сейчас. Отметьте ответ, если вы можете, иначе, пожалуйста, обновите вопрос с проблемой, с которой вы столкнулись.

4. его компиляция сейчас, но почему я получаю точность 0?

5. Это связано с вашими данными, а не с вашей архитектурой. Может быть, вы не используете правильную архитектуру для правильной задачи? Я бы посоветовал начать с более простой модели с плотными слоями вместо использования Conv nets.