Заменить MLP на CNN - PullRequest
       3

Заменить MLP на CNN

0 голосов
/ 27 января 2020

Я создал NN со следующей архитектурой:

X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=0)

print(X_train.shape, X_test.shape, Y_train.shape, Y_test.shape)
(1901, 456, 3) (476, 456, 3) (1901, 3, 3) (476, 3, 3)

model = Sequential()

model.add(Flatten(input_shape=(456,3)))

model.add(Dense(64, activation='relu'))

model.add(Dense(32, activation='relu'))

model.add(Dense(3 * 3))

model.add(Reshape((3, 3)))

model.compile('adam', 'mse')

history = model.fit(X_train, Y_train, validation_data=(X_test, Y_test), epochs=100)

Теперь я хочу заменить эту архитектуру на аналоговый CNN, который делает то же самое; но при попытке реализовать это у меня всегда возникают проблемы с размерами разных слоев. И моя ошибка всегда такая:

ValueError: Ошибка при проверке ввода: ожидалось, что conv2d_3_input имеет 4 измерения, но получил массив с формой (x, x, x)

набор данных остается прежним меняется только архитектура NN, и это мой первый подход:

model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3),
             activation='relu',
             input_shape=(1901,456,3)))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(3, activation='softmax'))

Может ли кто-нибудь помочь мне заменить мой первый NN на CNN?

Ответы [ 2 ]

2 голосов
/ 27 января 2020

Ваша сеть четко определена, вы получаете ошибку во время операции fit. И почему это так.

Ну, Conv2D ищет данные с 4D формой, как вы можете видеть здесь: do c

Форма X_train должна затем be (samples, channels, rows, cols)

Когда вы дали input_shape=(1901,456,3), вам не нужно было указывать количество выборок.

Но во время операции fit вам нужно иметь данные в форме (samples, channels, rows, cols).

И теперь вы видите, что у вас есть проблема. Почему ваш X_train имеет такую ​​форму, кажется, что у вас есть только одно изображение. Вы можете скормить его, изменив форму, используя:

X_train = X_train.reshape((1, 1901, 456, 3))

Но это кажется странным, вы только подаете одно изображение в вашу сеть.

Редактировать: после уточнения комментариев, conv1D будет лучше в этом случае, вот как это сделать:

model = Sequential()
model.add(Conv1D(32, kernel_size=3,
             activation='relu',
             input_shape=(456,3)))
model.add(Conv1D(64, 3, activation='relu'))
model.add(MaxPooling1D(pool_size=2))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(3 * 3, activation='softmax'))
model.add(Reshape((3, 3))

0 голосов
/ 27 января 2020

теперь все работало с архитектурой и также нет проблем при компиляции NN;

batch_size = 128
epochs = 12


model.compile(
 optimizer='rmsprop',
 loss=tf.keras.losses.MeanSquaredError(),
 metrics=['mse'],
 )

 model.fit(X_test, Y_train,
      batch_size=batch_size,
      epochs=epochs,
      verbose=1,
      validation_data=(X_test, Y_test))
 score = model.evaluate(X_test, Y_test, verbose=0)

но при попытке подгонки я получаю следующую ошибку:

ValueError: Input arrays should have the same number of samples as target 
arrays. Found 476 input samples and 1901 target samples.

что мне здесь не хватает?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...