import tensorflow as tf
from tensorflow import keras
from keras import layers
# 忽略
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
config = tf.compat.v1.ConfigProto()
config.gpu_options.allow_growth = True
session = tf.compat.v1.InteractiveSession(config=config)
class Inception(tf.keras.layers.Layer):
def __init__(self, c1, c2, c3, c4):
# 设置模块构成
super().__init__()
# 线路1:1*1 relu same c1
self.p1_1 = keras.layers.Conv2D(c1, kernel_size=1, activation='relu', padding='same')
# 线路2:1*1 relu same c2[0]
self.p2_1 = keras.layers.Conv2D(c2[0], kernel_size=1, activation='relu', padding='same')
# 线路2:3*3 relu same c2[1]
self.p2_2 = keras.layers.Conv2D(c2[1], kernel_size=3, activation='relu', padding='same')
# 线路3:1*1 relu same c3[0]
self.p3_1 = keras.layers.Conv2D(c3[0], kernel_size=1, activation='relu', padding='same')
# 线路3:5*5 relu same c3[1]
self.p3_2 = keras.layers.Conv2D(c3[1], kernel_size=5, activation='relu', padding='same')
# 线路4:max-pool 1*1
self.p4_1 = keras.layers.MaxPool2D(pool_size=3, padding='same', strides=1)
# 线路4:1*1
self.p4_2 = keras.layers.Conv2D(c4, kernel_size=1, activation='relu', padding='same')
def call(self, x):
# 前项传播过程
# 线路1
p1 = self.p1_1(x)
# 线路2
p2 = self.p2_2(self.p2_1)
# 线路3
p3 = self.p3_2(self.p3_1)
# 线路4
p4 = self.p4_2(self.p4_1)
# concat
outputs = tf.concat([p1, p2, p3, p4], axis=-1)
# Inception(64, (64, 128), (16, 32), 32)
# 辅助分类器(B4模块)
def aux_classifier(x, filter_size):
# 池化层
x = layers.AveragePooling2D(pool_size=5, strides=3, padding='same')(x)
# 卷积层
x = layers.Conv2D(filters=filter_size[0], kernel_size=1, strides=1, padding='valid', activation='relu')(x)
# 展平
x = layers.Flatten()(x)
# 全连接
x = layers.Dense(units=filter_size[1], activation='relu')(x)
# 输出层
x = layers.Dense(units=10, activation='softmax')(x)
return x
# GoogLeNet构建
# B1模块
inputs = tf.keras.Input(shape=(224, 224, 3), name='input')
# 卷积:7*7 64
x = tf.keras.layers.Conv2D(64, kernel_size=7, strides=2, padding='same', activation='relu')(inputs)
# 池化层
x = tf.keras.layers.MaxPool2D(pool_size=3, strides=2, padding='same')(x)
# B2模块
# 卷积层1*1 2 same relu
x = tf.keras.layers.Conv2D(64, kernel_size=1, padding='same', activation='relu')(x)
# 卷积层3*3
x = tf.keras.layers.Conv2D(192, kernel_size=3, padding='same', activation='relu')(x)
# 池化层
x = tf.keras.layers.MaxPool2D(pool_size=3, strides=2, padding='same')(x)
# B3模块
# Incepetion
x = Inception(64, (96, 128), (16, 32), 32)(x)
# inception
x = Inception(128, (128, 192), (32, 96), 64)(x)
# # 池化
x = tf.keras.layers.MaxPool2D(pool_size=3, strides=2, padding='same')(x)
# B4模块
# Inception
x = Inception(192, (96, 208), (16, 48), 64)(x)
# 辅助输出1
aux_output1 = aux_classifier(x, [128, 1024])
# Inception
x = Inception(160, (112, 224), (24, 64), 64)(x)
# Inception
x = Inception(128, (128, 256), (24, 64), 64)(x)
# Inception
x = Inception(112, (144, 288), (32, 64), 64)(x)
# 辅助输出2
aux_output2 = aux_classifier(x, [128, 1024])
# Inception
x = Inception(256, (160, 320), (32, 128), 128)(x)
# 最大池化
x = layers.MaxPool2D(pool_size=3, strides=2, padding='same')(x)
# B5模块
# Inception
x = Inception(256, (160, 320), (32, 128), 128)(x)
# Inception
x = Inception(384, (192, 384), (48, 128), 128)(x)
# GAP
x = layers.GlobalAvgPool2D()(x)
# 输出层
output = layers.Dense(10, activation='softmax')(x)
# 构建模型
model = tf.keras.Model(inputs=inputs, outputs=[output, aux_output1, aux_output2])
model.summary
报错:Inputs to a layer should be tensors. Got: <keras.layers.convolutional.Conv2D object at 0x0000014A8208DC60>
请问怎么解决