#python #keras #output #flatten
#python #keras #вывод #сгладить
Вопрос:
Я адаптировал архитектуру AlexNet для одномерных данных следующим образом:
import keras
from keras.models import Sequential
from keras.layers import Dense, Activation, Dropout, Flatten, Conv1D, MaxPooling1D
from keras.layers.normalization import BatchNormalization
import numpy as np
np.random.seed(1000)
#Instantiate an empty model
model = Sequential()
# 1st Convolutional Layer
model.add(layers.Embedding(vocab_size, embedding_dim, input_length=input_length))
model.add(Conv1D(filters=96, kernel_size=11, strides=4, padding='same'))
model.add(Activation('relu'))
# Max Pooling
model.add(MaxPooling1D(pool_size=2, strides=2, padding='same'))
# model.add(Flatten())
# 2nd Convolutional Layer
model.add(Conv1D(filters=256, kernel_size=11, strides=1, padding='same'))
model.add(Activation('relu'))
# Max Pooling
model.add(MaxPooling1D(pool_size=2, strides=2, padding='same'))
# model.add(Flatten())
# 3rd Convolutional Layer
model.add(Conv1D(filters=384, kernel_size=3, strides=1, padding='same'))
model.add(Activation('relu'))
# 4th Convolutional Layer
model.add(Conv1D(filters=384, kernel_size=3, strides=1, padding='same'))
model.add(Activation('relu'))
# 5th Convolutional Layer
model.add(Conv1D(filters=256, kernel_size=3, strides=1, padding='same'))
model.add(Activation('relu'))
# Max Pooling
model.add(MaxPooling1D(pool_size=2, strides=2, padding='same'))
# Passing it to a Fully Connected layer
model.add(Flatten())
# 1st Fully Connected Layer
model.add(Dense(4096, input_shape=(10,39424)))
model.add(Activation('relu'))
# Add Dropout to prevent overfitting
model.add(Dropout(0.4))
# 2nd Fully Connected Layer
model.add(Dense(4096))
model.add(Activation('relu'))
# Add Dropout
model.add(Dropout(0.4))
# 3rd Fully Connected Layer
model.add(Dense(1000))
model.add(Activation('relu'))
# Add Dropout
model.add(Dropout(0.4))
# Output Layer
model.add(Dense(8))
model.add(Activation('softmax'))
model.summary()
# Compile the model
model.compile(loss=keras.losses.categorical_crossentropy, optimizer='adam', metrics=['accuracy'])
Однако я получил следующую ошибку:
ValueError: Input 0 of layer dense_30 is incompatible with the layer: expected axis -1 of input shape
to have value 39424 but received input with shape [10, 23552]
Я не могу понять, почему flatten layer выдает вывод [10, 23552] .. Это должно дать 39424!!
проблема в том, что первый плотный слой получил непредсказуемую форму данных от слоя flatten!!
Я думаю, что слой выравнивания должен выводить одномерные данные, а не 2D, как то, что он делает ([10, 23552])
Краткое описание модели выглядит следующим образом:
Model: "sequential_15"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
embedding_13 (Embedding) (None, 4924, 128) 6400
_________________________________________________________________
conv1d_40 (Conv1D) (None, 1231, 96) 135264
_________________________________________________________________
activation_47 (Activation) (None, 1231, 96) 0
_________________________________________________________________
max_pooling1d_25 (MaxPooling (None, 616, 96) 0
_________________________________________________________________
conv1d_41 (Conv1D) (None, 616, 256) 270592
_________________________________________________________________
activation_48 (Activation) (None, 616, 256) 0
_________________________________________________________________
max_pooling1d_26 (MaxPooling (None, 308, 256) 0
_________________________________________________________________
conv1d_42 (Conv1D) (None, 308, 384) 295296
_________________________________________________________________
activation_49 (Activation) (None, 308, 384) 0
_________________________________________________________________
conv1d_43 (Conv1D) (None, 308, 384) 442752
_________________________________________________________________
activation_50 (Activation) (None, 308, 384) 0
_________________________________________________________________
conv1d_44 (Conv1D) (None, 308, 256) 295168
_________________________________________________________________
activation_51 (Activation) (None, 308, 256) 0
_________________________________________________________________
max_pooling1d_27 (MaxPooling (None, 154, 256) 0
_________________________________________________________________
flatten_13 (Flatten) (None, 39424) 0
_________________________________________________________________
dense_30 (Dense) (None, 4096) 161484800
_________________________________________________________________
activation_52 (Activation) (None, 4096) 0
_________________________________________________________________
dropout_18 (Dropout) (None, 4096) 0
_________________________________________________________________
dense_31 (Dense) (None, 4096) 16781312
_________________________________________________________________
activation_53 (Activation) (None, 4096) 0
_________________________________________________________________
dropout_19 (Dropout) (None, 4096) 0
_________________________________________________________________
dense_32 (Dense) (None, 1000) 4097000
_________________________________________________________________
activation_54 (Activation) (None, 1000) 0
_________________________________________________________________
dropout_20 (Dropout) (None, 1000) 0
_________________________________________________________________
dense_33 (Dense) (None, 8) 8008
_________________________________________________________________
activation_55 (Activation) (None, 8) 0
=================================================================
Total params: 183,816,592
Trainable params: 183,816,592
Non-trainable params: 0
какие-нибудь подсказки?
Комментарии:
1. Я думаю, ошибка возникает во время обучения, верно? Какую форму имеет ваш ввод? Сама сеть выглядит нормально, вам не нужно указывать
, input_shape=(10,39424)
в первом плотном слое после слоя выравнивания, но это не должно быть проблемой.2. да, это возникает после первой эпохи. форма ввода для первого плотного слоя должна быть 39424 (согласно сводке модели), потому что она выходит из слоя flatten . но ошибка говорит, что она получает входные данные как [10, 23552] ! ! , это так запутанно
3. Почему вы задаете форму ввода одному из ваших промежуточных слоев? model.add(Плотный(4096, input_shape=(10,39424))) Форма ввода присваивается только первому уровню сети, и, конечно же, при этом выдается сообщение об ошибке.
4. да, это была ошибка, я не должен был определять форму ввода для этого слоя. однако ошибка возникла из-за опечатки, которая изменила входные формы обучающего и тестового наборов . когда я исправил опечатку, код работал нормально.