pointnet 第十二句 learning_rate = get_learning_rate(batch)

本文详细介绍了在深度学习训练过程中使用的一种动态调整学习率的方法——指数衰减学习率策略。该策略根据训练步数自动调整学习率,初始值为0.00001,随着训练的进行而增加,但不会超过设定的最大值。这一策略有助于提高模型训练的效率和效果。
learning_rate = get_learning_rate(batch)

首先看具体实现

def get_learning_rate(batch):
    learning_rate = tf.train.exponential_decay(
                        BASE_LEARNING_RATE,  # Base learning rate.
                        batch * BATCH_SIZE,  # Current index into the dataset.
                        DECAY_STEP,          # Decay step.
                        DECAY_RATE,          # Decay rate.
                        staircase=True)
    learning_rate = tf.maximum(learning_rate, 0.00001) # CLIP THE LEARNING RATE!
    return learning_rate        

输入参数为batch,在目前的项目中表示train的step

get_bn_decay(从0.5开始按照指数规则缓慢减少)相似,也是指数增加的learningrate而且从0.00001开始增加,

class Config: # 训练参数 batch_size = 16 learning_rate = 0.001 epochs = 10 # 音频参数 sample_rate = 16000 n_mels = 64 # 路径设置 model_save_path = "voice_detector.pth" config = Config() from model.voice_detector import VoiceDialogDetector from utils.audio_processing import create_dummy_data import torch from torch.utils.data import Dataset, DataLoader import config # 简单数据集类 class AudioDataset(Dataset): def __init__(self, dummy=True): self.dummy = dummy def __len__(self): return 100 # 虚拟数据量 def __getitem__(self, idx): if self.dummy: wave, label = create_dummy_data(batch_size=1) return wave.squeeze(0), label.squeeze(0) def train(): # 初始化 device = torch.device("cuda" if torch.cuda.is_available() else "cpu") model = VoiceDialogDetector().to(device) criterion = torch.nn.CrossEntropyLoss() optimizer = torch.optim.Adam(model.parameters(), lr=config.learning_rate) # 数据加载(先用虚拟数据测试) dataset = AudioDataset(dummy=True) loader = DataLoader(dataset, batch_size=config.batch_size, shuffle=True) # 训练循环 for epoch in range(config.epochs): total_loss = 0.0 for waves, labels in loader: waves = waves.to(device) labels = labels.to(device) # 前向传播 outputs = model(waves) loss = criterion(outputs.permute(0, 2, 1), labels) # 反向传播 optimizer.zero_grad() loss.backward() optimizer.step() total_loss += loss.item() print(f"Epoch [{epoch + 1}/{config.epochs}] Loss: {total_loss / len(loader):.4f}") # 保存模型 torch.save(model.state_dict(), config.model_save_path) print(f"模型已保存至 {config.model_save_path}") if __name__ == "__main__": train()这是train.py文件,还是报错Traceback (most recent call last): File "train.py", line 59, in <module> train() File "train.py" def learning_rate(): return None这是config.py文件
03-12
生成torch代码:class ConcreteAutoencoderFeatureSelector(): def __init__(self, K, output_function, num_epochs=300, batch_size=None, learning_rate=0.001, start_temp=10.0, min_temp=0.1, tryout_limit=1): self.K = K self.output_function = output_function self.num_epochs = num_epochs self.batch_size = batch_size self.learning_rate = learning_rate self.start_temp = start_temp self.min_temp = min_temp self.tryout_limit = tryout_limit def fit(self, X, Y=None, val_X=None, val_Y=None): if Y is None: Y = X assert len(X) == len(Y) validation_data = None if val_X is not None and val_Y is not None: assert len(val_X) == len(val_Y) validation_data = (val_X, val_Y) if self.batch_size is None: self.batch_size = max(len(X) // 256, 16) num_epochs = self.num_epochs steps_per_epoch = (len(X) + self.batch_size - 1) // self.batch_size for i in range(self.tryout_limit): K.set_learning_phase(1) inputs = Input(shape=X.shape[1:]) alpha = math.exp(math.log(self.min_temp / self.start_temp) / (num_epochs * steps_per_epoch)) self.concrete_select = ConcreteSelect(self.K, self.start_temp, self.min_temp, alpha, name='concrete_select') selected_features = self.concrete_select(inputs) outputs = self.output_function(selected_features) self.model = Model(inputs, outputs) self.model.compile(Adam(self.learning_rate), loss='mean_squared_error') print(self.model.summary()) stopper_callback = StopperCallback() hist = self.model.fit(X, Y, self.batch_size, num_epochs, verbose=1, callbacks=[stopper_callback], validation_data=validation_data) # , validation_freq = 10) if K.get_value(K.mean( K.max(K.softmax(self.concrete_select.logits, axis=-1)))) >= stopper_callback.mean_max_target: break num_epochs *= 2 self.probabilities = K.get_value(K.softmax(self.model.get_layer('concrete_select').logits)) self.indices = K.get_value(K.argmax(self.model.get_layer('concrete_select').logits)) return self def get_indices(self): return K.get_value(K.argmax(self.model.get_layer('concrete_select').logits)) def get_mask(self): return K.get_value(K.sum(K.one_hot(K.argmax(self.model.get_layer('concrete_select').logits), self.model.get_layer('concrete_select').logits.shape[1]), axis=0)) def transform(self, X): return X[self.get_indices()] def fit_transform(self, X, y): self.fit(X, y) return self.transform(X) def get_support(self, indices=False): return self.get_indices() if indices else self.get_mask() def get_params(self): return self.model
04-21
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值