【机器学习】 - 关于Keras的深入理解
1.keras中使用相同的loss與metrics,都指定為mse,為什么訓(xùn)練時每輪完成后它們數(shù)值不一樣?
?答:
此時的loss是指完成最后一個batch后得到的這輪epoch的loss的加權(quán)平均,權(quán)重就是每個batch的樣本數(shù),(因?yàn)樽詈笠粋€batch樣本數(shù)往往跟訓(xùn)練時指定的不一樣),完成最后一個batch后,此時loss已經(jīng)固定了,但是仍然需要反向更新網(wǎng)絡(luò)中的參數(shù)。注意,metrics是在這次更新完參數(shù)后對標(biāo)簽值和預(yù)測值進(jìn)行計(jì)算,這里的預(yù)測值是模型訓(xùn)練完成后再正向傳播得到的ouput,因此相比于loss中的y_pred,metrics的y_pred使用新的神經(jīng)網(wǎng)絡(luò)參數(shù)計(jì)算的,自然數(shù)值也就不一樣了。
鏈接:https://www.zhihu.com/question/323251494/answer/719247402
?20200311
1.運(yùn)行如下代碼,會發(fā)現(xiàn)model.summary()那里報(bào)錯了
from tensorflow.keras.datasets import mnist from tensorflow.keras.utils import to_categorical from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense,Flatten #categorical_labels = to_categorical(int_labels, num_classes=None) (X_train, y_train), (X_test, y_test) = mnist.load_data() y_train = to_categorical(y_train, 10) y_test = to_categorical(y_test, 10) X_train = X_train[:10000]/255.0 y_train = y_train[:10000] X_test = X_test[:10000]/255.0 y_test = y_test[:10000] model = Sequential() model.add(Flatten()) model.add(Dense(units = 512, input_dim = 28*28,activation = 'relu')) model.add(Dense(units = 32,activation = 'relu')) model.add(Dense(units = 10,activation = 'softmax'))model.summary()# model.compile(loss='categorical_crossentropy', optimizer='adam',metrics = ['acc']) # model.fit(X_train, y_train, epochs=5, batch_size=128, verbose=1)ValueError: This model has not yet been built. Build the model first by calling `build()` or calling `fit()` with some data, or specify an `input_shape` argument in the first layer(s) for automatic build.
意思是你還沒告訴模型輸入的尺寸格式,他自然沒法給你返回summary。
解決方式也告訴你了,有如下幾種:
1.需要在model.summary()上面寫一句:model.build((None,28, 28))
參數(shù)最開始的這個None,代表的意思應(yīng)該是數(shù)據(jù)樣本個數(shù),這里你替換成其他任意數(shù)值都是可以的。甚至(None,28,28,1)也可以。
但是有個問題,summary是下圖這樣的,Output Shape的格式是multiple,不顯示具體值,也不知道為啥?
?
Model: "sequential_4"
_________________________________________________________________
Layer (type) ? ? ? ? ? ? ? ? Output Shape ? ? ? ? ? ? ?Param # ??
=================================================================
flatten_4 (Flatten) ? ? ? ? ?multiple ? ? ? ? ? ? ? ? ?0 ? ? ? ??
_________________________________________________________________
dense_9 (Dense) ? ? ? ? ? ? ?multiple ? ? ? ? ? ? ? ? ?401920 ? ?
_________________________________________________________________
dense_10 (Dense) ? ? ? ? ? ? multiple ? ? ? ? ? ? ? ? ?16416 ? ??
_________________________________________________________________
dense_11 (Dense) ? ? ? ? ? ? multiple ? ? ? ? ? ? ? ? ?330 ? ? ??
=================================================================
Total params: 418,666
Trainable params: 418,666
Non-trainable params: 0
?
2.先調(diào)用下面注釋掉的fit,讓他自動識別input_shape(當(dāng)然應(yīng)該得先conpile一下)
?
3.也是最常用的一種方式,就是在第一層,也就是Flatten的時候指明input_shape。即:model.add(Flatten(input_shape = (28,28)))
注意這里inputshape就不需要加None了。上面第一種方式中是必須要加一維None
Model: "sequential_13"
_________________________________________________________________
Layer (type) ? ? ? ? ? ? ? ? Output Shape ? ? ? ? ? ? ?Param # ??
=================================================================
flatten_14 (Flatten) ? ? ? ? (None, 784) ? ? ? ? ? ? ? 0 ? ? ? ??
_________________________________________________________________
dense_37 (Dense) ? ? ? ? ? ? (None, 512) ? ? ? ? ? ? ? 401920 ? ?
_________________________________________________________________
dense_38 (Dense) ? ? ? ? ? ? (None, 32) ? ? ? ? ? ? ? ?16416 ? ??
_________________________________________________________________
dense_39 (Dense) ? ? ? ? ? ? (None, 10) ? ? ? ? ? ? ? ?330 ? ? ??
=================================================================
Total params: 418,666
Trainable params: 418,666
Non-trainable params: 0
分析一下:注意是每一層的輸出節(jié)點(diǎn),都需要對應(yīng)一個偏置!所以401920是 (784+1) * 512得來的 !!不是輸入節(jié)點(diǎn)的偏置,也不是參數(shù)的偏置,是一個輸出節(jié)點(diǎn)對應(yīng)一個偏置!
?
參考鏈接:
https://blog.csdn.net/sisiel/article/details/103163016
20200311
1.? 各種定義和建立模型的方法,和input_shape,output_shape的輸出方法
(下面代碼中的模型還是昨天的那個模型)
from tensorflow.keras.datasets import mnist from tensorflow.keras.utils import to_categorical from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense,Flatten #categorical_labels = to_categorical(int_labels, num_classes=None) (X_train, y_train), (X_test, y_test) = mnist.load_data() y_train = to_categorical(y_train, 10) y_test = to_categorical(y_test, 10) X_train = X_train[:10000]/255.0 y_train = y_train[:10000] X_test = X_test[:10000]/255.0 y_test = y_test[:10000] model = Sequential() model.add(Flatten(input_shape = (28,28) )) model.add(Dense(units = 512, input_dim = 28*28,activation = 'relu')) model.add(Dense(units = 32,activation = 'relu')) model.add(Dense(units = 10,activation = 'softmax'))print('method 1:') model.summary()print('method 2:') for i in range(len(model.layers)):print(model.get_layer(index=i).output)print('method 3:') for layer in model.layers:print(layer.output_shape)輸出:
?
2.MaxPooling1D和MaxPooling2D的區(qū)別
Class MaxPooling1D:1D輸入的最大池化層
- pool_size:一個整數(shù)或者一個單個整數(shù)的tuple/list,表示池化窗口的大小
- strides:一個整數(shù)或者一個單個整數(shù)的tuple/list,指定池化操作的移動步幅
- padding:一個字符串。padding的方法:”valid”或者’same’
- data_format:一個字符串,channels_last(默認(rèn))或channels_first中的一個,輸入中維度的排序,channels_last對應(yīng)于具有形狀(batch, length, channels)的輸入,而channels_first對應(yīng)于具有形狀(batch, channels, length)的輸入。
- name:一個字符串,表示層的名稱。
Class MaxPooling2D:2D輸入的最大池化層
- pool_size:一個整數(shù)或者2個整數(shù)的元組/列表:(pool_height,pool_width),指定池化窗口的大小。 可以是單個整數(shù),以為所有空間維度指定相同值。
- strides:一個整數(shù)或者2個整數(shù)的元組/列表,指定池操作的步幅。 可以是單個整數(shù),以為所有空間維度指定相同值。
- padding:字符串,“valid”或者”same”
- data_format:一個字符串,channels_last(默認(rèn))或channels_first中的一個,輸入中維度的排序,channels_last對應(yīng)于具有形狀(batch,height, width, channels)的輸入,而channels_first對應(yīng)于具有形狀(batch, channels, height,width)的輸入。
- name:層的名稱。
?
20200312
1.關(guān)于輸入數(shù)據(jù)的格式
我們要明白幾點(diǎn)內(nèi)容,當(dāng)我們用theano作為backend時候,我們在進(jìn)行卷積等一些操作時候,系統(tǒng)都會自動按照channel_first的來,比如卷積后的深度那一維放到了H,W的前面。而我們?nèi)绻胻ensorflow作為backend時候,系統(tǒng)會默認(rèn)是channel_last。你可以通過修改backend來達(dá)到你想要的效果,并且通過下面這個函數(shù)測試,你目前是什么類型:
tf.keras.backend.image_data_format()這樣就知道建立模型model的時候,input_shape()參數(shù)該怎么設(shè)置啦
?
20200313
1.關(guān)于keras模型和訓(xùn)練的可視化
1.模型可視化
關(guān)于模型的可視化,可以用keras自帶的這個模塊:plot_model
導(dǎo)入方式:
from tensorflow.keras.utils import plot_model具體的使用方式可以看博客或者b站那個視頻。
參考鏈接:https://blog.csdn.net/leviopku/article/details/81433867
2.訓(xùn)練過程可視化
關(guān)于keras訓(xùn)練過程的可視化,可以看之前寫的一篇博客。
鏈接:https://blog.csdn.net/qq_41289920/article/details/104755617
總結(jié)
以上是生活随笔為你收集整理的【机器学习】 - 关于Keras的深入理解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 马斯克疯狂输出20分钟:特斯拉不设对手
- 下一篇: 【分治】01串