相同的神经网络模型,采用相同数据集训练,得到的权重参数是否相同?

转载自:相同的神经网络模型,采用相同数据集训练,得到的权重参数是否相同?

想要两次结果完全一样,很简单,要保证两个方面:

第一步,设置一样的seed

np.random.seed(cfg.RNG_SEED)
torch.manual_seed(cfg.RNG_SEED)
torch.cuda.manual_seed_all(cfg.RNG_SEED)
random.seed(cfg.RNG_SEED)

第二步,关闭cudnn,打开determinstic,假如你依旧想获得cudnn加速效果,可以这么整:

torch.backends.cudnn.benchmark = False
torch.backends.cudnn.deterministic = True
torch.backends.cudnn.enabled = True

之所以cudnn会在两次运行后得到不同的结果,本质上是因为:

浮点数运算没有结合性,即 (a+b)+c 很可能不等于 a+(b+c)。比如说你要把一堆数加起来,为了加快运算速度需要提高并行度,这时候各个数字相加的先后顺序就保证不了了,结果就会有一定的涨落。这里Faster Parallel Reductions on Kepler和这里Understanding and Using Atomic Memory Operations有对 AtomicAdd 的介绍,神经网络里的很多非确定性都是 AtomicAdd 造成的,比如 PyTorch 中有这些 Op:REPRODUCIBILITY

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
训练VGG19网络需要以下步骤: 1. 准备数据集:将数据集分为训练集和测试集,并将它们放入不同的文件夹中。每个文件夹应该包含不同类别的图像。 2. 数据预处理:将图像缩放到相同的大小,通常是224x224像素。然后,将图像转换为张量并归一化像素值。 3. 加载预训练的VGG19模型:使用Keras或PyTorch加载VGG19模型,并冻结所有层,以便在训练过程中不更新它们的权重。 4. 添加新的密集层:在VGG19模型的顶部添加一个或多个密集层,这些层将用于分类任务。可以根据需要调整层数和神经元数量。 5. 训练模型:使用训练训练模型,使用测试集评估模型性能。根据需要进行多次训练和调整。 6. 保存模型:保存训练好的模型以备以后使用。 以下是使用Keras训练VGG19模型的示例代码: ```python # 导入必要的库 from keras.applications.vgg19 import VGG19 from keras.preprocessing.image import ImageDataGenerator from keras.models import Model from keras.layers import Dense, Flatten from keras.optimizers import SGD # 准备数据集 train_folder = 'path/to/train/dataset' test_folder = 'path/to/test/dataset' train_datagen = ImageDataGenerator(rescale=1./255) test_datagen = ImageDataGenerator(rescale=1./255) train_generator = train_datagen.flow_from_directory(train_folder, target_size=(224, 224), batch_size=32, class_mode='categorical') test_generator = test_datagen.flow_from_directory(test_folder, target_size=(224, 224), batch_size=32, class_mode='categorical') # 加载预训练的VGG19模型 vgg19_model = VGG19(weights='imagenet', include_top=False, input_shape=(224, 224, 3)) for layer in vgg19_model.layers: layer.trainable = False # 添加新的密集层 x = vgg19_model.output x = Flatten()(x) x = Dense(256, activation='relu')(x) x = Dense(128, activation='relu')(x) predictions = Dense(num_classes, activation='softmax')(x) # 创建新的模型 model = Model(inputs=vgg19_model.input, outputs=predictions) # 编译模型 model.compile(optimizer=SGD(lr=0.001, momentum=0.9), loss='categorical_crossentropy', metrics=['accuracy']) # 训练模型 model.fit_generator(train_generator, steps_per_epoch=train_generator.n // train_generator.batch_size, epochs=10, validation_data=test_generator, validation_steps=test_generator.n // test_generator.batch_size) # 保存模型 model.save('vgg19_model.h5') ``` 这里的num_classes指的是数据集中的类别数量。在训练过程中,可以根据需要调整模型的超参数,例如学习率、批次大小和训练时期数量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值