Я пытаюсь реализовать расширяемую CNN, используя серию maclaurin. Основная идея заключается в том, что первый входной узел можно разложить на несколько узлов с разными порядками и коэффициентами. Разложение отдельных узлов на несколько может генерировать различные нелинейные линейные соединения, которые генерируются сериями Маклорена. Может ли кто-нибудь дать мне возможную идею о том, как расширить CNN
с помощью нелинейного расширения серии Маклорена? любая мысль?
Я не совсем понимаю, как разложить входной узел на несколько с разными нелинейными связями линий, которые генерируются сериями Маклорена. насколько я знаю, ряд Маклорена является аппроксимационной функцией, но разлагающий узел не совсем интуитивно понятен мне с точки зрения реализации. Как реализовать разложение входного узла на несколько в python? Как сделать так, чтобы это произошло легко? Есть идеи?
моя попытка:
import tensorflow as tf
import numpy as np
import keras
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Conv2D, MaxPooling2D, Dropout, Flatten
from keras.datasets import cifar10
from keras.utils import to_categorical
(train_imgs, train_label), (test_imgs, test_label)= cifar10.load_data()
output_class = np.unique(train_label)
n_class = len(output_class)
nrows_tr, ncols_tr, ndims_tr = train_imgs.shape[1:]
nrows_ts, ncols_ts, ndims_ts = test_imgs.shape[1:]
train_data = train_imgs.reshape(train_imgs.shape[0], nrows_tr, ncols_tr, ndims_tr)
test_data = test_imgs.reshape(test_imgs.shape[0], nrows_ts, ncols_ts, ndims_ts)
input_shape = (nrows_tr, ncols_tr, ndims_tr)
train_data = train_data.astype('float32')
trast_data = test_data.astype('float32')
train_data //= 255
test_data //= 255
train_label_one_hot = to_categorical(train_label)
test_label_one_hot = to_categorical(test_label)
def pown(x,n):
return(x**n)
def expandable_cnn(input_shape, output_shape, approx_order):
inputs=Input(shape=(input_shape))
x= Dense(input_shape)(inputs)
y= Dense(output_shape)(x)
model = Sequential()
model.add(Conv2D(filters=32, kernel_size=(3,3), padding='same', activation="relu", input_shape=input_shape))
model.add(Conv2D(filters=32, kernel_size=(3,3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(512, activation='relu'))
model.add(Dropout(0.5))
for i in range(2, approx_order+1):
y=add([y, Dense(output_shape)(Activation(lambda x: pown(x, n=i))(x))])
model.add(Dense(n_class, activation='softmax')(y))
return model
но когда я запустил вышеуказанную модель, у меня было множество ошибок компиляции и ошибка измерения. Я предполагаю, что способ нелинейного расширения Тайлора для модели CNN может быть неправильным. Кроме того, я не уверен, как представить вес. Как заставить это работать? любая возможная идея о том, как исправить мою попытку?
желаемый результат:
Я ожидаю расширения CNN с помощью нелинейного расширения серии Маклорена, как сделать приведенную выше реализацию правильной и эффективной? любая возможная идея или подход?