keras 自定義loss損失函數(shù),sample在loss上的加權(quán)和metric詳解
首先辨析一下概念:
1. loss是整體網(wǎng)絡(luò)進(jìn)行優(yōu)化的目標(biāo), 是需要參與到優(yōu)化運(yùn)算,更新權(quán)值W的過程的
2. metric只是作為評價(jià)網(wǎng)絡(luò)表現(xiàn)的一種“指標(biāo)”, 比如accuracy,是為了直觀地了解算法的效果,充當(dāng)view的作用,并不參與到優(yōu)化過程
在keras中實(shí)現(xiàn)自定義loss, 可以有兩種方式,一種自定義 loss function,
例如:
# 方式一 def vae_loss(x, x_decoded_mean): xent_loss = objectives.binary_crossentropy(x, x_decoded_mean) kl_loss = - 0.5 * K.mean(1 + z_log_sigma - K.square(z_mean) - K.exp(z_log_sigma), axis=-1) return xent_loss + kl_loss vae.compile(optimizer='rmsprop', loss=vae_loss)
或者通過自定義一個(gè)keras的層(layer)來達(dá)到目的, 作為model的最后一層,最后令model.compile中的loss=None:
# 方式二 # Custom loss layer class CustomVariationalLayer(Layer): def __init__(self, **kwargs): self.is_placeholder = True super(CustomVariationalLayer, self).__init__(**kwargs) def vae_loss(self, x, x_decoded_mean_squash): x = K.flatten(x) x_decoded_mean_squash = K.flatten(x_decoded_mean_squash) xent_loss = img_rows * img_cols * metrics.binary_crossentropy(x, x_decoded_mean_squash) kl_loss = - 0.5 * K.mean(1 + z_log_var - K.square(z_mean) - K.exp(z_log_var), axis=-1) return K.mean(xent_loss + kl_loss) def call(self, inputs): x = inputs[0] x_decoded_mean_squash = inputs[1] loss = self.vae_loss(x, x_decoded_mean_squash) self.add_loss(loss, inputs=inputs) # We don't use this output. return x y = CustomVariationalLayer()([x, x_decoded_mean_squash]) vae = Model(x, y) vae.compile(optimizer='rmsprop', loss=None)
在keras中自定義metric非常簡單,需要用y_pred和y_true作為自定義metric函數(shù)的輸入?yún)?shù) 點(diǎn)擊查看metric的設(shè)置
注意事項(xiàng):
1. keras中定義loss,返回的是batch_size長度的tensor, 而不是像tensorflow中那樣是一個(gè)scalar
2. 為了能夠?qū)⒆远x的loss保存到model, 以及可以之后能夠順利load model, 需要把自定義的loss拷貝到keras.losses.py 源代碼文件下,否則運(yùn)行時(shí)找不到相關(guān)信息,keras會報(bào)錯(cuò)
有時(shí)需要不同的sample的loss施加不同的權(quán)重,這時(shí)需要用到sample_weight,例如
# Class weights: # To balance the difference in occurences of digit class labels. # 50% of labels that the discriminator trains on are 'fake'. # Weight = 1 / frequency cw1 = {0: 1, 1: 1} cw2 = {i: self.num_classes / half_batch for i in range(self.num_classes)} cw2[self.num_classes] = 1 / half_batch class_weights = [cw1, cw2] # 使得兩種loss能夠一樣重要
discriminator.train_on_batch(imgs, [valid, labels], class_weight=class_weights)
補(bǔ)充知識:keras模型訓(xùn)練與保存的call_back的設(shè)置
1、模型訓(xùn)練
fit(x=None, y=None, batch_size=None, epochs=1, verbose=1, callbacks=None, validation_split=0.0, validation_data=None, shuffle=True, class_weight=None, sample_weight=None, initial_epoch=0, steps_per_epoch=None, validation_steps=None)
參數(shù):
x: 訓(xùn)練數(shù)據(jù)的 Numpy 數(shù)組(如果模型只有一個(gè)輸入), 或者是 Numpy 數(shù)組的列表(如果模型有多個(gè)輸入)。 如果模型中的輸入層被命名,你也可以傳遞一個(gè)字典,將輸入層名稱映射到 Numpy 數(shù)組。 如果從本地框架張量饋送(例如 TensorFlow 數(shù)據(jù)張量)數(shù)據(jù),x 可以是 None(默認(rèn))。
y: 目標(biāo)(標(biāo)簽)數(shù)據(jù)的 Numpy 數(shù)組(如果模型只有一個(gè)輸出), 或者是 Numpy 數(shù)組的列表(如果模型有多個(gè)輸出)。 如果模型中的輸出層被命名,你也可以傳遞一個(gè)字典,將輸出層名稱映射到 Numpy 數(shù)組。 如果從本地框架張量饋送(例如 TensorFlow 數(shù)據(jù)張量)數(shù)據(jù),y 可以是 None(默認(rèn))。
batch_size: 整數(shù)或 None。每次梯度更新的樣本數(shù)。如果未指定,默認(rèn)為 32。
epochs: 整數(shù)。訓(xùn)練模型迭代輪次。一個(gè)輪次是在整個(gè) x 和 y 上的一輪迭代。 請注意,與 initial_epoch 一起,epochs 被理解為 「最終輪次」。模型并不是訓(xùn)練了 epochs 輪,而是到第 epochs 輪停止訓(xùn)練。
verbose: 0, 1 或 2。日志顯示模式。 0 = 安靜模式, 1 = 進(jìn)度條, 2 = 每輪一行。
callbacks: 一系列的 keras.callbacks.Callback 實(shí)例。一系列可以在訓(xùn)練時(shí)使用的回調(diào)函數(shù)。
validation_split: 0 和 1 之間的浮點(diǎn)數(shù)。用作驗(yàn)證集的訓(xùn)練數(shù)據(jù)的比例。 模型將分出一部分不會被訓(xùn)練的驗(yàn)證數(shù)據(jù),并將在每一輪結(jié)束時(shí)評估這些驗(yàn)證數(shù)據(jù)的誤差和任何其他模型指標(biāo)。 驗(yàn)證數(shù)據(jù)是混洗之前 x 和y 數(shù)據(jù)的最后一部分樣本中。
validation_data: 元組 (x_val,y_val) 或元組 (x_val,y_val,val_sample_weights), 用來評估損失,以及在每輪結(jié)束時(shí)的任何模型度量指標(biāo)。 模型將不會在這個(gè)數(shù)據(jù)上進(jìn)行訓(xùn)練。這個(gè)參數(shù)會覆蓋 validation_split。
shuffle: 布爾值(是否在每輪迭代之前混洗數(shù)據(jù))或者 字符串 (batch)。 batch 是處理 HDF5 數(shù)據(jù)限制的特殊選項(xiàng),它對一個(gè) batch 內(nèi)部的數(shù)據(jù)進(jìn)行混洗。 當(dāng) steps_per_epoch 非 None 時(shí),這個(gè)參數(shù)無效。
class_weight: 可選的字典,用來映射類索引(整數(shù))到權(quán)重(浮點(diǎn))值,用于加權(quán)損失函數(shù)(僅在訓(xùn)練期間)。 這可能有助于告訴模型 「更多關(guān)注」來自代表性不足的類的樣本。
sample_weight: 訓(xùn)練樣本的可選 Numpy 權(quán)重?cái)?shù)組,用于對損失函數(shù)進(jìn)行加權(quán)(僅在訓(xùn)練期間)。 您可以傳遞與輸入樣本長度相同的平坦(1D)Numpy 數(shù)組(權(quán)重和樣本之間的 1:1 映射), 或者在時(shí)序數(shù)據(jù)的情況下,可以傳遞尺寸為 (samples, sequence_length) 的 2D 數(shù)組,以對每個(gè)樣本的每個(gè)時(shí)間步施加不同的權(quán)重。 在這種情況下,你應(yīng)該確保在 compile() 中指定 sample_weight_mode="temporal"。
initial_epoch: 整數(shù)。開始訓(xùn)練的輪次(有助于恢復(fù)之前的訓(xùn)練)。
steps_per_epoch: 整數(shù)或 None。 在聲明一個(gè)輪次完成并開始下一個(gè)輪次之前的總步數(shù)(樣品批次)。 使用 TensorFlow 數(shù)據(jù)張量等輸入張量進(jìn)行訓(xùn)練時(shí),默認(rèn)值 None 等于數(shù)據(jù)集中樣本的數(shù)量除以 batch 的大小,如果無法確定,則為 1。
validation_steps: 只有在指定了 steps_per_epoch 時(shí)才有用。停止前要驗(yàn)證的總步數(shù)(批次樣本)
fit_generator(generator, steps_per_epoch=None, epochs=1, verbose=1, callbacks=None, validation_data=None, validation_steps=None, class_weight=None, max_queue_size=10, workers=1, use_multiprocessing=False, shuffle=True, initial_epoch=0)
使用 Python 生成器(或 Sequence 實(shí)例)逐批生成的數(shù)據(jù),按批次訓(xùn)練模型
參數(shù)
generator: 一個(gè)生成器,或者一個(gè) Sequence (keras.utils.Sequence) 對象的實(shí)例, 以在使用多進(jìn)程時(shí)避免數(shù)據(jù)的重復(fù)。 生成器的輸出應(yīng)該為以下之一:
一個(gè) (inputs, targets) 元組
一個(gè) (inputs, targets, sample_weights) 元組。
這個(gè)元組(生成器的單個(gè)輸出)組成了單個(gè)的 batch。 因此,這個(gè)元組中的所有數(shù)組長度必須相同(與這一個(gè) batch 的大小相等)。 不同的 batch 可能大小不同。 例如,一個(gè) epoch 的最后一個(gè) batch 往往比其他 batch 要小, 如果數(shù)據(jù)集的尺寸不能被 batch size 整除。 生成器將無限地在數(shù)據(jù)集上循環(huán)。當(dāng)運(yùn)行到第 steps_per_epoch 時(shí),記一個(gè) epoch 結(jié)束。
steps_per_epoch: 在聲明一個(gè) epoch 完成并開始下一個(gè) epoch 之前從 generator 產(chǎn)生的總步數(shù)(批次樣本)。 它通常應(yīng)該等于你的數(shù)據(jù)集的樣本數(shù)量除以批量大小。 對于 Sequence,它是可選的:如果未指定,將使用len(generator) 作為步數(shù)。
epochs: 整數(shù)。訓(xùn)練模型的迭代總輪數(shù)。一個(gè) epoch 是對所提供的整個(gè)數(shù)據(jù)的一輪迭代,如 steps_per_epoch 所定義。注意,與 initial_epoch 一起使用,epoch 應(yīng)被理解為「最后一輪」。模型沒有經(jīng)歷由 epochs 給出的多次迭代的訓(xùn)練,而僅僅是直到達(dá)到索引 epoch 的輪次。
verbose: 0, 1 或 2。日志顯示模式。 0 = 安靜模式, 1 = 進(jìn)度條, 2 = 每輪一行。
callbacks: keras.callbacks.Callback 實(shí)例的列表。在訓(xùn)練時(shí)調(diào)用的一系列回調(diào)函數(shù)。
validation_data: 它可以是以下之一:
驗(yàn)證數(shù)據(jù)的生成器或 Sequence 實(shí)例
一個(gè) (inputs, targets) 元組
一個(gè) (inputs, targets, sample_weights) 元組。
在每個(gè) epoch 結(jié)束時(shí)評估損失和任何模型指標(biāo)。該模型不會對此數(shù)據(jù)進(jìn)行訓(xùn)練。
validation_steps: 僅當(dāng) validation_data 是一個(gè)生成器時(shí)才可用。 在停止前 generator 生成的總步數(shù)(樣本批數(shù))。 對于 Sequence,它是可選的:如果未指定,將使用 len(generator) 作為步數(shù)。
class_weight: 可選的將類索引(整數(shù))映射到權(quán)重(浮點(diǎn))值的字典,用于加權(quán)損失函數(shù)(僅在訓(xùn)練期間)。 這可以用來告訴模型「更多地關(guān)注」來自代表性不足的類的樣本。
max_queue_size: 整數(shù)。生成器隊(duì)列的最大尺寸。 如未指定,max_queue_size 將默認(rèn)為 10。
workers: 整數(shù)。使用的最大進(jìn)程數(shù)量,如果使用基于進(jìn)程的多線程。 如未指定,workers 將默認(rèn)為 1。如果為 0,將在主線程上執(zhí)行生成器。
use_multiprocessing: 布爾值。如果 True,則使用基于進(jìn)程的多線程。 如未指定, use_multiprocessing 將默認(rèn)為 False。 請注意,由于此實(shí)現(xiàn)依賴于多進(jìn)程,所以不應(yīng)將不可傳遞的參數(shù)傳遞給生成器,因?yàn)樗鼈儾荒鼙惠p易地傳遞給子進(jìn)程。
shuffle: 是否在每輪迭代之前打亂 batch 的順序。 只能與 Sequence (keras.utils.Sequence) 實(shí)例同用。
initial_epoch: 開始訓(xùn)練的輪次(有助于恢復(fù)之前的訓(xùn)練)
fit與fit_generator函數(shù)都返回一個(gè)History的對象,其History.history屬性記錄了損失函數(shù)和其他指標(biāo)的數(shù)值隨epoch變化的情況,如果有驗(yàn)證集的話,也包含了驗(yàn)證集的這些指標(biāo)變化情況,可以寫入文本后續(xù)查看
2、保存模型結(jié)構(gòu)、訓(xùn)練出來的權(quán)重、及優(yōu)化器狀態(tài)
keras.callbacks.ModelCheckpoint(filepath, monitor='val_loss', verbose=0, save_best_only=False, save_weights_only=False, mode='auto', period=1)
在每個(gè)訓(xùn)練期之后保存模型
參數(shù):
filepath: 字符串,保存模型的路徑。如 epoch1.h5 或者 epoch1.weight(save_weights_only=True)
monitor: 被監(jiān)測的數(shù)據(jù)。
verbose: 詳細(xì)信息模式,0 或者 1 。
save_best_only: 如果 save_best_only=True, 被監(jiān)測數(shù)據(jù)的最佳模型就不會被覆蓋。
mode: {auto, min, max} 的其中之一。 如果 save_best_only=True,那么是否覆蓋保存文件的決定就取決于被監(jiān)測數(shù)據(jù)的最大或者最小值。 對于 val_acc,模式就會是 max,而對于 val_loss,模式就需要是 min,等等。 在 auto 模式中,方向會自動從被監(jiān)測的數(shù)據(jù)的名字中判斷出來。
save_weights_only: 如果 True,那么只有模型的權(quán)重會被保存 (model.save_weights(filepath)), 否則的話,整個(gè)模型會被保存 (model.save(filepath))。
period: 每個(gè)檢查點(diǎn)之間的間隔(訓(xùn)練輪數(shù))
例子:
checkpoint = ModelCheckpoint(filepath=model_weight_filepath, monitor='val_acc', verbose=0, save_best_only=True, save_weights_only=True, mode='max', period=1) model.fit(X_train, Y_train, callbacks=[checkpoint])
3、當(dāng)驗(yàn)證損失不再繼續(xù)降低時(shí),如何中斷訓(xùn)練?當(dāng)監(jiān)測值不再改善時(shí)中止訓(xùn)練
EarlyStopping回調(diào)函數(shù):
keras.callbacks.EarlyStopping( monitor='val_loss', min_delta=0, patience=0, verbose=0, mode='auto', baseline=None, restore_best_weights=False)
當(dāng)被監(jiān)測的數(shù)量不再提升,則停止訓(xùn)練
參數(shù):
monitor: 被監(jiān)測的數(shù)據(jù)。
min_delta: 在被監(jiān)測的數(shù)據(jù)中被認(rèn)為是提升的最小變化, 例如,小于 min_delta 的絕對變化會被認(rèn)為沒有提升。
patience: 沒有進(jìn)步的訓(xùn)練輪數(shù),在這之后訓(xùn)練就會被停止。
verbose: 詳細(xì)信息模式,0或1。
mode: {auto, min, max} 其中之一。 在 min 模式中, 當(dāng)被監(jiān)測的數(shù)據(jù)停止下降,訓(xùn)練就會停止;在 max 模式中,當(dāng)被監(jiān)測的數(shù)據(jù)停止上升,訓(xùn)練就會停止;在 auto 模式中,方向會自動從被監(jiān)測的數(shù)據(jù)的名字中判斷出來。
baseline: 要監(jiān)控的數(shù)量的基準(zhǔn)值。 如果模型沒有顯示基準(zhǔn)的改善,訓(xùn)練將停止。
restore_best_weights: 是否從具有監(jiān)測數(shù)量的最佳值的時(shí)期恢復(fù)模型權(quán)重。 如果為 False,則使用在訓(xùn)練的最后一步獲得的模型權(quán)重。
例子:
earlystopping = EarlyStopping(monitor='val_acc', verbose=1, patience=3)
model.fit(X_train, Y_train, callbacks=[earlystopping])
4、學(xué)習(xí)率動態(tài)調(diào)整
keras.callbacks.ReduceLROnPlateau( monitor='val_loss', factor=0.1, patience=10, verbose=0, mode='auto', min_delta=0.0001, cooldown=0, min_lr=0)
當(dāng)標(biāo)準(zhǔn)評估停止提升時(shí),降低學(xué)習(xí)速率。
當(dāng)學(xué)習(xí)停止時(shí),模型總是會受益于降低 2-10 倍的學(xué)習(xí)速率。 這個(gè)回調(diào)函數(shù)監(jiān)測一個(gè)數(shù)據(jù)并且當(dāng)這個(gè)數(shù)據(jù)在一定「有耐心」的訓(xùn)練輪之后還沒有進(jìn)步, 那么學(xué)習(xí)速率就會被降低。
參數(shù)
monitor: 被監(jiān)測的數(shù)據(jù)。
factor: 學(xué)習(xí)速率被降低的因數(shù)。新的學(xué)習(xí)速率 = 學(xué)習(xí)速率 * 因數(shù)
patience: 沒有進(jìn)步的訓(xùn)練輪數(shù),在這之后訓(xùn)練速率會被降低。
verbose: 整數(shù)。0:安靜,1:更新信息。
mode: {auto, min, max} 其中之一。如果是 min 模式,學(xué)習(xí)速率會被降低如果被監(jiān)測的數(shù)據(jù)已經(jīng)停止下降; 在 max 模式,學(xué)習(xí)塑料會被降低如果被監(jiān)測的數(shù)據(jù)已經(jīng)停止上升; 在 auto 模式,方向會被從被監(jiān)測的數(shù)據(jù)中自動推斷出來。
min_delta: 對于測量新的最優(yōu)化的閥值,只關(guān)注巨大的改變。
cooldown: 在學(xué)習(xí)速率被降低之后,重新恢復(fù)正常操作之前等待的訓(xùn)練輪數(shù)量。
min_lr: 學(xué)習(xí)速率的下邊界。
例子:
reduce_lr = ReduceLROnPlateau(monitor='val_loss', factor=0.2, patience=5, min_lr=0.001) model.fit(X_train, Y_train, callbacks=[reduce_lr])
4、Tensorboard可視化
keras.callbacks.TensorBoard( log_dir='./logs', histogram_freq=0, batch_size=32, write_graph=True, write_grads=False, write_images=False, embeddings_freq=0, embeddings_layer_names=None, embeddings_metadata=None, embeddings_data=None, update_freq='epoch')
回調(diào)函數(shù)為 Tensorboard 編寫一個(gè)日志, 這樣你可以可視化測試和訓(xùn)練的標(biāo)準(zhǔn)評估的動態(tài)圖像, 也可以可視化模型中不同層的激活值直方圖。
如果你已經(jīng)使用 pip 安裝了 Tensorflow,你應(yīng)該可以從命令行啟動 Tensorflow:
tensorboard --logdir=/full_path_to_your_logs
參數(shù):
log_dir: 用來保存被 TensorBoard 分析的日志文件的文件名。
histogram_freq: 對于模型中各個(gè)層計(jì)算激活值和模型權(quán)重直方圖的頻率(訓(xùn)練輪數(shù)中)。 如果設(shè)置成 0 ,直方圖不會被計(jì)算。對于直方圖可視化的驗(yàn)證數(shù)據(jù)(或分離數(shù)據(jù))一定要明確的指出。
write_graph: 是否在 TensorBoard 中可視化圖像。 如果 write_graph 被設(shè)置為 True,日志文件會變得非常大。
write_grads: 是否在 TensorBoard 中可視化梯度值直方圖。 histogram_freq 必須要大于 0 。
batch_size: 用以直方圖計(jì)算的傳入神經(jīng)元網(wǎng)絡(luò)輸入批的大小。
write_images: 是否在 TensorBoard 中將模型權(quán)重以圖片可視化。
embeddings_freq: 被選中的嵌入層會被保存的頻率(在訓(xùn)練輪中)。
embeddings_layer_names: 一個(gè)列表,會被監(jiān)測層的名字。 如果是 None 或空列表,那么所有的嵌入層都會被監(jiān)測。
embeddings_metadata: 一個(gè)字典,對應(yīng)層的名字到保存有這個(gè)嵌入層元數(shù)據(jù)文件的名字。 查看 詳情 關(guān)于元數(shù)據(jù)的數(shù)據(jù)格式。 以防同樣的元數(shù)據(jù)被用于所用的嵌入層,字符串可以被傳入。
embeddings_data: 要嵌入在 embeddings_layer_names 指定的層的數(shù)據(jù)。 Numpy 數(shù)組(如果模型有單個(gè)輸入)或 Numpy 數(shù)組列表(如果模型有多個(gè)輸入)。 Learn ore about embeddings。
update_freq: 'batch' 或 'epoch' 或 整數(shù)。當(dāng)使用 'batch' 時(shí),在每個(gè) batch 之后將損失和評估值寫入到 TensorBoard 中。同樣的情況應(yīng)用到 'epoch' 中。如果使用整數(shù),例如 10000,這個(gè)回調(diào)會在每 10000 個(gè)樣本之后將損失和評估值寫入到 TensorBoard 中。注意,頻繁地寫入到 TensorBoard 會減緩你的訓(xùn)練。
5、如何記錄每一次epoch的訓(xùn)練/驗(yàn)證損失/準(zhǔn)確度?
Model.fit函數(shù)會返回一個(gè) History 回調(diào),該回調(diào)有一個(gè)屬性history包含一個(gè)封裝有連續(xù)損失/準(zhǔn)確的lists。
代碼如下:
hist = model.fit(X, y,validation_split=0.2)
print(hist.history)
Keras輸出的loss,val這些值如何保存到文本中去
Keras中的fit函數(shù)會返回一個(gè)History對象,它的History.history屬性會把之前的那些值全保存在里面,如果有驗(yàn)證集的話,也包含了驗(yàn)證集的這些指標(biāo)變化情況,具體寫法:
hist=model.fit(train_set_x,train_set_y,batch_size=256,shuffle=True,nb_epoch=nb_epoch,validation_split=0.1) with open('log_sgd_big_32.txt','w') as f: f.write(str(hist.history))
6、多個(gè)回調(diào)函數(shù)用逗號隔開
例如:
model_weight_filepath = "./bert_classfition-test_model" + str(i) + ".weight" earlystopping = EarlyStopping(monitor='val_acc', verbose=1, patience=3) reducelronplateau = ReduceLROnPlateau(monitor="val_acc", verbose=1, mode='max', factor=0.5, patience=2) checkpoint = ModelCheckpoint(filepath=model_weight_filepath, monitor='val_acc', verbose=0, save_best_only=True, save_weights_only=True, mode='max', period=1) model.fit_generator( train_D.__iter__(), steps_per_epoch=len(train_D), epochs=epochs, validation_data=valid_D.__iter__(), validation_steps=len(valid_D), callbacks=[earlystopping, reducelronplateau, checkpoint])
以上這篇keras 自定義loss損失函數(shù),sample在loss上的加權(quán)和metric詳解就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python爬取微信讀書實(shí)現(xiàn)讀書免費(fèi)自由
主要跟大家介紹一下,我是如何用Python爬取小說,再導(dǎo)入微信讀書的。成功實(shí)現(xiàn)在微信讀書中各種“白票”付費(fèi)小說,有需要的朋友可以借鑒參考下2021-09-09python實(shí)現(xiàn)上傳文件到linux指定目錄的方法
這篇文章主要介紹了python實(shí)現(xiàn)上傳文件到linux指定目錄的方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-01-01Python實(shí)現(xiàn)簡易端口掃描器代碼實(shí)例
本篇文章主要介紹了Python實(shí)現(xiàn)簡易端口掃描器的相關(guān)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-03-03Python+Pyqt實(shí)現(xiàn)簡單GUI電子時(shí)鐘
這篇文章主要為大家詳細(xì)介紹了Python+Pyqt實(shí)現(xiàn)簡單GUI電子時(shí)鐘,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07Python程序自動以管理員權(quán)限運(yùn)行的實(shí)現(xiàn)方法
Windows上為了安全起見,python語言啟動的應(yīng)用程序默認(rèn)都不會使用admin管理員權(quán)限,但是在有些情況下我們又需要使用管理員權(quán)限啟動應(yīng)用,這篇文章主要給大家介紹了關(guān)于Python程序自動以管理員權(quán)限運(yùn)行的實(shí)現(xiàn)方法,需要的朋友可以參考下2023-11-11python 進(jìn)程 進(jìn)程池 進(jìn)程間通信實(shí)現(xiàn)解析
這篇文章主要介紹了python 進(jìn)程 進(jìn)程池 進(jìn)程間通信實(shí)現(xiàn)解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08python 制作自定義包并安裝到系統(tǒng)目錄的方法
今天小編就為大家分享一篇python 制作自定義包并安裝到系統(tǒng)目錄的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-10-10