#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:
Вот что вам нужно сделать.
- В качестве входных данных вам не нужно указывать
(355, 48)
размер входных данных. Первый канал автоматически устанавливается наnone
. Установка его в(48,)
значение позволит вам передавать 48 объектов для каждого образца. - Conv1D ожидает 2D-тензор, поэтому используйте
layers.Reshape
для изменения(48,)
на(48,1)
- Большое количество 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.