Python 如何使用固定的内核大小和固定数量的过滤器修复CNN层维度错误?

Python 如何使用固定的内核大小和固定数量的过滤器修复CNN层维度错误?,python,tensorflow,keras,cnn,Python,Tensorflow,Keras,Cnn,我目前正试图重建一个报纸上使用的CNN模型 Abhinav Agrawal和Namita Mittal()的“使用CNN进行面部表情识别:核大小和过滤器数量对准确性影响的研究” 它的独特之处在于它使用固定的内核大小和固定数量的过滤器,并且没有退出层或完全连接的层。本文提出的模型如下: 输入数据(64×64)灰度图像 数据扩充 CONV 8×8×32,批量定额 CONV 8×8×32,RELU,步幅(2×2) CONV 8×8×32,批量定额 CONV 8×8×32,RELU,步幅(2×2) CO

我目前正试图重建一个报纸上使用的CNN模型

Abhinav Agrawal和Namita Mittal()的“使用CNN进行面部表情识别:核大小和过滤器数量对准确性影响的研究”

它的独特之处在于它使用固定的内核大小和固定数量的过滤器,并且没有退出层或完全连接的层。本文提出的模型如下:

输入数据(64×64)灰度图像
数据扩充
CONV 8×8×32,批量定额
CONV 8×8×32,RELU,步幅(2×2)
CONV 8×8×32,批量定额
CONV 8×8×32,RELU,步幅(2×2)
CONV 8×8×32,批量定额
CONV 8×8×32,RELU,步幅(2×2)
CONV 8×8×32,批量定额
CONV 8×8×32,RELU,步幅(2×2)
CONV 8×8×32,批量定额
CONV 8×8×32,RELU,步幅(2×2)
CONV 8×8×32,批量定额
CONV 8×8×32,RELU,步幅(2×2)
CONV 8×8×32,批量定额
CONV 8×8×32,RELU,步幅(2×2)
CONV 8×8×32,批量定额
conv7×7×7,RELU,步幅(1×1)
SOFTMAX
我的代码如下所示,并尝试使用相同的数据集和图像从论文中忠实地重新创建模型

将tensorflow导入为tf
从tensorflow进口keras
从tensorflow.keras导入数据集、图层、模型
从tensorflow.keras.preprocessing.image导入ImageDataGenerator
从tensorflow.keras.layers导入稠密、脱落、展平、Conv2D、MaxPoolig2D、批次规格化
从tensorflow.keras.models导入顺序
#从tensorflow.keras.optimizers导入Adam
将matplotlib.pyplot作为plt导入
def plot_模型_acc(历史记录):
#模型历史的准确性
plt.plot(history.history['accurity'],label='accurity')
plt.plot(history.history['val\u accurity'],label='val\u accurity')
产品名称(“型号精度”)
plt.xlabel('Epoch')
plt.ylabel(“精度”)
plt.图例(['train','test',loc='左上角〕)
plt.savefig('model_acc.png',bbox_inches='tight')
plt.close()
def绘图模式损失(历史):
#损失历史模型
plt.plot(history.history['loss'],label='loss')
plt.plot(history.history['val\u loss'],label='val\u loss')
产品名称(“型号损失”)
plt.ylabel(“损失”)
plt.xlabel('Epoch')
plt.图例(['train','test',loc='左上角〕)
plt.savefig('model_loss.png',bbox_inches='tight')
plt.close()
#模型参数
列车目录=‘列车’
test\u目录='test'
val_目录='验证'
列车数量=28709
num_测试=7178
数值=7178
批量大小=64
num_epoch=10
#创建datagen类并将灰度的像素值从0-255重缩放到0-1
列车\数据发生器=图像数据发生器(重缩放=1./255)
test_datagen=ImageDataGenerator(重缩放=1./255)
val_datagen=ImageDataGenerator(重缩放=1./255)
#愤怒0,厌恶1,恐惧2,快乐3,中立4,悲伤5,惊讶6
train\u迭代器=来自\u目录的train\u datagen.flow\u(
列车运行目录,
目标_大小=(64,64),
class_mode='classifical',
批次大小=批次大小,
颜色(模式=灰度)
test\u iterator=test\u datagen.flow\u from\u目录(
测试目录,
目标_大小=(64,64),
class_mode='classifical',
批次大小=批次大小,
颜色(模式=灰度)
val_iterator=val_datagen.flow_from_目录(
val_目录,
目标_大小=(64,64),
class_mode='classifical',
批次大小=批次大小,
颜色(模式=灰度)
#自重新缩放后的颜色模式灰度=1./255
#class_模式是分类的,返回一个热编码标签
#模型创建
#conv层后的输出层大小为
#[(W)−K+2P)/S]+1。
#W是输入卷-在您的情况下为64(对于64x64x1图像)
#K是内核大小——在您的例子中是8
#P是填充-在您的示例中为0
#S是你没有提供的步幅。
模型=顺序()
add(Conv2D(32,内核大小=(8,8),输入形状=(64,64,1)))
添加(BatchNormalization())
add(Conv2D(32,内核大小=(8,8),activation='relu',strips=(2,2)))
add(Conv2D(32,内核大小=(8,8)))
添加(BatchNormalization())
model.summary()
add(Conv2D(32,内核大小=(8,8),activation='relu',strips=(2,2)))
add(Conv2D(32,内核大小=(8,8)))
添加(BatchNormalization())
add(Conv2D(32,内核大小=(8,8),activation='relu',strips=(2,2)))
add(Conv2D(32,内核大小=(8,8)))
添加(BatchNormalization())
model.summary()
add(Conv2D(32,内核大小=(8,8),activation='relu',strips=(2,2)))
add(Conv2D(32,内核大小=(8,8)))
添加(BatchNormalization())
add(Conv2D(32,内核大小=(8,8),activation='relu',strips=(2,2)))
add(Conv2D(32,内核大小=(8,8)))
添加(BatchNormalization())
model.summary()
add(Conv2D(32,内核大小=(8,8),activation='relu',strips=(2,2)))
add(Conv2D(32,内核大小=(8,8)))
添加(BatchNormalization())
add(Conv2D(32,内核大小=(8,8),activation='relu',strips=(2,2)))
add(Conv2D(32,内核大小=(8,8)))
添加(BatchNormalization())
model.summary()
add(Conv2D(7,内核大小=(7,7),步幅=(1,1)))
model.add(layers.Activation('softmax'))
model.summary()
#优化器定义、学习率越低,花费的时间越长,但高值可能会导致训练不稳定
adam\u optimizer=keras.optimizers.adam(学习率=0.0001)
#一个热编码标签和密集层的分类交叉熵使用softmax激活,否则使用其他损失函数
compile(优化器=adam\u优化器,
损失=tf.keras.loss.CategoricalCrossentropy(根据逻辑=真),
指标=[‘准确度’])
历史=model.fit(
训练迭代器,
每个历元的步数=列数//批量大小,
epochs=num_epoch,
验证数据=测试迭代器,
验证步骤=数值//批量大小
)
打印(history.history.keys())
绘图\模型\附件(历史)
绘图模式损失(历史)
model.save_权重('model.h5'))
我遇到了错误:

“tensorflo
model.add(Conv2D(32, kernel_size=(8, 8),padding='same'))