Keras model.load_weights()给出了错误的结果

Keras model.load_weights()给出了错误的结果,keras,keras-layer,keras-2,Keras,Keras Layer,Keras 2,我使用以下CNN模型训练MNIST数据,并将权重保存为MNIST_weights.h5以再现结果 进口干酪 来自未来导入打印功能 从keras.dataset导入mnist 从keras.models导入顺序 从keras.layers导入致密、脱落、平坦 从keras.layers导入Conv2D、MaxPooling2D 从keras导入后端为K 将numpy作为np导入 从sklearn.model\u选择导入列车\u测试\u拆分 批量大小=128 num_classes=3 纪元=4 输

我使用以下CNN模型训练MNIST数据,并将权重保存为MNIST_weights.h5以再现结果

进口干酪 来自未来导入打印功能 从keras.dataset导入mnist 从keras.models导入顺序 从keras.layers导入致密、脱落、平坦 从keras.layers导入Conv2D、MaxPooling2D 从keras导入后端为K 将numpy作为np导入 从sklearn.model\u选择导入列车\u测试\u拆分 批量大小=128 num_classes=3 纪元=4 输入图像尺寸 img_行,img_列=28,28 只是为了减少数据集 x_列,y_列,x_测试,y_测试=mnist.load_数据 x1_列=x_列[y_列==0];y1_列=y_列[y_列==0] x1_检验=x_检验[y_检验=0];y1_测试=y_测试[y_测试==0] x2_列=x_列[y_列==1];y2_列=y_列[y_列==1] x2_检验=x_检验[y_检验=1];y2_测试=y_测试[y_测试==1] x3_列=x_列[y_列==2];y3列车=y列车[y列车=2] x3_检验=x_检验[y_检验=2];y3_检验=y_检验[y_检验=2] X=np。串联1列,x2列,x3列,x1列,x2列,x3列,轴=0 Y=np。串联1_列、y2_列、y3_列、y1_测试、y2_测试、y3_测试,轴=0 数据在训练集和测试集之间混合和分割 x_列,x_测试,y_列,y_测试=x,y列 如果K.image\u data\u format=='channels\u first': x_列=x_列。重塑x_列。形状[0],1,img_行,img_列 x_测试=x_测试。重塑x_测试。形状[0],1,img_行,img_列 输入形状=1,img\u行,img\u列 其他: x_列=x_列。重塑x_列。形状[0],img_行,img_列,1 x_测试=x_测试。重塑x_测试。形状[0],img_行,img_列,1 input_shape=img_行,img_列,1 x_-train=x_-train.astype'float32' x_测试=x_测试。A类型'float32' x_列/=255 x_检验/=255 将类向量转换为二进制类矩阵 y\u列车=keras.utils.to\u分类列车,数量级 y_test=keras.utils.to_category_test,num_classes 模型=顺序 model.addConv2D1,内核大小=2,2, 激活='relu', 输入形状=输入形状 model.addMaxPoolig2dpool_size=16,16 model.addflatte model.addDensenum_类,activation='softmax' model.compileloss=keras.loss.categorical_交叉熵, 优化器=keras.optimizers.Adadelta, 指标=['准确度'] fitx_型列车,y_型列车, 批次大小=批次大小, 时代, verbose=1, 验证数据=x检验,y检验 模型.保存权重'mnist\u weights.h5' 现在我使用相同的模型和相同的数据集来复制结果,所以我从上面的代码中保存了一个负载权重。代码如下

进口干酪 来自未来导入打印功能 从keras.dataset导入mnist 从keras.models导入顺序 从keras.layers导入致密、脱落、平坦 从keras.layers导入Conv2D、MaxPooling2D 从keras导入后端为K 将numpy作为np导入 从sklearn.model\u选择导入列车\u测试\u拆分 批量大小=128 num_classes=3 时代=1 输入图像尺寸 img_行,img_列=28,28 只是为了减少数据集 x_列,y_列,x_测试,y_测试=mnist.load_数据 x1_列=x_列[y_列==0];y1_列=y_列[y_列==0] x1_检验=x_检验[y_检验=0];y1_测试=y_测试[y_测试==0] x2_列=x_列[y_列==1];y2_列=y_列[y_列==1] x2_检验=x_检验[y_检验=1];y2_测试=y_测试[y_测试==1] x3_列=x_列[y_列==2];y3列车=y列车[y列车=2] x3_检验=x_检验[y_检验=2];y3_检验=y_检验[y_检验=2] X=np。串联1列,x2列,x3列,x1列,x2列,x3列,轴=0 Y=np。串联1_列、y2_列、y3_列、y1_测试、y2_测试、y3_测试,轴=0 数据在训练集和测试集之间混合和分割 x_列,x_测试,y_列,y_测试=x,y列 如果K.image\u data\u format=='channels\u first': x_列=x_列。重塑x_列。形状[0],1,img_行,img_列 x_测试=x_测试。重塑x_测试。形状[0],1,img_行,img_列 输入形状=1,img\u行,img\u列 其他: x_列=x_列。重塑x_列。形状[0],img_行,img_列,1 x_测试=x_测试。重塑x_测试。形状[0],img_行,img_列,1 input_shape=img_行,img_列,1 x_-train=x_-train.astype'float32' x_测试=x_测试。A类型'float32' x_列/=255 x_检验/=255 将类向量转换为二进制类矩阵 y\u列车=keras.utils.to\u分类列车,数量级 y_test=keras.utils.to_category_test,num_classes 模型=顺序 model.addConv2D1,内核大小=2,2, 激活='relu', 输入形状=输入形状,可训练=错误 model.addMaxPoolig2dpool_size=16,16 model.addflatte model.addDensenum_类,activation='softmax',trainable=False 型号.负载重量'mnist\u重量.h5' model.compileloss=keras.loss.categorical_交叉熵, 优化器=keras.optimizers.Adadelta, 指标=['准确度'] fitx_型列车,y_型列车, 批次大小=批次大小, 时代, verbose=1, 验证数据=x检验,y检验 模型.保存权重'mnist\u weights 1.h5' 到底是什么
n我检查两个代码的准确性,当我提供相同的模型和相同的权重时,两个代码都不同,为什么会这样。我使用的是1个历元,trainable=False

由于数据集的分割方式不同,因此精度不同

x_train, x_test, y_train, y_test = train_test_split(X,Y)

如果您为train\u test\u split提供了random\u state参数,那么您应该看到两个代码段都给出了相同的val\u acc。

明白了。还有一件事,当我不想训练我的模型时,为什么有必要在model.compileIs中指定优化器的名称,这意味着我必须在我的模型中使用model.predict我想我已经错误地删除了一些注释。请你再评论一下你的答案好吗?我删除了它,因为它与问题没有直接关系。为什么不使用model.evaluate?为什么不能给model.compile提供一个优化器呢?是的,我可以使用model.evaluate。我的问题是,当我不想优化我的模型,我想使用来自外部源的权重时,那么在上面的代码中,优化器=keras.optimizers.Adadelta需要什么呢。我只使用了一个历元