Keras の使い方として layers 属性を書き換えたりするのは想定していないと思います。
すでにあるモデルの途中の層から新たに層を追加してモデルを作りたい場合は以下のようにします。
python
1 from tensorflow . keras . layers import Activation , Conv2D , Dense , Flatten , MaxPooling2D
2 from tensorflow . keras . models import Sequential , Model
3
4 # LeNetを構築する
5 model = Sequential (
6 [
7 Conv2D (
8 20 ,
9 kernel_size = 3 ,
10 padding = "same" ,
11 activation = "relu" ,
12 input_shape = ( 28 , 28 , 3 ) ,
13 ) ,
14 MaxPooling2D ( ) ,
15 Conv2D ( 50 , kernel_size = 3 , padding = "same" , activation = "relu" ) ,
16 MaxPooling2D ( ) ,
17 Flatten ( ) ,
18 Dense ( 500 , activation = "relu" ) ,
19 Dense ( 10 , activation = "softmax" ) ,
20 ]
21 )
22 model . summary ( )
23 # Model: "sequential"
24 # _________________________________________________________________
25 # Layer (type) Output Shape Param #
26 # =================================================================
27 # conv2d (Conv2D) (None, 28, 28, 20) 560
28 # _________________________________________________________________
29 # max_pooling2d (MaxPooling2D) (None, 14, 14, 20) 0
30 # _________________________________________________________________
31 # conv2d_1 (Conv2D) (None, 14, 14, 50) 9050
32 # _________________________________________________________________
33 # max_pooling2d_1 (MaxPooling2 (None, 7, 7, 50) 0
34 # _________________________________________________________________
35 # flatten (Flatten) (None, 2450) 0
36 # _________________________________________________________________
37 # dense (Dense) (None, 500) 1225500
38 # _________________________________________________________________
39 # dense_1 (Dense) (None, 10) 5010
40 # =================================================================
41 # Total params: 1,240,120
42 # Trainable params: 1,240,120
43 # Non-trainable params: 0
44 # _________________________________________________________________
45 model . compile ( loss = "categorical_crossentropy" , optimizer = "adam" , metrics = [ "accuracy" ] )
46
47 # すでにあるモデルの途中から新しいモデルを作る。
48 flatten = model . layers [ - 3 ] . output
49 print ( flatten . name )
50
51 fc1 = Dense ( 100 , activation = "relu" ) ( flatten )
52 fc2 = Dense ( 20 , activation = "softmax" ) ( fc1 )
53 new_model = Model ( inputs = model . inputs , outputs = fc2 )
54 new_model . summary ( )
55 # Model: "model"
56 # _________________________________________________________________
57 # Layer (type) Output Shape Param #
58 # =================================================================
59 # conv2d_input (InputLayer) [(None, 28, 28, 3)] 0
60 # _________________________________________________________________
61 # conv2d (Conv2D) (None, 28, 28, 20) 560
62 # _________________________________________________________________
63 # max_pooling2d (MaxPooling2D) (None, 14, 14, 20) 0
64 # _________________________________________________________________
65 # conv2d_1 (Conv2D) (None, 14, 14, 50) 9050
66 # _________________________________________________________________
67 # max_pooling2d_1 (MaxPooling2 (None, 7, 7, 50) 0
68 # _________________________________________________________________
69 # flatten (Flatten) (None, 2450) 0
70 # _________________________________________________________________
71 # dense_2 (Dense) (None, 100) 245100
72 # _________________________________________________________________
73 # dense_3 (Dense) (None, 20) 2020
74 # =================================================================
75 # Total params: 256,730
76 # Trainable params: 256,730
77 # Non-trainable params: 0
78 # _________________________________________________________________
79
80 # 再度コンパイルが必要
81 new_model . compile ( loss = "categorical_crossentropy" , optimizer = "adam" , metrics = [ "accuracy" ] )